一尘不染

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

java

我已经将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>

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

我如何才能访问它们?


阅读 529

收藏
2020-03-01

共2个答案

一尘不染

我也遇到了这个问题,却从未找到一个好的解决方案。我最终将我的servlet映射到URL层次中的更高一级:

<servlet-mapping>       
  <servlet-name>home</servlet-name>             
  <url-pattern>/app/*</url-pattern>     
</servlet-mapping>

现在,基本上下文(和/ res目录中)的所有内容都可以由容器提供。

2020-03-01
一尘不染

地图控制器servlet在一个更具体的url-pattern喜欢/pages/,放像一个特定的文件夹的静态内容/static和创建Filter上收听/透明地继续链中的任何静态内容和调度请求到控制器servlet的其他内容。

简而言之:

<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过滤器。

2020-10-15