Tapestry5:URL 重写:将参数传递给 transformPageRenderLink 方法
Tapestry5 : URL Re-writing : Pass parameters to transformPageRenderLink method
我正在将 Tapestry 从 5.2.4 升级到 5.3.8,并且一直在重新实现 URL 重写部分。
在我的应用程序中,一个用户帐户可以有多个数据存储。用户可以同时激活不同商店的同一页面。因此,我需要将 storeId 放在页面 links 和事件 links URLs 中。所以做了如下。
我在AppModule
中注册MyLinkTransformerClass
如下
@Contribute(PageRenderLinkTransformer.class)
@Primary
public static void provideURLRewriting( OrderedConfiguration<PageRenderLinkTransformer> configuration){
configuration.addInstance(
"Faces", MyLinkTransformer.class);
}
以下是实现PageRenderLinkTransformer
的MyLinkTransformer
class
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
class中作为一个属性。在创建页面 link 和事件 link 的传出 URL 时,我想访问保存在 Request 中的 storeId 并将其注入将要呈现的 URL在方法 transformPageRenderLink
.
中
但我不知道如何将参数传递给 transformPageRenderLink
方法或在那里访问 Request
实例。
我正在遵循 http://blog.tapestry5.de/index.php/2010/09/06/new-url-rewriting-api/ 示例。
我是 URL 重写的新手,如有任何帮助,我们将不胜感激。
在将 ModeComponentEventLinkEncoder here. It removes a "mode" from the URL and puts it onto the Environment 传递给正常的挂毯 URL 处理之前,您可能会对它感兴趣。
这是一个双向过程,因此 "mode" 包含在页面上生成的任何链接中。
注意:这是作为装饰器应用的here
我正在将 Tapestry 从 5.2.4 升级到 5.3.8,并且一直在重新实现 URL 重写部分。
在我的应用程序中,一个用户帐户可以有多个数据存储。用户可以同时激活不同商店的同一页面。因此,我需要将 storeId 放在页面 links 和事件 links URLs 中。所以做了如下。
我在AppModule
中注册MyLinkTransformerClass
如下
@Contribute(PageRenderLinkTransformer.class)
@Primary
public static void provideURLRewriting( OrderedConfiguration<PageRenderLinkTransformer> configuration){
configuration.addInstance(
"Faces", MyLinkTransformer.class);
}
以下是实现PageRenderLinkTransformer
MyLinkTransformer
class
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
class中作为一个属性。在创建页面 link 和事件 link 的传出 URL 时,我想访问保存在 Request 中的 storeId 并将其注入将要呈现的 URL在方法 transformPageRenderLink
.
但我不知道如何将参数传递给 transformPageRenderLink
方法或在那里访问 Request
实例。
我正在遵循 http://blog.tapestry5.de/index.php/2010/09/06/new-url-rewriting-api/ 示例。 我是 URL 重写的新手,如有任何帮助,我们将不胜感激。
在将 ModeComponentEventLinkEncoder here. It removes a "mode" from the URL and puts it onto the Environment 传递给正常的挂毯 URL 处理之前,您可能会对它感兴趣。
这是一个双向过程,因此 "mode" 包含在页面上生成的任何链接中。
注意:这是作为装饰器应用的here