Tapestry 5 - 从URL中分离页面类名

时间:2013-12-10 14:19:20

标签: java webserver tapestry

是否存在任何烘焙方式或已建立的Tapestry模式,以将页面类的名称与呈现它的URL分离?

我的具体问题是我在英文代码库中有一个页面类,但我希望这些网址是另一种语言。

例如,Hello.java页面应该可以从 www.example.com/hola 而非标准 www.example.com/hello 访问 - 虽然这两个URL都可以正常工作,但这很好。

理想情况下,我希望像注释一样为每个单独的页面类配置不同的URL名称。

我可以自己解决这个问题,我可以通过网页地图类名称和自定义RequestFilter来解决这个问题,以便对每个请求进行映射 - 但我不想重新发明轮子有一种实用的方式或更好的模式,任何人都可以建议吗?

2 个答案:

答案 0 :(得分:1)

Tapestry有一个LinkTransformer但我总是发现API缺乏,因为你无法访问默认行为。 Igor撰写了一篇关于LinkTransformer API here

的博客文章

我总是发现有必要修饰ComponentEventLinkEncoder,以便我可以访问默认行为并进行调整。有关调整默认行为并对URL执行某些字符串操作的示例,请参阅ModeComponentEventLinkEncoder.javaAppModule.java

蒂亚戈创建了一个网址重写器api here,但我自己从未使用过它。我非常确定他的解决方案是基于为出站URL装饰ComponentEventLinkEncoder和为入站URL装饰RequestFilter。

答案 1 :(得分:1)

Tynamo的tapestry-routing可以帮到你。这取决于您希望如何生成指向www.example.com/hola和www.example.com/hello

的链接

@At注释每页仅允许一条路线,但您可以通过AppModule提供所需的所有路线,如下所示:

@Primary
@Contribute(RouteProvider.class)
public static void addRoutes(OrderedConfiguration<Route> configuration, ComponentClassResolver componentClassResolver) {
    String pageName = componentClassResolver.resolvePageClassNameToPageName(Home.class.getName());
    String canonicalized = componentClassResolver.canonicalizePageName(pageName);
    configuration.add("home1", new Route("/home1", canonicalized));
    configuration.add("home2", new Route("/home2", canonicalized));
    configuration.add("home3", new Route("/home3", canonicalized));
    configuration.add("home4", new Route("/home4", canonicalized));
    configuration.add("hola", new Route("/hola", canonicalized)); // the last one is going to be use by default to create links to the page
}

路由是有序的,默认情况下,最后一个路由将用于生成链接。 目前无法避免使用默认路由生成链接。