首页 > 代码库 > SpringMVC

SpringMVC

一、核心类型及接口

1.1 DispatcherServlet

  完整路径:org.springframework.web.servlet.DispatcherServlet

  它是所有request请求的前置控制器


1.2 HandlerMapping

   所有请求的映射集合,有两种方式可以对应请求与实际控制器的关联关系。

  1.2.1 SimpleUrlHandlerMapping 

     通过配置文件,把一个URL映射到controller。

  1.2.2 DefaultAnnotationHandlerMapping 

     通过注解,把一个URL映射到controller。


1.3 HandlerAdapter

   处理请求的映射(HandlerMapping)

 1.3.1 AnnotationMethodHandlerAdapter

     通过注解,把一个URL映射到Controller类的方法上


1.4 controller

    请求的实际控制器

1.5 HandlerInterceptor 

    springMVC拦截器


1.6 ViewResolver

    视图解析器

 1.6.1 UrlBasedViewResolver

     通过配置文件,把一个视图名交给到一个View来处理

 1.6.2 InternalResourceViewResolver

     比上面的类,加入了JSTL的支持

 1.6.3 FreemarkerViewResolver

     freemarker模板展示视图解析器

 1.6.4 VelocityViewResolver

     velocity模板展示视图解析器

 1.6.5 JasperReportsViewResolver

     jaserReports视图解析器

 1.6.6 TilesViewResolver

     tile视图解析器

 1.6.7 XsltViewResolver

     xslt视图解析器


1.7 View

   视图接口

  1.7.1 JstlView


1.8 LocalResolver

   本地解析器

 1.8.1 HandlerExceptionResolver

     异常处理解析器接口

  1.8.2 SimpleMappingExceptionResolver

     异常处理解析器实现类


1.9 ModelAndView

   视图数据封装对象


二、配置说明

 2.1 DispatcherServlet

	<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

<load-on-startup>1</load-on-startup>

    是启动顺序,让这个Servlet随Servletp容器一起启动。

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

    会拦截*.do结尾的请求。不会导致静态文件的拦截。

<url-pattern>/</url-pattern> 

   restful 风格,拦截所有请求,包括静态资源(后面会详细说明处理办法)

<servlet-name>example</servlet-name>

   这个Servlet的名字是example,可以有多个DispatcherServlet, 是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。

<param-value>**.xml</param-value> 有多种写法

1、不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml 

2、<param-value>/WEB-INF/classes/springMVC.xml</param-value> 

3、<param-value>classpath*:springMVC-mvc.xml</param-value> 

4、多个值用逗号分隔


注:拦截/*,这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。


2.2 springMVC配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xsi:schemaLocation="
	    http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
		">

	<!--自动扫描含有@Controller的文件,base-package可用逗号隔开设置多个包-->
	<context:component-scan base-package="com.demo" >
	   <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<!-- 默认的注解映射的支持 --> 
	<mvc:annotation-driven />
	
	<!-- 视图解释类 --> 
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
	     <property name="prefix" value="http://www.mamicode.com/WEB-INF/jsp/"/> 
	     <property name="suffix" value="http://www.mamicode.com/.jsp"/>
	     <!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑  --> 
	     <property name="viewClass" value="http://www.mamicode.com/org.springframework.web.servlet.view.JstlView" /> 
	</bean>
	
	<!-- 拦截器:可分别针对不同的请求设置拦截器;也可设置近似全局拦截器 . 注:如果是rest风格静态资源也会被拦截--> 
	<mvc:interceptors> 
	   <bean class="com.demo.inteceptor.MyInteceptor" /> 
	</mvc:interceptors>
	
	<!-- 对静态资源文件的访问 方案一:使用默认的servlet来响应静态文件 -->
	<mvc:default-servlet-handler />

        <!-- 异常处理 -->
	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="defaultErrorView">
			<value>/error/error</value>
		</property>
		<property name="defaultStatusCode">
			<value>500</value>
		</property>
		<property name="warnLogCategory" >
			<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
		</property>
	</bean>
	
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	   xmlns:context="http://www.springframework.org/schema/context"
	   xmlns:mvc="http://www.springframework.org/schema/mvc"
	   xsi:schemaLocation="
	    http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
		">

	<!--自动扫描含有@Controller的文件,base-package可用逗号隔开设置多个包-->
	<context:component-scan base-package="com.demo" >
	   <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan>
	
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
		<property name="interceptors">
			<list>
				<ref bean="logNDCInteceptor" />   <!-- 日志拦截器,这是你自定义的拦截器 -->
				<ref bean="myRequestHelperInteceptor" />   <!-- RequestHelper拦截器,这是你自定义的拦截器 -->
				<ref bean="myPermissionsInteceptor" />  <!-- 权限拦截器,这是你自定义的拦截器 -->
				<ref bean="myUserInfoInteceptor" />  <!-- 用户信息拦截器,这是你自定义的拦截器 -->
			</list>
		</property>
	</bean>
	
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="byteArray_hmc" />
				<ref bean="string_hmc" />
				<ref bean="resource_hmc" />
				<ref bean="source_hmc" />
				<ref bean="xmlAwareForm_hmc" />
				<ref bean="jaxb2RootElement_hmc" />
				<ref bean="jackson_hmc" />
			</list>
		</property>
	</bean>

	<bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
	<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter"/>
	<bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
	<bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
	<bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
	<bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
    <bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
	
	
	<!-- 视图解释类 --> 
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
	     <property name="prefix" value="http://www.mamicode.com/WEB-INF/jsp/"/> 
	     <property name="suffix" value="http://www.mamicode.com/.jsp"/>
	     <!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑  --> 
	     <property name="viewClass" value="http://www.mamicode.com/org.springframework.web.servlet.view.JstlView" /> 
	</bean>
	
	<!-- 拦截器:可分别针对不同的请求设置拦截器;也可设置近似全局拦截器 . 注:如果是rest风格静态资源也会被拦截--> 
	<mvc:interceptors> 
	   <bean class="com.demo.inteceptor.MyInteceptor" /> 
	</mvc:interceptors>

	
	<!-- 对静态资源文件的访问 方案二 :通过映射匹配URL来处理静态资源,需要配置多种类型文件.由spring缓存再响应http-->
	<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926" />
	<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926" />
	<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926" />

    <!-- 异常处理 -->
	<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="defaultErrorView">
			<value>/error/error</value>
		</property>
		<property name="defaultStatusCode">
			<value>500</value>
		</property>
		<property name="warnLogCategory" >
			<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver</value>
		</property>
	</bean>
	
</beans>


说明:

1. <mvc:annotation-driven />

自动注入配置相当于手工配置下面两个类

org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

注:

spring3.1开始

RequestMappingHandlerMapping 来替换 DefaultAnnotationHandlerMapping,

用 RequestMappingHandlerAdapter 来替换 AnnotationMethodHandlerAdapter。


2.静态资源的处理方式

  2.1 

       <mvc:default-servlet-handler />

  2.2 

        <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926" />

        <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926" />

        <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926" />

  2.3 

        激活Tomcat的defaultServlet来处理静态文件

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






SpringMVC