如何在 /* 上映射全局前端控制器 servlet 时访问静态资源

2022-08-31 16:14:42

我已将 Spring MVC 调度程序映射为 上的全局前端控制器 servlet。/*

<servlet>       
  <servlet-name>home</servlet-name>         
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     
</servlet>  
<servlet-mapping>       
  <servlet-name>home</servlet-name>         
  <url-pattern>/*</url-pattern>     
</servlet-mapping>

但是,此映射会停止访问文件夹中的静态文件,如CSS,JS,图像等。/res/

无论如何,我该如何访问它们?


答案 1

将控制器 servlet 映射到一个更具体的类似上,将静态内容放在一个特定的文件夹中,并创建一个侦听,该侦听透明地继续任何静态内容的链,并将其他内容的请求分派到控制器 servlet。url-pattern/pages/*/staticFilter/*

简而言之:

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/pages/*</url-pattern>
</servlet-mapping>

在过滤器中包含以下内容:doFilter()

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/static")) {
    chain.doFilter(request, response); // Goes to default servlet.
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

不,这不会在浏览器地址栏中结束。它是完全透明的。如有必要,您可以制作和/或过滤器。/pages"/static""/pages"init-param


答案 2

Spring 3.0.4.RELEASE及更高版本中,您可以使用

<mvc:resources mapping="/resources/**" location="/public-resources/"/>

春季参考所示。


推荐