使用Spring,映射到web.xml中的根目录,找不到静态资源

我想要做的是将请求映射到servlet根目录(正确的术语?)。 我在url映射到正确的观点,但所有的静态内容 – CSS,JavaScript,图像 – 这是页面的一部分无法find。

所以在我的web.xml中,我的servlet标签看起来像这样

<servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 

我的控制器看起来像这样:

 @RequestMapping("/shop") public class TheShopController extends MyBaseController { public static String VIEW = "Tile.Shop"; @Override @RequestMapping(method = RequestMethod.GET) protected ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp) { ModelAndView mav = new ModelAndView(VIEW); return mav; } } 

MyBaseController非常简单。 它看起来像这样:

 public abstract class MyBaseController extends AbstractController { protected Logger log = Logger.getLogger(getClass()); @Override protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception { ModelAndView mav = processRequest(req, resp); return mav; } protected abstract ModelAndView processRequest(HttpServletRequest req, HttpServletResponse resp); } 

我在我的视图层使用瓷砖。 我的configuration如下:

/WEB-INF/tiles-defs.xml

正如我所提到的,视图被发现,但是作为页面端口的静态资源却找不到。 这是一些典型的注销输出:

2010-01-24 17:25:01,777 DEBUG [http-8080-7] servlet.DispatcherServlet(DispatcherServlet.java:690) – 名称为“springapp”的DispatcherServlet处理[/springapp/static/css/account.css ] 2010-01-24 17:25:01,778 WARN [http-8080-4] servlet.DispatcherServlet(DispatcherServlet.java:962) – 找不到URI的HTTP请求映射[/springapp/static/css/shop.css]在DispatcherServlet中名为'springapp'2010-01-24 17:25:01,778 DEBUG [http-8080-6] servlet.FrameworkServlet(FrameworkServlet.java:677) – 成功完成请求2010-01-24 17:25:01,778 WARN [http-8080-5] servlet.DispatcherServlet(DispatcherServlet.java:962) – 在名为“springapp”的DispatcherServlet中,未find具有URI的HTTP请求的映射[/springapp/static/css/offers.css] 2010-01-24 17:25:01,778 WARN [http-8080-3] servlet.DispatcherServlet(DispatcherServlet.java:962) – 在名称为DispatcherServlet的HTTP请求中使用URI [/springapp/static/css/scrollable-buttons.css] “SPRI ngapp”

去http:// localhost:8080 / springapp / shop工作正常,但CSS和图像丢失。

我认为,使用瓷砖是某种复杂的东西,但我不愿意摆脱它,我想知道如果我需要调整我的视图分辨率configuration需要以某种方式tweeked?链接视图parsing器可能吗?我只是不是经验丰富。

问题是请求静态内容到dispatcherServlet,因为它被映射为<url-pattern>/</url-pattern> 。 在具有“REST风格”URL的应用程序中(即在DispatcherServlet映射中没有任何前缀),这是一个非常常见的问题。

有几种可能的方法来解决这个问题:


自Spring 3.x以来,访问静态资源的首选方法是使用<mvc:resources> web.xml

 <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 

弹簧configuration:

 <!-- Handles GET requests for /resources/** by efficiently serving static content in the ${webappRoot}/resources dir --> <mvc:resources mapping="/resources/**" location="/resources/" /> 

另请参见Spring 3中的MVC简化


1.使用URL重写filter
请参阅mvc-basic示例

2.为default servlet设置一个前缀:

 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping> 

也就是说,对/statichttp://img.dovov.comimage.png请求将返回名为http://img.dovov.comimage.png的文件。但是,这种方法在不同的servlet容器之间是不兼容的(在Jetty中不起作用),请参阅此处的解决方法

3.为default servlet设置静态内容扩展:

 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> <url-pattern>*.js</url-pattern> <url-pattern>*.css</url-pattern> </servlet-mapping> 

4.请勿使用RESTful URL,请使用带有前缀的URL:

 <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>/app</url-pattern> </servlet-mapping> 

5.请勿使用RESTful URL,请使用带有扩展名的URL:

 <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 

有没有人考虑使用这个:

 <!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet --> <mvc:default-servlet-handler/> 

下面是最新的春季文档: http : //static.springsource.org/spring/docs/3.1.2.RELEASE/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-default-servlet -handler

作为build议的解决scheme编号(2,默认的servlet,其行为与servlet容器到servlet容器的行为不同)的替代scheme,我build议从Spring Webflow项目中查看Resource Servletorg.springframework.js.resource.ResourceServlet ) 。

有关更多详细信息,请参阅如何处理Spring MVC中的静态内容?

我有同样的问题,而不是使用spring,我做我的一个小的filter,redirect到我的起始页如此:

  HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String pageName = req.getServletPath(); if(pageName.equals("/")) { res.sendRedirect( req.getContextPath() + "/start" ); } else { chain.doFilter(request, response); } 

这也许是一个窍门,但它看起来像一个小代码工作正常。 去这里获取更多的filter信息http://www.oracle.com/technetwork/java/filters-137243.html

Interesting Posts