java - 在/*上映射全局前端 Controller servlet时如何访问静态资源

标签 java servlets resources

我已将 Spring MVC 调度程序映射为 /* 上的全局前端 Controller 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、图像等静态文件的访问。

我怎样才能访问它们?

最佳答案

将 Controller servlet 映射到更具体的 url-pattern 上,例如 /pages/*,将静态内容放在特定文件夹中,例如 /static 并创建一个 Filter 监听 /* 透明地继续任何静态内容的链并将请求分派(dispatch)到 Controller 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

关于java - 在/*上映射全局前端 Controller servlet时如何访问静态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/870150/

相关文章:

java - 无法从包中加载图像

.net - 在哪里可以找到学习 XAML 的好资源?

java - 处理大数据对象,应该释放Clob吗?

java - Spring 的 AntPathMatcher 与 linux 路径的匹配行为

java - 为什么我的 servlet 不能在 TomCat 6.0.18 上加载但在 5.5 上可以正常加载

java - Spring:Servlet 3.1 + SockJS = 必须启用异步支持

java - 使用 Orbeon XForms 将表单提交(发布)到 Java Servlet

基于 Java 的增强现实框架?

java - ListView 到字符串数组

java - java中批量插入二叉树