图解SpringMVC执行流程:

SpringMVC执行流程:
用户发送请求至前端控制器DispatcherServlet
DispatcherServlet收到请求调用处理器映射器HandlerMapping。
处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。
DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
执行处理器Handler(Controller,也叫页面控制器)。
Handler执行完成返回ModelAndView
HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
DispatcherServlet将ModelAndView传给ViewReslover视图解析器
ViewReslover解析后返回具体View
DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。
DispatcherServlet响应用户。
摘自:
作者:CoderZS
链接:https://www.jianshu.com/p/8a20c547e245
SpringMVC项目创建
使用maven模板webapp

创建后补充项目结构

Java包结构:
com.springmvc.surpass.controller
添加pom坐标
1 2 3 4 5 6 7 8 9 10 11 12
| <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.2.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
|
SpringMVC配置
配置类
创建IndexController
1 2 3 4 5 6 7 8
| public class IndexController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView("index.jsp"); mv.addObject("message","跳转成功"); return mv; } }
|
配置web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/springmvc-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
|
配置springmvc-servlet.xml
, web.xml
默认记载此名称的配置文件,如果不是这个名字就需要在web.xml中默认加载
1 2 3 4 5 6 7 8 9
| <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" id="simpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index">indexController</prop> </props> </property> </bean> <bean id="indexController" class="com.springmvc.surpass.controller.IndexController"></bean>
|
以上的工作流程是用户通过浏览器请求 127.0.0.1:8080/index
,servlet
拦截当前所有的请求,然后交给SpringMVC
控制器(C),控制器根据请求后缀(这里指/index
)指向其对应的bean,然后执行handlerequest
方法逻辑代码(M),执行后返回视图jsp页面(V),跳转页面后显示ModelAndView
中携带的信息。
如何在控制器中跳转到另一个控制器呢?这里看
根据需要再创建一个控制器UserController
1 2 3 4 5 6 7 8
| public class UserController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView("user.jsp"); mv.addObject("message","跳转成功"); return mv; } }
|
修改IndexController
1 2 3 4 5 6 7
| public class IndexController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView("redirect:/user"); return mv; } }
|
修改springmvc-servlet.xml
1 2 3 4 5 6 7 8 9 10 11
| <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" id="simpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/index">indexController</prop> <prop key="/user">userController</prop> </props> </property> </bean> <bean id="indexController" class="com.springmvc.surpass.controller.IndexController"></bean> <bean class="com.springmvc.surpass.controller.UserController" id="userController"></bean>
|
·用户通过浏览器请求 127.0.0.1:8080/index
,页面显示将显示 “跳转成功”!
注解类
修改springmvc-servlet.xml
1 2 3 4 5 6 7 8 9 10
| <mvc:annotation-driven/>
<context:component-scan base-package="controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean>
|
修改IndexController
1 2 3 4 5 6 7 8 9 10 11
| @Controller public class IndexController {
@RequestMapping("/index") public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView("index"); mv.addObject("message","this is a main"); return mv; } }
|
@Controller
注解:
很明显,这个注解是用来声明控制器的,可以用 @Component
注解代替。相当于bean配置
@RequestMapping
注解:
表示路径 /hello
会映射到该方法上,根据后面的/index
来判断请求哪一个方法。
重启tomcat
访问 localhost/index
路径,能够看到message的信息
结束
这里只说了SpringMVC最简单的配置,但它本身并不限于这些,适合刚接触框架的同学了解。