SpringMVC底层执行原理
一个简单的HelloSpringMVC程序
先在web,xml中注册一个前端控制器(DispatcherServlet)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
5 version="4.0">
6 <!--配置DispatcherServlet:这是SpringMVC的核心,请求分发器,前端控制器-->
7 <servlet>
8 <servlet-name>springmvc</servlet-name>
9 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
10 <!--要绑定springmvc的配置文件-->
11 <init-param>
12 <param-name>contextConfigLocation</param-name>
13 <param-value>classpath:springmvc-servlet.xml</param-value>
14 </init-param>
15 <!--启动级别为1-->
16 <load-on-startup>1</load-on-startup>
17 </servlet>
18 <servlet-mapping>
19 <servlet-name>springmvc</servlet-name>
20 <url-pattern>/</url-pattern>
21 </servlet-mapping>
22 </web-app>
配置文件(springmvc-servlet.xml)
HandlerMapper是处理器映射器-->根据请求的地址去找处理器(如案例中的"/hello")
HandlerAdapter是处理器适配器-->找到处理器后根据id去适配对应的controller(如适配到案例中的HelloController),controller会返回ModelAndView及其前端数据
ViewResolver是视图解析器,其作用为:
1.获取到ModelAndView中的数据
2.解析视图名称
3.拼接视图名称
4.数据渲染
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 7 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 8 9 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> 10 <property name="prefix" value="/WEB-INF/jsp/"/> 11 <property name="suffix" value=".jsp"/> 12 </bean> 13 14 <bean id="/hello" class="com.kuang.contorller.HelloController"/> 15 16 </beans>
controller层:
实现Controller接口,重写内部方法(一般不会使用,这是底层原理)
ModelAndView是模型、视图
1 public class HelloController implements Controller { 2 @Override 3 public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { 4 ModelAndView mv = new ModelAndView(); 5 mv.addObject("msg","HelloSpringMVC!"); 6 mv.setViewName("test"); 7 return mv; 8 } 9 }
底层流程图
实线是SpringMVC已经帮你实现好了,虚线是需要自己手动

以上仅是说明底层执行原理,实际开发并不会这样去使用!
在实际开发中SpringMVC推荐使用注解的方式
在注解开发中,不需要我们去配置处理器适配器和处理器映射器。
web.xml中只需配置DispatcherServlet前端控制器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 5 version="4.0"> 6 7 <servlet> 8 <servlet-name>SpringMVC</servlet-name> 9 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 10 <init-param> 11 <param-name>contextConfigLocation</param-name> 12 <param-value>classpath:springmvc-servlet.xml</param-value> 13 </init-param> 14 <load-on-startup>1</load-on-startup> 15 </servlet> 16 <servlet-mapping> 17 <servlet-name>SpringMVC</servlet-name> 18 <url-pattern>/</url-pattern> 19 </servlet-mapping> 20 </web-app>
在springmvc-servlet.xml中配置视图解析器等
<context:component-scan base-package="com.kuang.controller"/> /*组件扫描,用于扫描controller下的包*/ <mvc:default-servlet-handler/> /*静态资源过滤*/ <mvc:annotation-driven/> /*这个就帮助我们配置了映射器以及适配器*/
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context 9 https://www.springframework.org/schema/context/spring-context.xsd 10 http://www.springframework.org/schema/mvc 11 https://www.springframework.org/schema/mvc/spring-mvc.xsd"> 12 <context:component-scan base-package="com.kuang.controller"/> 13 <mvc:default-servlet-handler/> 14 <mvc:annotation-driven/> 15 16 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> 17 <property name="prefix" value="/WEB-INF/jsp/"/> 18 <property name="suffix" value=".jsp"/> 19 </bean> 20 </beans>
contorller
1 @Controller //说明这类被Spring托管了 2 @RequestMapping("/hello") 3 public class HelloController { 4 @RequestMapping("/h1") //这个注解会执行视图解析器 5 public String hello(Model model){ 6 model.addAttribute("msg","helloSpringMVCAnnotation"); 7 return "hello"; 8 } 9 }

浙公网安备 33010602011771号