前言
代码没用注解所以写的很古板 拿来讲原理 大佬勿喷
一、SpringMVC到底是怎么执行的呢?
配图:
- 用户进入界面发送请求被前端控制器
DispatcherServlet
(SpringMVC的核心)拦截。
<!-- web.xml下 匹配所有请求: /(不包括jsp)-->
<!-- 匹配所有请求: /*(包括jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
-
DispatcherServlet
调用HandlerMapping
处理映射器。HandlerMapping
会根据请求的url
查找具体的Handler
<!--Handler Springmvc-servlet.xml下-->
<bean id="/hello" class="com.openlab.controller.HelloController" />
3.Handler
根据URL查找控制器,如示例的:hello
去查找HelloController
4. Handler
将解析后的信息传递给DispatcherServlet
5. HandlerAdaper
表示处理器适配器,按照特定的规则区执行 Handler
,Handler
让具体的controller
执行
package com.openlab.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
// @FunctionalInterface 函数式接口 Controller中的方法
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView 模型和试图
ModelAndView mv = new ModelAndView();
// 调用业务层
// 封装对象,放在ModelAndView中 model
mv.addObject("msg","hellowSpringMVC");
// 封装跳转的视图 放在ModelAndView中
mv.setViewName("hello"); //WEB-INF/jsp/hello.jsp
return mv;
}
}
-
Handler
的具体执行信息返回给HandlerAdapter
处理器适配器。如:ModelAndView
-
DispatcherServlet
会调用视图解析器ViewResolver
。
<!-- 视图解析器DisplatcherServlet 给他的ModelAbdView-->
<!-- 获取了ModeAndeView是数据-->
<!-- 解析ModeAndView视图的名字-->
<!-- 拼接视图的名字找到相应的视图 hello-->
<!-- 将数据渲染到视图上-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver" >
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 后缀-->
<property name="suffix" value=".jsp" />
</bean>
- 视图解析器
ViewResolver
将解析的逻辑视图传给DispatcherServlet
。 -
DispatcherServlet
根据解析的视图结构,调用具体视图。 - 最终返回给用户 。