`
windelk
  • 浏览: 14927 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

【转载】web.xml出现中<servlet-name>default</servlet-name>的作用

阅读更多

转自:http://blog.csdn.net/wxwzy738/article/details/19072909

在web.xml文件中经常看到这样的配置<servlet-name>default</servlet-name>,这个配置的作用是:对客户端请求的静态资源如图片、JS文件等的请求交由默认的servlet进行处理,如下所示:

 

[html] view plain copy
 
  1. <servlet-mapping>  
  2. <servlet-name>default</servlet-name>  
  3. <url-pattern>*.jpg</url-pattern>  
  4. </servlet-mapping>  
  5. <servlet-mapping>  
  6. <servlet-name>default</servlet-name>  
  7. <url-pattern>*.png</url-pattern>  
  8. </servlet-mapping>  
  9. <servlet-mapping>  
  10. <servlet-name>default</servlet-name>  
  11. <url-pattern>*.gif</url-pattern>  
  12. </servlet-mapping>  
  13. <servlet-mapping>  
  14. <servlet-name>default</servlet-name>  
  15. <url-pattern>*.ico</url-pattern>  
  16. </servlet-mapping>  
  17. <servlet-mapping>  
  18. <servlet-name>default</servlet-name>  
  19. <url-pattern>*.gif</url-pattern>  
  20. </servlet-mapping>  
  21. <servlet-mapping>  
  22. <servlet-name>default</servlet-name>  
  23. <url-pattern>*.js</url-pattern>  
  24. </servlet-mapping>  
  25. <servlet-mapping>  
  26. <servlet-name>default</servlet-name>  
  27. <url-pattern>*.css</url-pattern>  
  28. </servlet-mapping>  

 

下面是从http://elf8848.iteye.com/blog/875830中摘录的一些资料

 

如何你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。

如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。

我们要解决这个问题。

 

目的:可以正常访问静态文件,不可以找不到静态文件报404。

 
方案一:激活Tomcat的defaultServlet来处理静态文件

[html] view plain copy
 
  1. <servlet-mapping>     
  2.     <servlet-name>default</servlet-name>    
  3.     <url-pattern>*.jpg</url-pattern>       
  4. </servlet-mapping>      
  5. <servlet-mapping>         
  6.     <servlet-name>default</servlet-name>      
  7.     <url-pattern>*.js</url-pattern>      
  8. </servlet-mapping>      
  9. <servlet-mapping>          
  10.     <servlet-name>default</servlet-name>         
  11.     <url-pattern>*.css</url-pattern>        
  12. </servlet-mapping>      
  13. 要配置多个,每种文件配置一个     

 

要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。

 

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

 

方案二: 在spring3.0.4以后版本提供了mvc:resources ,  使用方法:

[html] view plain copy
 
  1. <!-- 对静态资源文件的访问 -->      
  2. <mvc:resources mapping="/images/**" location="/images/" />    

 

/images/**映射到ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache 
 
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。 
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

 

使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
否则无法处理static resources request.

 

 

方案三 ,使用<mvc:default-servlet-handler/>

[html] view plain copy
 
  1. <mvc:default-servlet-handler/>    

 

会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler处理并返回.
DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

 

 

补充说明:多个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 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。

 

 

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

最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

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

分享到:
评论

相关推荐

    FCK在线编辑器源码及部署项目引用示例

    4.将以下代码添加到web.xml配置文件中: &lt;servlet&gt; &lt;servlet-name&gt;Connector&lt;/servlet-name&gt; &lt;servlet-class&gt; com.FCKeditor.connector.ConnectorServlet &lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;baseDir...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    &lt;param-value&gt;/WEB-INF/dispatcher-servlet.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt; &lt;url-...

    一个在线报名系统

    &lt;servlet-name&gt;registerServlet&lt;/servlet-name&gt; &lt;servlet-class&gt;servlet.registerServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;registerServlet&lt;/servlet-name&gt; &lt;url-pattern&gt;/...

    Axsis and XFire Demo src code

    &lt;servlet-name&gt;AxisServlet&lt;/servlet-name&gt; &lt;servlet-class&gt; org.apache.axis.transport.http.AxisServlet &lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet&gt; &lt;servlet-name&gt;AdminServlet&lt;/servlet-name&gt; ...

    WMS仓库管理系统SSM.zip

    &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;url-pattern&gt;*.svg&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;url-pattern&gt;*.eot&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    &lt;servlet-api.version&gt;2.5&lt;/servlet-api.version&gt; &lt;jsp-api.version&gt;2.0&lt;/jsp-api.version&gt; &lt;joda-time.version&gt;2.5&lt;/joda-time.version&gt; &lt;commons-lang3.version&gt;3.3.2&lt;/commons-lang3.version&gt; &lt;commons-io....

    基于SSM(spring+springMVC+MyBatis)开发的仓库管理系统

    &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;url-pattern&gt;*.svg&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;default&lt;/servlet-name&gt; &lt;url-pattern&gt;*.eot&lt;/url-pattern&gt; &lt;/servlet-...

    SSM实现跨服务器上传图片,并用Ajax实现图片回显,以及商品的的修改、查询和删除功能

    6.需要将Tomcat7.0,及ssmImage19项目所在的Tomcat的web.xml中的DefaultServlet的只读权限改为false。 &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;...

    spring_MVC源码

    14. &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; 15. &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; 16. &lt;/servlet&gt; 17. &lt;servlet-mapping&gt; 18. &lt;servlet-name&gt;spring&lt;/servlet...

    SpringMVC-Mybatis-Shiro-redis-master 权限集成缓存中实例

    &lt;param-name&gt;spring.profiles.default&lt;/param-name&gt; &lt;param-value&gt;dev&lt;/param-value&gt; &lt;/context-param&gt; &lt;context-param&gt; &lt;param-name&gt;spring.liveBeansView.mbeanDomain&lt;/param-name&gt; &lt;param-value&gt;dev&lt;/param...

    拦截器和控制器的区别

    &lt;default-interceptor-ref name="myStack"&gt;&lt;/default-interceptor-ref&gt; 拦截错误跳转的页面 &lt;global-results&gt; &lt;result name="error"&gt;/demo01/error.jsp&lt;/result&gt; &lt;/global-results&gt; &lt;/package&gt; ...

    jwchat源码

    3 &lt;url-pattern&gt;/JHB/&lt;/url-pattern&gt; &lt;!--这里的修改主页是对应上面的config.js,如果config.js的httpbase配置是/jwchat/,那这里的就不用修改了 --&gt; 4 &lt;/servlet-mapping&gt; (黄色表示要修改的部分) 5.启动...

    Java 实时社区论坛.zip

    WEB-INF/cron.xml 中注释掉的部分打开如果部署在非 Jetty 容器中,需要把 WEB-INF/web.xml 中如下配置注释掉: &lt;servlet&gt;  &lt;servlet-name&gt;default&lt;/servlet-name&gt;  &lt;servlet-class&gt;org.eclipse.jetty.servlet....

    cms后台管理

    &lt;param-value&gt;/WEB-INF/config/jeecms-servlet-front.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;2&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;JeeCmsFront&lt;/servlet-name&gt; &lt;url-...

    freemarker总结

    上面的代码中的逻辑表达式用括号括起来主要是因为里面有&gt;符号,由于FreeMarker会将&gt;符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号. &lt;#if animals....

    SpringMVC-SSH全注解

    &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /&gt; &lt;property name="prefix" value="/jsp/" /&gt; &lt;property name="suffix" value=".jsp" /&gt; &lt;/bean&gt; &lt;!-- 配置jdbc -...

    Spring3中配置DBCP,C3P0,Proxool,Bonecp数据源

    &lt;mvc:default-servlet-handler /&gt; &lt;aop:config proxy-target-class="true"/&gt; &lt;tx:annotation-driven transaction-manager="txManager"/&gt; &lt;!-- 采用单数据源事务控制方式,通过注解来定义事务--&gt; &lt;bean ...

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    &lt;package name="default" extends="struts-default"&gt; &lt;global-results&gt; &lt;result name="client-abort-exception"&gt;/ignored.jsp&lt;/result&gt; &lt;/global-results&gt; &lt;/package&gt; &lt;package name="main" extends="struts-default...

    jpivot学习总结.doc

    &lt;jp:mondrianQuery dataSource="feeDS" id="query01" catalogUri="/WEB-INF/queries/feeSchema.xml"&gt; 例子在tomcat中定义了数据源feeDS 2.2. 各种维度类型  一般维度 例子中定义了维度:[term].[所有终端] 按终端...

Global site tag (gtag.js) - Google Analytics