我已经将Spring MVC调度程序映射为上的全局前端控制器servlet /*。
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,图像等。
/res/
我如何才能访问它们?
我也遇到了这个问题,却从未找到一个好的解决方案。我最终将我的servlet映射到URL层次中的更高一级:
<servlet-mapping> <servlet-name>home</servlet-name> <url-pattern>/app/*</url-pattern> </servlet-mapping>
现在,基本上下文(和/ res目录中)的所有内容都可以由容器提供。
地图控制器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过滤器。
/pages
"/static"和/或"/pages"
init-param