Spring MVC框架的详细流程

来源:互联网 发布:复旦东区宿舍网络 编辑:程序博客网 时间:2024/05/29 16:08

SpringMVC框架流程的详解

一、SpringMVC简介:

SpringMVCstruts2框架功能相似,两者都是基础MVC设计思想的Web应用程序框架,使用它们的目的是简化开发工作,提高开发效率!

 

SpringMVC的优点:

(1) 能够直接使用Spring框架的IoC容器,AOP支持;

(2) 提供了多种将请求URL映射到控制器的机制;并支持参数的类型转换,自动装载,校验等功能;

(3) 具有强大的扩展性,开发者可根据需要方便的扩展框架的功能。

二、SpringMVC的使用步骤:

 创建Web工程、拷贝jar

spring IoCAOP相关的jar包;

spring-web.jar;

Spring-webmvc.jar;

依赖的jar包,Apache Commons logging日志包;

可选的jar包:log4j日志包;jstl标签库支持包;

 

 Web.xml中的配置DispatcherServlet

DispatcherServletSpring MVC提供的一个前端控制器类

配置如下:

 解析:web.xml配置文件在Tomcat启动时进行解析操作,若客户端的请求是以.do或者以.action 结尾的,都会交给DispatcherServlet进行转发处理,它会在其WEB-INF下找其配置的springmvc-servlet的配置文件,配置请求的url地址,和请求服务器端控制器处理类的对应关系,然后控制器类中的方法进行处理请求操作,配置的xml件名要<servlet-name>springmvc</servlet-name>中要和springmvc一致。

<servlet>

     <servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

     <servlet-name>springmvc</servlet-name>

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

  </servlet-mapping>

注意: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和控制器类的对应关系:

<bean name=”/login.do” class=”com....controller.LoginController”></bean>

 

编写result.jsp结果页面

 

三、Spring MVC的工作原理

  1Spring 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页面,也可以是文本,PDFExcel或报表

 

4)关于DispatcherServlet

DispatcherServlet的基本功能:依据处理器规则,把客户端的请求分发给目标Controller进行处理

 

● 如何转发?

DispatcherServlet的初始化过程当中,在调用init()方法的时候会在Web应用的WEB-INF文件夹下寻找名为[servlet-name]-servlet的配置文件,解析该文件后得到WebApplicationContext对象,该上下文对象就SpringIoC容器。

 

● 对于客户端到来的请求,DispatcherServlet默认根据请求的URLIoC容器中的bean名称进行匹配,调用其内部的handleRequest()方法。

 

(5)关于HandlerMapping

DispatcherServlet之所以是根据请求的URLIoC容器中的bean名称进行匹配,原因就在于HandlerMapping对象。

 

● 默认情况下,IoC容器被创建后,DispatcherServlet会自动检查容器中的bean,根据bean对象是否实现了HandlerMapping接口来确定处理器映射对象。

如果找到了一个或多个实现了HandlerMapping接口的bean,这些对象都被看作处理器映射对象,如果没找到,则默认使用以下处理器映射对象:

BeanNameUrlHandlerMappingDefaultAnnotationHandlerMapping

 

● 多个HandlerMapping根据其order属性值的大小决定被调用的顺序,order值较小的先被调用。DefaultAnnotationHandlerMappingBeanNameUrlHandlerMappingorder属性默认值为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对象,DispatcherServletModelAndView对象中取出视图名ViewName交给ViewResolver视图解析器进行解析,得到一个View对象。DispatcherServlet调用View对象中的render()方法,完成对客户端的应答。

1 0
原创粉丝点击