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 }

 

posted @ 2020-05-19 00:33  努力学习的Peanut  阅读(314)  评论(0)    收藏  举报