前面我们已经大概了解了spring的ioc和aop以及spring的事务。接下来我们应该了解spring的另一个子模块spring的springMVC模块。

springMVC是spring的web模块。那么我们就了解一下web模块。图在spring框架(一)中就有,自行查看

Web
Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文,所以Spring框架支持与Jakarta Struts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。Web层包含了Web、Web-Servlet、Web-Struts和Web、Porlet模块

  • Web模块:提供了基础的面向Web的集成特性,例如,多文件上传、使用Servlet listeners初始化IoC容器以及一个面向Web的应用上下文,它还包含了Spring远程支持中Web的相关部分
  • Web-Servlet模块web.servlet.jar:该模块包含Spring的model-view-controller(MVC)实现,Spring的MVC框架使得模型范围内的代码和web forms之间能够清楚地分离开来,并与Spring框架的其他特性基础在一起
  • Web-Struts模块:该模块提供了对Struts的支持,使得类在Spring应用中能够与一个典型的Struts Web层集成在一起
  • Web-Porlet模块:提供了用于Portlet环境和Web-Servlet模块的MVC的实现

我们常说的springmvc其实本意上是Web-Servlet模块web.servlet.jar 是指这部分,那么我就来解开她神秘的面纱,一睹面容。

1 4Springmvc 架构(重点)

1.1 架构图

spring mvc 项目集成Spring Security spring mvc模块_spring

1.2组件分析

1、前端控制器(不需要开发,只需配置)
作用:接收前台页面的请求,并响应结果到前台页面。中间做请求转发,相当于中央处理器。
2、处理器映射器(不需要开发,只需配置)
作用:根据请求的URL查找处理器
3、处理器适配器(不需要开发,只需配置)
作用:执行符合特定规则(HandlerAdapter要求的规则)的处理器
4、处理器(后端控制器:程序员开发)
注意:编写Handler时要符合HandlerAdapter的规则,否则处理器适配器无法正确执行。
5、视图解析器(不需要开发,只需配置)
作用:进行视图解析,根据逻辑视图名解析成真正的视图。
6、视图(程序员开发)
View是一个接口,实现类支持不同的view类型(jsp、freemarker、pdf等)

1.3DispatcherServlet.properties

DispatcherServlet作为springmvc的中央调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties中加载springmvc的各个组件,如果在springmvc.xml中配置了组件则以springmvc.xml文件中的为准,DispatcherServlet的存在降低了springmvc各个组件之间的耦合度。



DispatcherServlet.properties文件所在位置(spring-webmvc jar包中):


spring mvc 项目集成Spring Security spring mvc模块_mvc_02

里面内容如下图:

spring mvc 项目集成Spring Security spring mvc模块_spring_03

详细解释一下:

DispatcherServlet默认使用WebApplicationContext作为上下文,因此我们来看一下该上下文中有哪些特殊的Bean:
1、LocalResover:本地化解析,因为Spring支持国际化,因此LocalResover解析客户端的Locale信息从而方便进行国际化;

2、ThemeResovler:主题解析,通过它来实现一个页面多套风格,即常见的类似于软件皮肤效果;

3、HandlerMapping:请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;

4、HandlerAdapter:HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,并且掉处理器的handleRequest方法进行功能处理;

5、HandlerExceptionResolver:处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面(而不是给用户看到具体的错误信息);

6、RequestToViewNameTranslator:当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名;

7、ViewResolver:ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;如InternalResourceViewResolver将逻辑视图名映射为jsp视图;

8、FlashMapManager:用于管理FlashMap的策略接口,FlashMap用于存储一个请求的输出,当进入另一个请求时作为该请求的输入,通常用于重定向场景,后边会细述。
上面的8个为默认配置文件的解释:

注意下面的两个spring配置的bean:

1、Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理;


2、MultipartResolver:文件上传解析,用于支持文件上传;


所以:默认的配置文件中处理器映射器是3,处理器适配器是4,jsp视图解析器是7。

2 配置非注解的前端控制器、处理器映射器 、处理器适配器、视图解析器

1. 前段控制器

新建项目在web.xml中配置前段控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	<display-name>springmvc0713</display-name>

	<!-- 配置springmvc的前端控制器 -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- contextConfigLocation配置springmvc加载的配置文件(处理器、映射器等等)
			 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml) -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>

		<!-- 表示servlet随服务启动,里面的值要大于等于0,越小级别越高,一般设置为1、2 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<!-- 此处可以多种配置方式:
			 第一种:*.action,以.action结尾的url进行访问时由DispatcherServlet解析 
			 第二种:/,所有访问的URL都由DispatcherServlet解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析 使用此种方式,可以实现RESTful风格的url 
			第三种:/*,经测试,这种配置有问题。 如果请求或者通过Controller转发jsp页面时,也会被拦截,此时找不到handler,会报错 -->
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

</web-app>

contextConfigLocation配置springmvc加载配置文件(配置处理器映射器、适配器等)



注意:如果不在spring-servlet.xml中配置处理器映射器、处理器适配器默认加载org.springframework.web.servlet.DispatcherServlet.properties 


如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)也就是名称必须叫springmvc-servlet.xml


2.非注解处理器映射器

spring mvc 项目集成Spring Security spring mvc模块_mvc_04

其中处理器映射器包括默认的配置非注解形式包括下列俩种
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

3、非注解处理器适配器

spring mvc 项目集成Spring Security spring mvc模块_spring_05

其中非注解处理器适配器包括
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter // //通过修改response 相应json格式数据

4.视图解析器

spring mvc 项目集成Spring Security spring mvc模块_mvc_06

以上的配置均在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:tx="http://www.springframework.org/schema/tx"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
        http://www.springframework.org/schema/tx     
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
          
        <!-- 【配置映射处理器】 -->  
        <!-- SpringMVC自带的映射处理器均实现了Spring的Ordered接口,这意味着我们可以在应用系统中声明多个处理器映射 -->  
        <!-- 并且可以设置它们的优先级,这主要体现在order属性上,其值越小,则对应的该映射处理器的优先级越高 -->  
        <!-- 本例中,SimpleUrlHandlerMapping的order值比BeanNameUrlHandlerMapping的小 -->  
        <!-- 这意味着DispatcherServlet在映射URL的时候,首先会咨询SimpleUrlHandlerMapping -->  
        <!-- 只有在SimpleUrlHandlerMapping无法返回结果时,才咨询BeanNameUrlHandlerMapping -->  
        <bean id="beanNameUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">  
            <property name="order" value="1"/>  
        </bean>  
        <bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
            <property name="order" value="0"/>  
            <property name="mappings">  
                <props>  
                    <prop key="/userlist22.htm">userController</prop>  
                    <prop key="/userlist33.htm">userController</prop>  
                </props>  
            </property>  
        </bean>  
      
        <!-- 这里的id="userController"对应的是<bean id="simpleUrlMapping">中的<prop>里面的value -->  
        <bean id="userController" class="com.hyjc.controller.UserController"/>  
          
        <!-- DispatcherServlet使用的默认处理器映射是BeanNameUrlHandlerMapping,它使用URL样式的名字 -->  
        <bean name="/userlist11.htm" class="com.hyjc.controller.UserController"/> 
        
        <!--【处理器适配器】-->
		<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
        
         <!-- 【配置视图解析器】 -->  
        <!-- InternalResourceViewResolver会在ModelAndView返回的视图名前加上prefix指定的前缀,再在最后加上suffix指定的后缀 -->  
        <!-- 由于UserController返回的ModelAndView中的视图名是userlist,故该视图解析器将在/WEB-INF/jsp/userlist.jsp处查找视图 -->  
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
            <property name="prefix" value="/WEB-INF/jsp/"/>  
            <property name="suffix" value=".jsp"/>  
        </bean>   
    </beans>

3.注解形式-处理器映射器和处理器适配器

因为前段控制器和视图解析器不分为注解和非注解:所以这里前段控制器和视图解析器还是同前面的非注解配置。

注解映射器和适配器介绍
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping 是在spring3.1之前使用的注解映射器。

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping是在spring3.1之后使用的注解映射器。

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 是在spring3.1之前使用的注解适配器。

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter是在spring3.1之后使用的注解配置器。

注意:
1、注解方式的映射器和适配器在3.1版本前后是不一样的,主讲3.1之后。
2、注解方式的处理器映射器和处理器适配器必须配对使用,不能与非注解的处理器映射器和适配器混用。

注解方式处理器映射器,对标记为@controller类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。

3.1 在springmvc的文件中通过bean标签配置

<!-- 注解方式的处理器映射器和处理器适配器必须配对使用,不能与非注解的处理器映射器和适配器混用 -->
<!-- 配置注解方式的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!-- 配置注解方式的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

3.2 在springmvc中的文件通过<mvc:annotation-driven>配置

使用mvc:annotation-driven的话,上面的3.1方式注解方式的处理器映射器配置就可以不要了。


<!-- 使用mvc:annotation-driven代替上面的注解方式的处理器适配器和映射器的配置 -->
<!-- 默认加载很多参数绑定组件,比如json转换组件 -->
<!-- 实际开发时使用mvc:annotation-driven -->
<mvc:annotation-driven />


总结:sprigmvc的配置学习和总结就总结到这,这里还有自定义的处理器适配器和开发Handler(在springmvc中handler的开发方式有很多,主要讲解三种:实现HttpRequestHandler接口、实现Controller接口、使用注解方式)在后期使用的时候在做补充和详细介绍。