29

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

所以在我的 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);
}

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

/WEB-INF/tiles-defs.xml

正如我所提到的,可以找到视图,但找不到作为页面端口的静态资源。以下是一些典型的注销:

2010-01-24 17:25:01,777 调试 [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 调试 [http-8080-6] servlet.FrameworkServlet (FrameworkServlet.java:677) - 成功完成请求 2010-01-24 17:25:01,778 警告[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) - 在名为“springapp”的 DispatcherServlet 中找不到具有 URI [/springapp/static/css/scrollable-buttons.css] 的 HTTP 请求的映射

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

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

4

4 回答 4

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>

弹簧配置:

<!-- 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 重写过滤
参见mvc-basic示例

default2. 为servlet设置前缀:

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

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

default3. 为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>
于 2010-01-25T02:56:12.690 回答
5

有没有人考虑过使用这个:

<!-- 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 -处理程序

于 2012-09-04T13:35:12.193 回答
4

作为建议的解决方案编号(2,默认 servlet,其行为因 servlet 容器与 servlet 容器不同)的替代方案,我建议查看 Spring Webflow 项目中的Resource Servlet ( org.springframework.js.resource.ResourceServlet)。

有关更多详细信息,请查看如何在 Spring MVC 中处理静态内容?

于 2010-04-21T12:38:14.807 回答
1

我有同样的问题,但我没有使用 spring,而是使用 mysefl 一个小过滤器,将 root 重定向到我的起始页面,如下所示:

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

这可能是一个技巧,但看起来使用小代码可以正常工作。转到此处了解更多过滤器信息http://www.oracle.com/technetwork/java/filters-137243.html

于 2012-07-09T07:25:55.063 回答