前面我们已经大概了解了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 架构图
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包中):
里面内容如下图:
详细解释一下:
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.非注解处理器映射器
其中处理器映射器包括默认的配置非注解形式包括下列俩种
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
3、非注解处理器适配器
其中非注解处理器适配器包括
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter // //通过修改response 相应json格式数据
4.视图解析器
以上的配置均在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接口、使用注解方式)在后期使用的时候在做补充和详细介绍。