wicket:根据请求将不同路径映射到同一个类,以在标记中生成不同的内容

Mar*_*Cel 0 java url seo wicket path

我开发了一个商店系统.有一个产品页面,其中列出了某些选择菜单筛选的可用项目.还有一个项目详细信息页面可以查看有关每个产品的一些内容.该页面的内容将从xml属性文件中加载.如果要单击项目列表视图中的链接,要查看某些详细信息,则会设置项目特定的GET参数.使用参数值,我可以通过更改加载的键名称从我的属性动态加载该特定项目的内容.

到目前为止这么好,但不是很好.背景太多了.让我们来了解一些细节.

最重要的是,这是一些SEO激励的东西.到目前为止,状态页面的url中的pageinstance Id也存在问题,这不仅是因为不稳定的url,还因为wicket正在执行302重定向来操作url.也许我会删除项详细信息页面的statefull组件来解决这个问题.

所以现在出售的产品上有一些QR码,其中包含指向我的详细信息页面的链接.这些链接不是我自己设计的,你可以想象,它们看起来像实际网址一样多.让我们说QR码url路径是"/ shop/item1",其中item1将是产品名称.我的页面类是ItemDetailPage.我写了一个IRequestMapper,我正在我的WebApplication#init()中安装,它解析传入的请求URL并检查它是否需要由此IRequestMapper解析.如果是这样,我使用PageProvider构建我的页面并为其返回一个requesthandler.

public IRequestHandler mapRequest(Request request) {
                if(compatibilityScore>0) {
                    PageProvider provider = new PageProvider(ItemDetailPage.class, new ItemIDUrlParam(request.getUrl().getPath().split("/")[1]));
                    provider.setPageSource(Application.get().getMapperContext());
                    return new RenderPageRequestHandler(provider);
                }
                return null;
            }
Run Code Online (Sandbox Code Playgroud)

如您所见,我构建了一个我的detailpage可以处理的参数.但结果URL不是很好.我想通过将可收起书签的内容映射到它来保留原始网址,而不进行任何重定向.我的第一个想法是实现URLCodingStrategy来以路径的形式重建URL及其参数.我认为HybridUrlCodingStrategy正在做类似的事情.在使用IRequestMapper解析URL路径"/ shop/item1 /"后,它看起来像"/ shop/item?1?id = item1",其中第一个参数偏离wicket pageinstance Id,很可能会被删除为我将重建详细信息页面为无状态:(在应用HybridURLCodingStrategy后,它可能看起来像"/ shop/item/1/id/item1"或"/ shop/item/id/item1"而没有pageinstance Id.另一个想法将是删除第二个路径部分和参数名称,只使用参数值,这样url看起来像"/ shop/item1",这是与请求中的url相同的url.

你们对这个或任何聪明的想法有经验吗?重要的是

  1. 拥有SE bot可以索引的每个产品的一个修复URL
  2. 没有参数
  3. 无国籍和可收藏
  4. 没有302以任何方式重定向.
  5. 必须为详细信息页面提供所请求项目的标识

来自德国Marcel的亲切问候

Her*_*eri 6

正如Bert所说,您的用例应该包含在正常页面安装中,另请参阅MountedMapper wiki页面,为您的案例提供一个具体示例:

mountPage("/shop/${id}", ShopDetailPage.class);
Run Code Online (Sandbox Code Playgroud)

鉴于"item1"是项目的ID(对我来说不是很清楚),您现在可以将其作为idWicket中的命名页面参数进行检索.SEO链接中常见的另一个例子,包含唯一ID和(非唯一的,不断变化的)标题:

mountPage("/shop/${id}/${title}", ShopDetailPage.class);
Run Code Online (Sandbox Code Playgroud)

关于页面实例ID,有一些方法可以摆脱它,也许最好的方法是使页面无状态,如你所说,另一个简单的方法是配置IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER为渲染策略(请参阅API文档的后果).