springmvc工作原理图



一、SpringMVC的组件介绍
前端控制器(DisatcherServlet)
接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model)
处理器映射器(HandlerMapping)
根据URL去查找处理器,一般通过xml配置或者注解进行查找
处理器(Handler)
就是我们常说的controller控制器啦,由程序员编写。
处理器适配器(HandlerAdapter)
可以将处理器包装成适配器,这样就可以支持多种类型的处理器
视图解析器(ViewResovler)
进行视图解析,返回view对象(常见的有JSP,FreeMark等)
二、执行流程
1、用户发送请求到前端控制器(DispatcherServlet),也叫中央处理器
<!--
index.jsp
请求:/hello
/:会触发servlet中 <url-pattern>/</url-pattern> 配置 ,调用 DispatcherServlet
hello:会根据@RequestMapping("/hello")找到具体controller中的具体方法
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/hello">入门程序</a>
</body>
</html>
根据servlet映射web.xml,激活DispatcherServlet
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- springmvc必须先配置前端控制器 DisPatcherServlet,任何请求都会经过servlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 将 springmvc.xml 文件交给servlet加载后才可生效-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 服务器启动就会创建 DispatcherServlet 类-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)
3、找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)
根据请求路径 /hello,找到具体的controller中的具体方法,并将方法sayHello返回给DispatcherServlet
/**
* 1、想要让一个类的方法执行,需要让这个类变为对象
* 2、前端控制器DispatcherServlet执行流程:
* load-on-startup配置让服务器启动就创建DispatcherServlet类
* DispatcherServelet就会用init-param加载springmvc.xml
* springmvc.xml 就会用 context:component-scan 开启注解扫描
* 注解扫描就会使 @Controller 注解生效,且spring注解controller自动创建bean实体类<bean id= class=></bean>
*/
@Controller
public class HelloController {
@RequestMapping("/hello")
public String sayHello(){
System.out.println("hello");
return "success";
}
}
4、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
5、处理器适配器去执行Handler
6、处理器执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView
根据 sayHello 方法找到 success.jsp的页面路径
<!--
return "success"; 控制层返回success.jsp页面
success.jsp,路径在 WEB-INF/pages/
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>成功页面</h1>
</body>
</html>
8、前端控制器请求视图解析器(ViewResolver)去进行视图解析
9、视图解析器向前端控制器返回View
springmvc.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描,可扫描到此包下带有注解的类,将实体类交给spring的ioc容器管理,将其注入spring容器中-->
<context:component-scan base-package="com.lian.springmvc"/>
<!-- 配置试图解析器对象,使返回的success找到success.jsp页面的路径-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启springmvc的框架注解支持,默认会开启处理器适配器和处理器映射器,@RequestMapping就是springmvc的注解-->
<mvc:annotation-driven/>
</beans>
10、前端控制器对视图进行渲染
11、前端控制器向用户响应结果

本文详细介绍了SpringMVC的组件及执行流程,从前端控制器DispatcherServlet开始,经过处理器映射器查找处理器,处理器适配器执行处理器,再到视图解析器解析视图,最后完成响应。整个流程涉及了Controller、HandlerMapping、HandlerAdapter、ViewResolver等多个关键角色。
1038

被折叠的 条评论
为什么被折叠?



