关于Spring初始化配置中的dispatcherServlet的配置问题

前几年的web开发中,url通常是以.do、.action、.xhtml等等作为结尾,所以在web.xml中通常配置DispatcherServleturl-pattern类似.do、.action结尾,这样的配置方式导致dispatcherServlet只会拦截*do或者*.action结尾,当然这样的方式不会带来任何问题,例如:

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

付出的代价就是我们的url中必然带着*.do这类东东,但是现在是Rest的时代,这样的url显得非常ugly。但如果使用如下的配置方式

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

这样的配置方式使得Spring拦截了所有请求,这样的话导致Spring在老版本的情况下无法很好的处理静态资源,例如 我们要请求URL为:http://localhost:8080/webapp/test.png,这样由于dispatcherServlet的请求映射配置成/,Spring MVC将拦截所有的请求(当然包括静态资源的请求),交由Controller处理,显然静态资源的请求到了Controller那里必然会导致no handler mapping的错误。

但是新版本的Spring框架在需要完成REST风格的URL上面做了系列改动,我们可以在配置中使用如下的配置方式,可以很好的处理静态资源了,但是在配置方面会略有改动,目前是有如下三种方式:

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

首先说明Tomcat是有一个默认的Servlet的,是配置在$catalina/conf/web.xml里面的,我们可以看到

  1. <servlet>
  2. <servlet-name>default</servlet-name>
  3. <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  4. <init-param>
  5. <param-name>debug</param-name>
  6. <param-value>0</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>listings</param-name>
  10. <param-value>false</param-value>
  11. </init-param>
  12. <load-on-startup>1</load-on-startup>
  13. </servlet>

而我们的静态资源可以交由这个tomcat默认的Servlet处理,对应的我们要在本地的web.xml中配置

<servlet-mapping>

<servlet-name>default</servlet-name>

<url-pattern>*.jpg</url-pattern>

</servlet-mapping>

<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>

要配置多个,每种文件配置一个,要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。

方案二: 在spring3.0.4以后版本提供了<mvc:resources>

<mvc:resources >的使用方法:

  1. <mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>

以上配置将Web根路径"/"及类路径下 /META-INF/publicResources/ 的目录映射为/resources路径。假设Web根路径下拥有images、js这两个资源目录,在images下面有bg.gif图片,在js下面有test.js文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源。

假设WebRoot还拥有images/bg1.gif 及 js/test1.js,则也可以在网页中通过 /resources/images/bg1.gif 及 /resources/js/test1.js 进行引用

说明:<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

首先,<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。

其次,<mvc:resources />依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,一般可将该时间设置为一年,以充分利用浏览器端的缓存。在输出静态资源时,会根据配置设置好响应报文头的Expires 和 Cache-Control值。

在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。

方法3.采用<mvc:default-servlet-handler />

<mvc:default-servlet-handler />

在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

但是要注意几个问题:

1.第二和第三方案可以一起在项目中使用

2.第三种方案中配置了 <mvc:default-servlet-handler/> 解决了静态资源调用的问题时,而原来@RequestMapping(value="/path1") 配置的URL地址 不能正使用了,解决方案是需要在springmvc.xml 中在配置一下 <mvc:annotation-driven/> 原因如下

①. 当两种标签都没有的时候,框架默认注册的有AnnotationMethodHandlerAdapter这个bean,所以能够处理@RequestMapping这个注解。

②. 但是只配置了<mvc:default-servlet-handler/>时所注册的两个bean都不能处理@RequestMapping注解,因此无法找到相应的Controller,进而无法进行访问路径的映射,

 ③. 两种标签都有的时候,<mvc:annotation-driven/>会注册一个RequestMappingHandlerAdapter的bean,这个bean能够处理@RequestMapping这个注解。

时间: 2024-10-09 02:55:19

关于Spring初始化配置中的dispatcherServlet的配置问题的相关文章

spring Bean 配置中scope 和 lazy-init

Spring Bean配置默认为单实例 Bean默认的是单例的. 如果不想单例需要如下配置:<bean id="user" class="..." singleton="false"/> singleton就是配置这个bean是否是单例的,如果不写,就是默认值true. spring Bean 配置中 scope的作用 1.Bean的作用域可以通过Bean标签的scope属性进行设置,Bean的作用域包括:默认情况下scope=&qu

Spring hibernate配置中mappingLocations、mappingDirecto

mappingLocations.mappingDirectoryLocations与mappingJarLocations 区别 由于spring对hibernate配置文件hibernate.cfg.xml的集成相当好, 所以,在项目中我一直使用spring的org.springframework.orm.hibernate.LocalSessionFactoryBean来取代hibernate.cfg.xml文件的功能 LocalSessionFactoryBean有好几个属性用来查找hi

Spring AOP配置中的问题aop:aspectj-autoproxy

(1)对于菜鸟来说,在Spring学习中可能会遇到各种各样的问题.下面就简单的写一下,我在学习Spring AOP配置中遇到的问题吧. 一般情况下,很多人都认为我们把spring framework中的所有jar包都加入到classpath中就OK了,在学习Ioc和Aop的时候就只剩下编程了,啥都不用管了. 其实不是这样的,对于以前的版本来说,可能所有用到的包都集成在一起了,但spring 技术的不断发展和扩大.完善.最终,好多模块都分家了,比如,在学习Ioc的时候我们基本上可以使用spring

在spring的配置中,基于注解方式是否比xml方式配置更好?——翻译

简短的回答就是“看情况了”.长篇大论来说(辩证的看待),每种方式都有利弊,通常来说,这取决于开发者选择最适合他们的策略.由于注解的定义方式,在其声明中提供了大量上下文,从而导致更短更简洁的配置.但是,XML的方式优势在于连接组件时解耦源代码或无需重新编译.一些开发人员更喜欢将配置连接靠近源头,而另一些则认为注释类不再是POJO,而且配置变得分散且难以控制. 不管是哪种方式,spring可以兼容两种风格并且混合使用都可以.值得提出的是,通过其JavaConfig选项,Spring允许以非侵入方式使

spring 配置中 merge的使用

在spring 的配置中共用属性模版时,使用parent='parentBean',如果parentBean里面有个List集合属性,子类还想在这个List里面添加元素,这是怎么办呢? public class Person {         private List<Address> addresses;         ..     } <bean name='basePerson' class='Person' abstract='true'>  <property 

spring学习(八)--DispatcherServlet工作原理

一.DispatcherServlet 处理流程 在整个 Spring MVC 框架中,DispatcherServlet 处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应工作.在看 DispatcherServlet 类之前,我们先来看一下请求处理的大致流程: Tomcat 启动,对 DispatcherServlet 进行实例化,然后调用它的 init() 方法进行初始化,在这个初始化过程中完成了: 对 web.xml 中初始化参数的加载:建立 WebApplicationCon

SpringMVC Mongodb 配置中加入用户认证信息

Spring Mongodb 配置中加入用户认证信息 Spring mongodb的项目搭建请参考:http://blog.csdn.net/h348592532/article/details/39344823 . 在链接的文章里边详细介绍了如用搭建一套 springmvc+mongodb+maven 但是里边没有包括mongodb的用户信息配置,而我们实际需求的是带用户认证配置的,做一些调试,配置好了,其实很简单,下面进入正题. 主要内容 已有的配置里边,mongodb的配置如下: <mon

5.spring:注解配置 Bean

在classpath中扫描组件 组键扫描:能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定的组件包括: ->@Componment:基于注解,标识一个受Spring管理的组键 ->@Respository:标识持久层组件 ->@Service:标识服务层 ->@controller:标识表现层组件 对于扫描到的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以通过注解中value属性值标识组建的名称 在classpath中扫描组键当在

[转]spring的filter中targetFilterLifecycle作用

在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理. 配置分为两种A和B. A:普通配置 在web.xml中增加如下内容:<filter>    <filter-name>permissionFilter</filter-name>    <filter-class>com.taobao.riskm.filter.PermissionFilter</filter-class></fil