spring 关于引入js、css文件问题

来源:互联网 发布:snh 知乎 编辑:程序博客网 时间:2024/06/04 17:11

最近项目中遇到引入JS文件失败,页面调式发现404错误,提示找不到引入文件,之前对这一部分一知半解,为此现在查看了很多资料和书籍,网上参考如下:

http://www.cnblogs.com/shinejaie/p/5258630.html
http://blog.csdn.net/taijianyu/article/details/44672035
http://blog.csdn.net/sbangm/article/details/41722559

http://blog.csdn.net/fujiakai/article/details/52504525


仔细看完了一些资料以后算是理解了它的一些原理和使用方式:(下面大部分粘贴自别人的博客,加入少许自己的理解。上面链接第四个,讲解的很详细,请尊重原创)

spring mvc 静态资源 404问题(注意 最好不要把静态文件放在在WEB_INF下面,第1,2种方法不能访问,第三种可以访问)

在web.xml配置servlet-mapping的时候,如果url-pattern设置为“/” (如下),很多人都会遇到导入js,css,图片等静态资源出现Firefox调试窗口会报出的404错误,而你的确也不能访问那些资源。

此处说的web.xml中配置代码如下:

<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


方法1. 修改web.xml文件,增加对静态资源的url映射,要加在org.springframework.web.servlet.DispatcherServlet的前面

如:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

在web.xml中添加好配置后,在jsp页面就可以引用这些静态资源了

<script type="text/javascript" src="static/js/1.js"></script>

这里还需要说明的是:这种方法不能访问WEB-INF目录下的静态资源,也就是js目录必须是web根(可能是webapp,webContent等)目录下,否则是不能引用的;

如果放在WEB-INF目录下,即使你使用<c:url value=“/WEB-INF/js/jquery.js”>也是会出现404错误的。

百度时发现:以下各容器的default servlet名字,而且还提到静态资源servlet映射需要写在dispatcherServlet的前面;我在Jboss-eap-5.1中测试过,前后没有关系;所以可能是容器或者版本的关系吧。

Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字  -- "FileServlet"
WebSphere  默认 Servlet的名字 -- "SimpleFileServlet" 


方法2.在相应的 -servlet.xml中添加spring配置<mvc:default-serlvet-handler>

如:

<mvc:default-servlet-handler/>

这种方法只需要添加一行代码,在jsp页面中引用时和方法1一样,同样也不能引用WEB-INF下的资源。


方法3.使用spring 3.0.4的新特性,在相应的 -servlet.xml中添加配置<mvc:resource>

如:

3.1 <mvc:resources location="/js/" mapping="/js/**" />

3.2 <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

这种方法我写了两个配置,不同的地方只是location的值,一个是“/js/”,一个是“/WEB-INF/js/”;两种都可以,根据你自己的目录结构来引用。这就说明使用这种方式可以引用WEB-INF目录下的静态资源;这里的mapping属性的值用了ant的通配符方式,"/js/**"(两个"*") 指location的值所表示的目录以及所有子目录;但是在jsp页面中引用时需要注意:加<mvc:resources...前,要加上<mvc:annotation-driver/>,否则servlet控件器会解析失败


方法4 直接在web.xml中设置spring mvc的过滤路径

 <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup><!-- 大于等于0启动时加载此框架 -->
  </servlet>
  <servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

-------------------------------------------------------------------------处理方法完结-------------------------------------------------------------------------


补充说明:多个HandlerMapping的执行顺序问题:


DefaultAnnotationHandlerMapping的order属性值是:0
<mvc:resources/ >自动注册的 SimpleUrlHandlerMapping的order属性值是: 2147483646

<mvc:default-servlet-handler/>自动注册 的SimpleUrlHandlerMapping 的order属性值是: 2147483647


spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。


访问一个图片,还要走层层匹配。不知性能如何?

最后再说明一下,方法1方法3在访问静态资源时,如果有匹配的总拦截器(即web.xml中:<url-pattern>/</url-pattern>),就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。那么还是有后缀方便。




0 0
原创粉丝点击