SpringMvc执行流程

SpringMvc运行原理:

SpringMvc运行原理图:

列如请求:http://localhost:8080/springmvc/hello

1、前端页面发送请求到DispatcherServlet(前端控制器):

在web.xml中DispatcherServlet接收到请求:

<servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-mvc.xml</param-value>
      </init-param>
  </servlet>
 <servlet-mapping>
     <servlet-name>springmvc</servlet-name>
     <url-pattern>/</url-pattern>
 </servlet-mapping>

2、DispatcherServlet根据加载的springmvc.xml文件,查找并发送请求到HandlerMapping:

     <!-- 扫描@Controller的包扫描 -->
        <context:component-scan base-package="com.ypf.*"></context:component-scan>
        <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
          这是Spring MVC为@Controller分发请求所必需的--> <mvc:annotation-driven/>
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>

 3、HandlerMapping会根据请求查找com.ypf.*包下所有被扫描到的Controller,返回处理器执行链(一个或多个拦截器)和查询到的Handler(在多个Controller中根据请求路径匹配到的Controller)到前端控制器(DispatcherServlet)

    <!-- 扫描@Controller的包扫描 -->
        <context:component-scan base-package="com.ypf.*"></context:component-scan>
        <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的-->
        <mvc:annotation-driven/> 
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>

" /springmvc "就是当前项目,然后查找路径中的" /hello "匹配到Controller,

cpackage com.ypf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    
    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }
}

4、DispatcherServlet发送请求到HandlerAdapter(处理器适配器)请求执行查询到的Handler(即匹配到的Controller)

5、HandlerAdapter(处理器适配器)执行Handler(执行HelloController),代码如上图;

6、执行完Handler,返回ModelAndView(返回“hello”字符串)到HandlerAdapter;

7、HandlerAdapter(处理器适配器)将ModelAndView返回给DispatcherServlet(前端控制器);

8、DispatcherServlet发送得到的字符串到ViewResolver(视图解析器),请求解析视图;

<!-- 扫描@Controller的包扫描 -->
        <context:component-scan base-package="com.ypf.*"></context:component-scan>
        <!-- 配置注解驱动 该配置会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必需的-->
        <mvc:annotation-driven/> 
        <!-- 配置视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>

 9、ViewResolver(视图解析器)将接收到的字符串"hello",拼接上prefix(前缀)与suffix(后缀),即“ /WEB-INF/hello.jsp”,在/WEB-INF下找到hello.jsp页面,返回到DispatcherServlet(前端控制器);

10、DispatcherServlet(前端控制器)将视图响应给用户。

在整个过程中,前端控制器起到用于接收请求,响应结果,相当于转发器,中央处理器,减小向组件间的耦合度。

posted @ 2019-05-09 13:41  LikFre  阅读(148)  评论(0编辑  收藏  举报