springMVC 解决无法读取css、js等静态资源

来源:互联网 发布:淘宝封号支付宝花呗 编辑:程序博客网 时间:2024/04/26 06:09

最近使用spring mvc,做demo的时候好好的,${message}也能正常把ModelAndView中的键值对拿出来,但是有一个问题就是css、js、swf等静态文件读取不了,百度呗,问题描述和解决办法如下,看官别急,我先说一句,这些办法没有完全解决我的问题,静态资源还是读不到,慢慢看嘛。
首先说我的代码注解:

@Controllerpublic class ViewController {    @RequestMapping("/init/{pageId}")    public ModelAndView initView(@PathVariable("pageId")String pageId){        ModelAndView mv = new ModelAndView();        mv.setViewName(pageId);        return mv;    }    @RequestMapping("/update/{pageId}")    public void updateView(@PathVariable("pageId")String pageId            , HttpServletResponse response){                // TODO Auto-generated catch block    }}

这样的url使得我的初始化界面的访问路径为:http://localhost:8080/init/default,当我的web.xml中配置为如下时,就不能加载那些静态文件,顺便说一句,我的css、js这些资源放在WEB-INF下的一个文件夹里,而且没有和jsp文件放在一起,(这你就知道我同时犯了几个错误了),好的,我们开始debug。

<servlet>    <servlet-name>MVCDEMO</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name> MVCDEMO </servlet-name>    <url-pattern>/</url-pattern>  </servlet-mapping>

以下常规解决办法内容均来自大家的技术博客。
问题原因1:静态资源不能放在WEB-INF下,WEB-INF文件夹中的资源是只有服务器端才能访问的,客户端不能够访问到这个文件夹下的东西,所以如下图,虽然css资源的url完全正确,但是返回还是404。
访问静态资源报错
问题原因2:/这一句会让DispatcherServlet捕获所有的http请求,让我们看看加载一个网页的时候一共要发送多少个请求给服务器,如下图:
发送多个http请求
大家可以看到,我们加载了一个网页http://localhost:8080/init/default.do,实际上浏览器向服务器发出了多条http请求,除了我们看的见的那条外,其他的都是请求静态资源css、js什么的,这时候DispatcherServlet就会连这些url一并捕获,但是又找不到对应的RequestMapping,所以就报错了,所以我们在web.xml中把/改成*.do,这样css这些静态资源的url就不会被捕获了,如下。

<servlet>    <servlet-name> MVCDEMO </servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name> MVCDEMO </servlet-name>    <url-pattern>*.do</url-pattern>  </servlet-mapping>

我如上修改了,然而这并没有什么卵用,查看日志,报如下错:

 [30/Jun/2015:20:17:00+0800] "GET/init/module/jquery-easyui-1.3.2/themes/icon.css HTTP/1.1" 404 1045

问题原因3:url居然是/init/module/jquery-easyui-1.3.2/themes/icon.css,可是我期望的url里并没有“/init”,细看jsp中的语句:

<link rel="stylesheet" type="text/css" href="/module/jquery-easyui-1.3.2/themes/default/easyui.css">

好吧难怪,因为我是在http://localhost:8080/init/default.do中请求css,default被定义为参数,所以此页面的css请求url就会被拼接到http://localhost:8080/init/之后,问题找到后,修改就很简单了,修改上述语句如下:

<link rel="stylesheet" type="text/css" href="${base}/module/jquery-easyui-1.3.2/themes/default/easyui.css">

然后就美美哒!

0 0
原创粉丝点击