java - Struts 1.x 和 Struts 2.x 的 URL 模式问题

标签 java regex struts2 xml-configuration deployment-descriptor

我的一个项目正在 Struts 1.x 上运行,我们正在尝试在 Struts 2.x 上集成一些 URL 模式。很少有 URL 也以 Abc.do 结尾。

当前 web.xml 如下所示:

<servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
</servlet>

<servlet-mapping>
      <servlet-name>action</servlet-name>
      <url-pattern>*.do</url-pattern>
</servlet-mapping>

以上模式按照 web.xml 中的定义工作正常。

现在我们在 web.xml 中添加了支持 Struts 2.x 并行的功能。

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

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

web.xml 中添加上述信息后,这些 URL 模式以 .action 结尾,它们在使用 struts 2.x 时也可以正常工作。

但是当我们想要添加一些也以 .do 结尾的特定 URL 模式映射到 Struts 2.x 时,如下所示。

<filter-mapping>
         <filter-name>struts2</filter-name>
         <url-pattern>/Hello.do</url-pattern>
</filter-mapping>

我们希望所有以 Hello*.do 开头的请求都应该映射到 struts 2.x 上,但现在这还没有发生。

所以,web.xml 中缺少某些内容,或者总的来说,这是不可能的。

我们有什么办法可以解决这个问题吗?

最佳答案

首先,您应该定义 Struts2 过滤器并让它映射所有 URL,包括 /Hello*.do 模式和 *.action 模式。然后是映射 *.do 的 Struts 1 过滤器。 struts.xml 应配置为排除以 .do 结尾的模式(/Hello*.do 除外)。

struts.xml:

<constant name="struts.action.excludePattern" value="(?!/Hello.*).*\.do"/>
<constant name="struts.action.extension" value="action,do,,"/>

web.xml:

<!-- Struts2 configurations -->
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

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

<!-- Struts configurations -->
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

关于java - Struts 1.x 和 Struts 2.x 的 URL 模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25850234/

相关文章:

regex - 如何重新定义\s以匹配下划线?

java - Struts2 操作可以使用反斜杠,但不能没有反斜杠

java - Decorator模式链式方法如何调用?

java - Neo4j java遍历api对象映射

javascript - 重复时未捕获的组角色?

java - 创建.htaccess

java - 有什么办法可以避免这段代码中重复属性吗?

java - serialVersionUID = 1L 比生成串行版本 id 更好吗?

java - Micronaut 和 Java Mail API

RegEx 使用 Notepad++ 排除行