0

我同时配置了 Struts 2 和 Spring MVC。我的web.xml样子如下。当我点击 REST URL 上传文件时,它调用 struts 调度程序而不是 Spring。

为什么 URL/rest/uploadfile/iec9.pdf要去 Struts Dispatcher?

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>

 
4

2 回答 2

2

您的 spring MVC 调度程序 servlet 映射到由 Struts 过滤器处理的 URL 子集。就在任何其他 servlet 之前调用的过滤器而言,它将具有优先权。要解决此问题,您需要将 Struts 配置为从映射中排除某些 URL。

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

</struts>  
于 2013-04-09T11:52:42.867 回答
1

添加到 Roman 的回答中,在同一个项目中配置 Struts 和 Spring MVC 时,通常使用 struts exclude 过滤器。当发出请求时,Struts 将尝试处理请求,当它被排除时,Spring MVC 将接管并处理请求。值得注意的是,Struts 的排除过滤器可以放在一个属性文件中,例如一个 struts.properties。通常可以在此处使用 Regex 以排除常用短语(例如,如果类中的所有操作或控制器共享一个公共部分,则可以使用 Regex 排除所有操作)。

于 2019-01-07T16:25:58.810 回答