我正在将tapestry从5.2.4升级到5.3.8,并坚持重新实现URL重写部分。
在我的应用程序中,用户帐户可以有多个数据存储。用户可以同时激活不同商店的同一页面。因此,我需要将storeId放在页面链接和事件链接URL中。所以做的如下。
我在MyLinkTransformerClass
注册AppModule
,如下所示。
@Contribute(PageRenderLinkTransformer.class)
@Primary
public static void provideURLRewriting( OrderedConfiguration<PageRenderLinkTransformer> configuration){
configuration.addInstance(
"Faces", MyLinkTransformer.class);
}
以下是实现MyLinkTransformer
PageRenderLinkTransformer
类
public PageRenderRequestParameters decodePageRenderRequest(
Request request) {
// for incoming requests - remove the store id from URL and
// save into Request as an attribute
String path = request.getPath();
if (path.equals("/")) {
// Redirect to accounts page
return new PageRenderRequestParameters("account", new EmptyEventContext(), false);
}
else {
String start = path.split("/")[1];
if (!ignoredRewriteSet.contains(start) && !start.startsWith("account")) {
String storePath = path.substring(1).substring(path.indexOf("/"));
int idx = storePath.indexOf("/");
if (idx < 0) idx = storePath.length();
String storeId = storePath.substring(0, idx).trim();
RequestHelper.setStoreId(request, storeId);
EventContext urlEventContext = new URLEventContext(contextValueEncoder, new String[]{storeId});
EventContext arrayEventContext = new ArrayEventContext(typeCoercer, "foo");
return new PageRenderRequestParameters(storePath.substring(idx), arrayEventContext, false);
//return new PageRenderRequestParameters(storePath.substring(idx), new EmptyEventContext(), false);
}
}
return null;
}
public Link transformPageRenderLink(
Link defaultLink,
PageRenderRequestParameters parameters) {
// for outgoing requests- This is where I want to access the store Id
// which is stored in Request class of Tapestry as an attribute and
// add it to the URL
return null;
}
因此,我们的想法是在decodePageRenderRequest
方法中从URL中删除storeId,并将其作为属性保存在Tapestry的Request
类中。在创建页面链接和事件链接的传出URL时,我想访问保存在Request中的storeId,并将其注入到将在方法transformPageRenderLink
中呈现的URL。
但我不知道如何将参数传递给transformPageRenderLink
方法或访问那里的Request
个实例。
我正在关注http://blog.tapestry5.de/index.php/2010/09/06/new-url-rewriting-api/示例。 我是URL重写的新手,对此的任何帮助都将不胜感激。
答案 0 :(得分:1)
您可能会对ModeComponentEventLinkEncoder here感兴趣。它从URL中删除“模式”并将其放到Environment上,然后再将其传递给正常的tapestry URL处理。
这是一个双向过程,因此“模式”包含在页面上生成的任何链接中。
注意:这适用于装饰器here