Tapestry5:URL重写:将参数传递给transformPageRenderLink方法

时间:2015-05-15 12:30:54

标签: java url-rewriting tapestry

我正在将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重写的新手,对此的任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可能会对ModeComponentEventLinkEncoder here感兴趣。它从URL中删除“模式”并将其放到Environment上,然后再将其传递给正常的tapestry URL处理。

这是一个双向过程,因此“模式”包含在页面上生成的任何链接中。

注意:这适用于装饰器here