Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。
SpringMVC原理图
SpringMVC接口解释
DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于HandlerMapping定位到具体的Controller。它的本质是一个实现了J2EE标准中定义的HttpServlet,通过在web.xml配置<servlet-mapping>来实现对request的监听。
1
2
3
4
5
6
7
8
9
|
<
servlet
>
<
servlet-name
>springTestServlet</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet</
servlet-class
>
<
load-on-startup
>2</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>springTestServlet</
servlet-name
>
<
url-pattern
>*.do</
url-pattern
>
</
servlet-mapping
>
|
HandlerMapping接口:
能够完成客户请求到Controller映射。在第2和3部,当接受到request的时候,DispatcherServlet根据HandlerMapping的配置调用相应的Controller来对request进行业务处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<
bean
id
=
"simpleUrlMapping"
class
=
"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
>
<
property
name
=
"mappings"
>
<
props
>
<
prop
key
=
"/login.do"
>loginController</
prop
>
</
props
>
</
property
>
</
bean
>
<
bean
id
=
"loginController"
class
=
"com.test.spring.mvc.contoller.LoginController"
>
<
property
name
=
"sessionForm"
>
<
value
>true</
value
>
</
property
>
<
property
name
=
"commandName"
>
<
value
>loginCommand</
value
>
</
property
>
<
property
name
=
"commandClass"
>
<
value
>com.test.spring.mvc.commands.LoginCommand</
value
>
</
property
>
<
property
name
=
"authenticationService"
>
<
ref
bean
=
"authenticationService"
/>
</
property
>
<
property
name
=
"formView"
>
<
value
>login</
value
>
</
property
>
<
property
name
=
"successView"
>
<
value
>loginDetail</
value
>
</
property
>
</
bean
>
|
以login.do结尾的request由loginController来处理。<property name="formView">配置的是Controller接收到HTTP请求的时候需要显示的逻辑视图名,本例是显示login.jsp。<property name="successView">配置的是在接收到HTTP请求的时候需要显示的逻辑视图名,在本例中即login.jsp提交的时候(successView)需要显示名为loginDetail的逻辑视图.
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。第六七步,,DispatcherServlet根据ViewResolver的配置将逻辑view转换到真正要显示的View,如JSP等.
1
2
3
4
5
6
7
8
9
10
11
|
<
bean
id
=
"viewResolver"
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<
property
name
=
"viewClass"
>
<
value
>org.springframework.web.servlet.view.JstlView</
value
>
</
property
>
<
property
name
=
"prefix"
>
<
value
>/jsp/</
value
>
</
property
>
<
property
name
=
"suffix"
>
<
value
>.jsp</
value
>
</
property
>
</
bean
>
|
**其作用是将Controller中返回的ModleAndView解析到具体的资源(JSP文件),如上例中的return "successView";按照上面ViewResolver配置,会解析成/jsp/loginDetail.jsp.规则为prefix+ModelAndView的第二个参数+suffix.
SpringMVC运行原理
- 客户端请求提交到DispatcherServlet
- 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller
- DispatcherServlet将请求提交到Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
- DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。