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

MyLinkTransformerclass
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的Requestclass中作为一个属性。在创建页面 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