使用Spring,在web.xml中映射到root,找不到静态资源

ric*_*ver 29 model-view-controller spring tiles

我要做的是将请求映射到servlet根目录(正确的术语?).我正处于将URL映射到正确视图的位置,但无法找到作为页面一部分的所有静态内容--css,javascript,images.

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

<servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

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

@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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

我在视图层中使用Tiles.我的配置如下:

/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的GET请求] 2010-01-24 17:25:01,778 WARN [http-8080-4] servlet.DispatcherServlet(DispatcherServlet.java:962) - 找不到带URI的HTTP请求的映射[/springapp/static/css/shop.css]在名为'springapp'的DispatcherServlet中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) - 在DispatcherServlet中找不到带有URI [/springapp/static/css/offers.css]的HTTP请求的映射,名称为"springapp"2010-01-24 17:25:01,778 WARN [http-8080-3] servlet.DispatcherServlet(DispatcherServlet.java:962) - 在DispatcherServlet中找不到带有URI [/springapp/static/css/scrollable-buttons.css]的HTTP请求的映射名称"SPRI ngapp"

转到 http:// localhost:8080/springapp/shop工作正常,但缺少css和图像.

我认为使用Tiles在某种程度上使事情变得复杂但我不愿意摆脱它.我想知道我是否需要调整我的视图分辨率配置需要以某种方式调整?链接视图解析器可能吗?我只是不是那样的这样做经验丰富.

axt*_*avt 61

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

有几种方法可以解决此问题:


既然Spring 3.x中访问静态资源的首选方法是使用<mvc:resources>: web.xml:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

Spring配置:

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

另请参见Spring 3中的MVC简化


1.使用URL重写过滤器
请参见此处的mvc-basic示例

2.为defaultservlet 设置前缀:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

也就是说,请求/static/images/image.png将返回名为的文件/images/image.png 但是,这种方式在不同的servlet容器之间是不兼容的(在Jetty中不起作用),请参阅此处的变通方法

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

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

4.不要使用RESTful URL,使用带前缀的URL:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

5.不要使用RESTful URL,使用带扩展名的URL:

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)


Sol*_*ris 5

有没有人考虑使用这个:

<!-- Allows for mapping the DispatcherServlet to "/" by forwarding static resource requests to the container's default Servlet -->
<mvc:default-servlet-handler/>
Run Code Online (Sandbox Code Playgroud)

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