0

我有一个 SpringMVC 应用程序,我需要创建一个控制器来处理对具有给定扩展名的文件的所有请求。

到目前为止,我有这个:

web.xml

<filter-mapping>
    <filter-name>redirectFilter</filter-name>
    <url-pattern>*.jhtml</url-pattern>
</filter-mapping>

spring-mvc.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>

调度程序 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>      

我应该如何编写控制器?

4

2 回答 2

0

我选择了最简单的方法:因为我只需要将这些 *.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>

JHTMLRedirectFilter 类

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

    }

}
于 2013-08-31T14:05:29.537 回答
0

你可以写一个@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.*被认为是等效的。如果您有一个@Controller映射到的处理程序方法/somePath,它可能会获得优先权。

使用 Java 配置,您可以声明@Configuration要扩展WebMvcConfigurationSupport和添加的类

@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {
    RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
    handlerMapping.setUseSuffixPatternMatch(false);
    return handlerMapping;
}

此设置决定

将模式匹配到请求时是否使用后缀模式匹配(“.*”)。

RequestMappingHandlerMapping您可以使用其他方法/设置来设置正确的路径。

于 2013-08-30T20:28:00.013 回答