我有一个SpringMVC应用程序,我需要创建一个能够处理对具有给定扩展名的文件的所有请求的控制器。
到目前为止,我有这个:
web.xml
<filter-mapping>
<filter-name>redirectFilter</filter-name>
<url-pattern>*.jhtml</url-pattern>
</filter-mapping>
springmvc.xml
<bean id="anotherViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver" >
<property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jhtml"/>
</bean>
Dispatcher Servlet
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>
我应该如何编写控制器?
您可以编写类似的@Controller
方法
@RequestMapping(value = "**/*.jhtml")
public String handleExtensionRequest() {
return "viewName";
}
这将映射到类似的路径
www.yourhost.com/abc/somePath.jhtml
www.yourhost.com/abc/asdasdasd/qweqwe1231/12312312/somePath.jhtml
沿着任意数量的子路径。
问题是/abc/somePath
和/abc/somePath.*
被认为是等价的。如果您有一个映射到/somePath
的@Controller
处理程序方法,它可能会获得优先级。
使用Java配置,您可以声明一个@Configuration
类来扩展WebMvcConfigurationSupport
并添加
@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
return handlerMapping;
}
此设置决定
将模式匹配到时是否使用后缀模式匹配(".*")请求。
RequestMappingHandlerMapping
还有其他方法/设置,您可以使用它们来设置正确的路径。
我选择了最简单的方法:因为我只需要将这些*.jhtml请求重定向到其他地方,所以我为它们添加了一个过滤器。
web.xml
<filter>
<description>Filter for *.jhtml requests</description>
<display-name>jhtmlRedirectFilter</display-name>
<filter-name>jhtmlRedirectFilter</filter-name>
<filter-class>com.mycompany.JHTMLRedirectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jhtmlRedirectFilter</filter-name>
<url-pattern>*.jhtml</url-pattern>
</filter-mapping>
JHTML直接过滤器类
public class JHTMLRedirectFilter implements Filter {
private static final Logger logger = Logger.getLogger(JHTMLRedirectFilter.class);
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// Some logic here
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}