SpringMVC框架流程的详解
一、SpringMVC简介:
●SpringMVC和struts2框架功能相似,两者都是基础MVC设计思想的Web应用程序框架,使用它们的目的是简化开发工作,提高开发效率!
●SpringMVC的优点:
(1) 能够直接使用Spring框架的IoC容器,AOP支持;
(2) 提供了多种将请求URL映射到控制器的机制;并支持参数的类型转换,自动装载,校验等功能;
(3) 具有强大的扩展性,开发者可根据需要方便的扩展框架的功能。
二、SpringMVC的使用步骤:
① 创建Web工程、拷贝jar包
spring IoC及AOP相关的jar包;
spring-web.jar;
Spring-webmvc.jar;
依赖的jar包,Apache Commons logging日志包;
可选的jar包:log4j日志包;jstl标签库支持包;
② 在Web.xml中的配置DispatcherServlet;
DispatcherServlet是Spring MVC提供的一个前端控制器类
配置如下:
解析:web.xml配置文件在Tomcat启动时进行解析操作,若客户端的请求是以 .do或者以.action 结尾的,都会交给 其DispatcherServlet进行转发处理,它会在其WEB-INF下找其配置的springmvc-servlet的配置文件,配置请求的 url 地址,和请求服务器端控制器处理类的对应关系,然后控制器类中的方法进行处理请求操作,配置的xml文 件名要
注意:url-pattern通常配置为:*.do、/两种形式。若配置为/,则所有的请求除了以.jsp结尾请求交给Tomcat服务器处理,其余所有的都交给DispatcherServlet处理。DispatcherServlet处理器功能就是分发请求,分发给后端(我们所开发的控制器类),然后通过dispatcher-servlet.xml文件通过name所指定的url路径,找到具体要分发请求的控制器类。
③ 编写控制器类LoginController
● 该类序实现Controller接口,并在handleRequest()方法中完成业务处理,最后返回ModelAndView对象。
● 在ModelAndView对象中设置视图名(JSP页面路径)
mav.setViewName(“/result.jsp”);
④ WEB-INF目录下放置Spring MVC配置文件dispatcher-servlet.xml配置请求URL和控制器类的对应关系:
⑤ 编写result.jsp结果页面
三、Spring MVC的工作原理
(1)Spring MVC框架都是围绕 DispatcherServlet (请求分发器)设计的。
① 首先,请求分发器接受来自客户端的特定请求。
② 请求分发器分发请求:
请求分发器将根据处理器映射查找对应的处理器。
描述请求的URL地址和处理器之间映射关系的组件称为处理器映射(HanderMapping)请求分发器找到处理器 后,将请求交给该处理器进行处理。
③ 处理器处理该请求:
处理器调用相应服务类进行业务处理,处理完成后返回模型视图对象(ModelAndView),该对象中包含数据模型以及下一个需要显示的逻辑视图名;
④ 处理器处理完该请求,就会返回一个ModelAndView对象给DispatcherServlet对象,然后由DispatcherServlet对象解析视图名:请求分发器借助视图解析器对象(一个实现ViewResolver接口的实例)解析视图名,得到对应的视图对象(一个实现这View接口的实例)
⑤ 由视图对象返回应答:
请求分发器将数据模型交给视图对象,由视图对象渲染页面(跳转jsp页面)
(2) 请求的处理流程:
(3)各种接口和类及其含义:
① DispatcherServlet类:请求分发器,也称为前端控制器,它是处理请求的总控制器。它根据请求的URL地址分发请求,并根据后端控制器的返回结果调用视图解析器,并将数据模型交给视图对象,完成对客户端的应答!
② HandlerMapping接口:处理器映射,负责将请求URL地址映射到某个处理器。
③ HandlerAdapter接口:处理器适配器,帮助定位对应处理器中的请求处理方法和参数装载。
④ Controller接口:控制器,负责将请求交给特定的业务进行处理方法,返回一个ModelAndView对象。
⑤ ModelAndView对象:模型和视图对象,该对象中包含了模型和视图信息。模型信息是Map对象,视图信息一般是视图逻辑名。
⑥ ViewResolver接口:代表了视图解析器,负责将逻辑视图名解析为某个具体的一个实现了View接口的对象。
⑦ View接口:代表了视图,负责给客户端返回应答结果,结果不仅可以是HTMl页面,也可以是文本,PDF,Excel或报表
(4)关于DispatcherServlet
DispatcherServlet的基本功能:依据处理器规则,把客户端的请求分发给目标Controller进行处理
● 如何转发?
在DispatcherServlet的初始化过程当中,在调用init()方法的时候会在Web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet的配置文件,解析该文件后得到WebApplicationContext对象,该上下文对象就 是Spring的IoC容器。
● 对于客户端到来的请求,DispatcherServlet默认根据请求的URL和IoC容器中的bean名称进行匹配,调用其内部的handleRequest()方法。
(5)关于HandlerMapping
DispatcherServlet之所以是根据请求的URL和IoC容器中的bean名称进行匹配,原因就在于HandlerMapping对象。
● 默认情况下,IoC容器被创建后,DispatcherServlet会自动检查容器中的bean,根据bean对象是否实现了HandlerMapping接口来确定处理器映射对象。
如果找到了一个或多个实现了HandlerMapping接口的bean,这些对象都被看作处理器映射对象,如果没找到,则默认使用以下处理器映射对象:
BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping
● 多个HandlerMapping根据其order属性值的大小决定被调用的顺序,order值较小的先被调用。DefaultAnnotationHandlerMapping和BeanNameUrlHandlerMapping的order属性默认值为Integer.MAX_VALUE.
BeanNameUrlHandlerMapping是根据IoC容器中的bean名称匹配请求的URL;
DefaultAnnotationHandlerMapping对象是根据代码中的注解匹配请求URL.
(6)关于HandlerAdapter
● HandlerAdater是处理器适配器,它最终确定处理器对象中的那个方法处理本次请求,它还负责请求参数的类型转换和自动装配。
● 如果IoC容器中没有配置实现了HandlerAdapter接口的bean,则 Spring MVC框架默认使用以下处理器适配器:
HttpRequestHandlerAdapter,
SimpleControllerHandlerAdapter,
AnnotationMethodHandlerAdapter.
● HttpRequestHandlerAdapter检查处理器是否实现了HttpRequestHandler接口;
● SimpleControllerHandlerAdapter检查处理器是否实现了Controller接口;
● AnnotationMethodHandlerAdapter 则是根据注解将请求URL匹配到处理器中的某个方法。
● 适配器寻找相应的HandlerRequest()方法来处理本次请求:
调用的次序:处理器适配器也是通过order值来确定具体要执行处理器中的某个方法来处理本次请求,先去看是否实现了HttpRequestHandlerAdapter接口的处理器适配器,若没有,就返回null,继续查看SimpleControllerHandlerAdapter是否实现了Controller接口,若有,就执行handlerRequest()方法处理本次请求,之后就不会再依次向下找了!
(7)关于ViewResolver
处理器方法返回一个ModelAndView对象中包含字符串形式的ViewName,
DispatcherServlet会将该视图名交给视图解析器对象,解析之后得到一个视图对象。
● 视图对象在哪呢?
同样的,IoC容器被创建后,DispatcherServlet会自动检查IoC容器中的bean对象,根据bean对象是否实现了ViewResolver接口确定视图解析对象,如果找到了,这些bean对象就作为视图解析对象。如果没有找到,则使用默认的视图解析器:InternalResourceViewResolver(内部资源视图解析器)
● InternalResourceViewResolver会将ViewName看作文件的URL,包装成InternalResourceView对象返回。
(8)关于View
DispatcherServlet如何使用View对象?
无论什么视图,DispatcherServlet都是调用视图对象中的render()(渲染)方法,并将ModelAndView对象中的模型数据传给该方法。
● 对于InternalResourceView对象,其render()方法中使用了forward()方法将请求转发到目标jsp页面。
(9)综述:
DispatcherServlet中根据HandlerMapping对象找到对应的Controller,然后借助HandlerAdapter对象确定处理器中的方法,然后调用处理器方法进行处理。
处理器方法返回一个ModelAndView对象,DispatcherServlet从ModelAndView对象中取出视图名ViewName交给ViewResolver视图解析器进行解析,得到一个View对象。DispatcherServlet调用View对象中的render()方法,完成对客户端的应答。