zoukankan      html  css  js  c++  java
  • 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(前端控制器)将视图响应给用户。

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

  • 相关阅读:
    数据共享之死锁
    响应式菜单制作
    工作日志2014-07-01
    Thinkphp 无法使用-&gt;order() 排序的两种解决的方法!
    C#
    HDU1232 畅通project 并查集
    Cocos2d-x优化中图片优化
    1.3.4 设计并发友好的应用程序
    UIView的层介绍
    《鸟哥的Linux私房菜-基础学习篇(第三版)》(三)
  • 原文地址:https://www.cnblogs.com/YpfBolg/p/10837990.html
Copyright © 2011-2022 走看看