2012-11-21 43 views
2

我正在尝试将Struts2应用程序(版本2.2.1.1)迁移到Spring MVC,并且我很难将struts.xml映射转换为SpringMVC servlet映射。Struts2排除模式 - 它究竟如何工作?

我的第一个问题是Struts2排除模式的工作原理。让我们在web.xml中我说我有一个过滤器/映射Struts2的设置如下:

<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
</filter> 

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

在我struts.xml中我有一堆的定义,其已经着手行动。现在根据我的理解,基于struts2文档 -

(从Struts 2.1.7开始,您可以提供一个逗号分隔的模式列表,当匹配 请求URL时,过滤器只会通过。通过配置选项struts.action.excludePattern在struts.xml中完成,例如) -

如果我添加一个排除模式,如:

<constant name="struts.action.excludePattern" value="/*"/> 

然后过滤器应被旁路和行动上面提到的不应该解决,更正?

由于某种原因,这种情况并未发生,我的所有行为仍然被正确地路由。

什么给?

回答

3

排除模式是一个正则表达式。

如果要排除所有内容,则需要.*

http://struts.apache.org/2.x/docs/webxml.html#web.xml-SimpleExample

我不知道到底为什么你想要的,因为你可以只取出S2过滤器。

+0

T要求你回答戴夫。我不是想排除一切,我想了解该功能的工作原理。我正在将应用程序迁移到Spring-MVC,我想并排运行Struts2/Spring-MVC。我发现我的问题实际上与我使用的struts过滤器有关。我稍后会发布详细信息。 –

0

我补充了以前的答案。您可以按here定义排除项。

但是在文档中似乎存在错误。如果你需要逃避一个点'。'你只需要使用单一的反斜杠:

<struts> 
<constant name="struts.action.excludePattern" value=".*unfiltered.*,.*\.nofilter"/> 
... 
</struts> 
5

struts的值必须遵守java.util.regex.Pattern类的标准。 http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

所以,如果你想避免一切/ REST/*例如网址:

/rest/[a-zA-Z_0-9]* 

如果您需要处理一个REST Web服务有多个参数:

/rest/[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]* 

为了测试你的模式,你可以使用下面的代码:

Pattern pattern = Pattern.compile("/rest/[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*/?[a-zA-Z_0-9]*"); 
String uri = "/rest/users/1/1"; 
System.out.println(pattern.matcher(uri).matches());