Model view controller 使用Spring,映射到web.xml中的根目录,静态资源不再是';找不到
我试图做的是将请求映射到servlet根目录(正确的术语?)。我正处于URL映射到正确视图的位置,但是页面中的所有静态内容(css、javascript、图像)都找不到 因此,在我的web.xml中,servlet标记如下所示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-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时遇到类似问题,不确定是否是因为映射错误。你能帮我看看吗:谢谢!