Model view controller 使用Spring,映射到web.xml中的根目录,静态资源不再是';找不到

Model view controller 使用Spring,映射到web.xml中的根目录,静态资源不再是';找不到,model-view-controller,spring,tiles,Model View Controller,Spring,Tiles,我试图做的是将请求映射到servlet根目录(正确的术语?)。我正处于URL映射到正确视图的位置,但是页面中的所有静态内容(css、javascript、图像)都找不到 因此,在我的web.xml中,servlet标记如下所示 <servlet-mapping> <servlet-name>springapp</servlet-name> <url-pattern>/</url-pattern> </servlet

我试图做的是将请求映射到servlet根目录(正确的术语?)。我正处于URL映射到正确视图的位置,但是页面中的所有静态内容(css、javascript、图像)都找不到

因此,在我的web.xml中,servlet标记如下所示

<servlet-mapping>
    <servlet-name>springapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
MyBaseController非常简单。看起来是这样的:

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

}
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);
}
我正在视图层中使用瓷砖。我的配置如下:

/WEB-INF/tiles-defs.xml

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

2010-01-24 17:25:01777调试[http-8080-7]servlet.DispatcherServlet (DispatcherServlet.java:690)-名为“springapp”的DispatcherServlet 正在处理[/springapp/static/css/account.css]的GET请求 2010-01-24 17:25:01778警告[http-8080-4]servlet.DispatcherServlet (DispatcherServlet.java:962)-找不到具有的HTTP请求的映射 DispatcherServlet中名为的URI[/springapp/static/css/shop.css] “springapp”2010-01-2417:25:01778调试[http-8080-6] servlet.FrameworkServlet(FrameworkServlet.java:677)-成功 已完成请求2010-01-2417:25:01778警告[http-8080-5] servlet.DispatcherServlet(DispatcherServlet.java:962)-无映射 在中找到URI为[/springapp/static/css/offers.css]的HTTP请求 名为“springapp”的DispatcherServlet 2010-01-24 17:25:01778警告 [http-8080-3]servlet.DispatcherServlet(DispatcherServlet.java:962)- 找不到URI为的HTTP请求的映射 DispatcherServlet中的[/springapp/static/css/scrollable buttons.css] 名为“springapp”

去 工作正常,但缺少css和图像


我认为使用瓷砖会使事情复杂化,但我“我不愿意摆脱它。我想知道我是否需要调整我的视图分辨率配置是否需要调整?可能是链接视图解析器?我只是没有那么丰富的经验

问题是对静态内容的请求转到dispatcherServlet,因为它被映射为
/
。在使用“RESTful”URL(即在
DispatcherServlet
映射中没有任何前缀)的应用程序中,这是一个非常常见的问题

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


自Spring3.x以来,访问静态资源的首选方法是使用
web.xml

<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping>
也就是说,请求
/static/images/image.png
将返回名为
/images/image.png
但是,这种方式在不同的servlet容器之间是不兼容的(在Jetty中不起作用),请参阅变通方法

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

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

违约
*.png
*.js
*.css
4。不要使用RESTful URL,请使用带有前缀的URL:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

springapp
/应用程序
5。不要使用RESTful URL,请使用扩展名为:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/static/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>/app</url-pattern> 
</servlet-mapping>
<servlet-mapping> 
    <servlet-name>springapp</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

springapp
*.做

作为建议的解决方案编号(2,默认servlet,不同servlet容器的行为不同)的替代方案,我建议查看SpringWebFlow项目中的资源servlet
org.springframework.js.Resource.ResourceServlet


有关更多详细信息,请查看

我也有同样的问题,但我没有使用spring,而是使用一个小筛选器将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);
    }
这可能是一个技巧,但它看起来像用一个小代码就可以很好地工作。
在这里获取更多的过滤信息

有人考虑使用这个:

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

以下是最新的spring文档:

我真正想做的是使用@RequestMapping注释和@PathVariable注释来实现RESTful URL的使用。最终,所有静态资源都将由apache提供,但这将在生产环境中进行。在本地运行时,如在开发中,我需要tomcat提供的静态资源。我以前使用过urlrewrite过滤器,我喜欢它,但我想找到另一种方法。我使用了org.tuckey.urlrewrite过滤器和上面的#4的组合。谢谢你太棒了。仅供参考,我尝试了#2,它在我的本地环境中工作,该环境在tomcat的根网站下运行。当我把它部署到一个测试服务器上,在一个名为“test”的非根站点下,它就停止了工作。出于某种原因,/test/before/static/正在抛出默认的servlet映射。刚切换到3号,它就像一个魔咒。我已经为此挣扎太久了。谢谢大家!+1@axtavt:我在访问REST时遇到类似问题,不确定是否是因为映射错误。你能帮我看看吗:谢谢!