将UrlRewriteFilter和struts 2与get参数组合在一起

时间:2009-02-11 13:44:21

标签: java java-ee url-rewriting struts2 model-driven

跟进我的一个较旧的问题,我设法让我的struts项目的URL重写工作有点正确,其中search?q=blah之类的网址转换为查询search.action?q=blah。我们使用UrlRewriteFilter来实现此目的。这似乎向struts转发(如果确保它具有FORWARD的过滤器映射),但是当ParametersIntercepter运行时,它似乎捕获每个参数两次,并在其间添加逗号。以下是:

search.action?q=blah

将Criteria对象上的参数q(请参阅参考资料)设置为:

[ blah, blah ]

使用ModelDriven<Criteria>设置参数其中Criteria是一个简单类,其中包含要从GET字符串设置的一组属性。

我无法解释为什么会这样。有没有人见过这样的东西?我对过滤器/拦截器做错了吗?

编辑:似乎ParametersInterceptor只是设置ActionContext对象中包含的参数。我不确定(并且没有看到任何指示的调试消息)在ActionContext中设置这些值的位置。有没有人在意澄清这一切应该如何运作?

2 个答案:

答案 0 :(得分:0)

我没有解决上面的奇怪行为,但我设法在网址重写中发现错误,网页没有被重定向到'mySearch.action'而是'mySearch.action?'。现在使用url重写固定规则并且不包括查询参数似乎工作正常。

编辑: 我最终追溯到urlrewritefilter被设置为侦听REQUEST和FORWARD的问题。显然这会导致GET参数被解析两次。然而,我仍然不包括查询参数(因为这通常会使事情混淆),所以这可能无法完全解决问题。这是最可能的罪魁祸首。

特别是,我的过滤器映射现在看起来像:

<filter-mapping>
     <filter-name>UrlRewriteFilter</filter-name>
     <url-pattern>/*</url-pattern>
     <dispatcher>REQUEST</dispatcher>
</filter-mapping>

答案 1 :(得分:0)

如果您可能仍然对额外的信息感兴趣,您是否知道最新版本的Struts2(即2.1。?)不会将扩展名.action强加给您的操作?事实上,你根本不需要任何扩展!

如果我的回忆对我有用,唯一的要求是,在web.xml中,您将Struts2过滤器(org.apache.struts2.dispatcher.FilterDispatcher)映射到url-pattern:/*

<filter-mapping>
   <filter-name>action2</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

从那时起,在扩展名为空的网页上显示的<s:url>标记将生成一个没有扩展名的网址...