我配置了 Struts 2 和 Spring MVC。我的
web.xml
如下所示:
web.xml
:
<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>
<servlet>
<servlet-name>springmvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc-dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>jsonpCallbackFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>jsonpCallbackFilter</filter-name>
<url-pattern>*.json</url-pattern>
</filter-mapping>
当我点击 REST URL 上传文件时,它会调用 Struts Dispatcher 而不是 Spring。
为什么 URL
/rest/uploadfile/iec9.pdf
会转到 Struts Dispatcher?
您的 spring MVC 调度程序 servlet 映射到由 Struts 过滤器处理的 URL 子集。就过滤器在任何其他 servlet 之前调用而言,它将具有优先权。要解决此问题,您需要配置 Struts 以从映射中排除某些 URL。
<struts>
<constant name="struts.action.excludePattern" value="/rest/?.*"/>
...
</struts>
补充Roman的答案,在同一个项目中配置Struts和Spring MVC时,通常使用struts排除过滤器。当请求发出时,Struts 会尝试处理该请求,当排除时,Spring MVC 将接管并处理该请求。值得注意的是,Struts 排除过滤器可以放在属性文件中,例如 struts.properties。通常可以在此处使用正则表达式来排除常见短语(例如,如果类中的所有操作或控制器共享一个公共部分,则可以使用正则表达式排除所有操作或控制器)。