跟进我的一个较旧的问题,我设法让我的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中设置这些值的位置。有没有人在意澄清这一切应该如何运作?
答案 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>
标记将生成一个没有扩展名的网址...