zoukankan      html  css  js  c++  java
  • springMVC学习一 工作机制

    springMVC下面的四大组件:

    (1)DispatcherServlet :

    前端控制器,接收所有请求 ,并把请求路径请求参数解析出来,本质是一个servlet在web.xml中配置 (如果配置"/"不包含 jsp ,如果配置成了"/*",所有请求都拦截)

    (2)HandlerMapping:

    本质是一个接口,在HandlerMapping的实现类中,有一个属性urlMap,是一个LinkedHashMap,在这个urlMap中  key就是程序员自己编写的controller(也就是处理器)的逻辑路径,例如我们用注解@RequestMapping("/test"),设置的"test",它就是urlMap中的一个key。那么value就是程序员编写的这个Controller。前端控制器(DispatcherServlet)解析出来请求路径后,就去这个处理器映射器中根据请求路径获取要执行的那个controller。

    参考别处:HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;

     下面是一个简单最早的一种配置,现在都使用注解进行controller进行配置

    <!-- 注册  处理器,也就是controller -->
        <bean id="handler" class="com.caopeng.controller.DemoController"></bean>
        
        
        <!-- 注册HandlerMapping  处理器映射器
            会根据url请求解析出应该调用哪一个 处理器,但是调用并不是处理器映射器调用
         -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="urlMap">
                <map>
                    <!-- key解析出来的请求的逻辑名
                        value-ref代表要调用的控制器
                     -->
                    <entry key="demo" value-ref="handler" ></entry>
                </map>
            </property>
        </bean>

    处理器的编写代码:早期的写法要实现Controller接口,现在都是用注解进行配置

    public class DemoController implements Controller{
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            System.out.println("执行了springmvc的控制器");
            //具备视图和传值的功能
            ModelAndView modelAndView =new ModelAndView("main");
            
            return modelAndView;
        }
    
    }

    (3)HandlerAdapter: 

    根据处理器映射器 返回的处理器, 把处理器(controller)进行调用

    配置如下:

    <!-- 注册  处理器适配器,处理器适配器会调用  处理器 
            处理器适配器可以不用配置,会走默认值
        -->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

    参考别处:HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);

    (4)ViewResovler:视图解析器.解析结果,准备跳转到具体的物理视
    参考别处:ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;

    配置如下:

    <!-- 在spring容器中 ,注册视图解析器
            同样视图解析器也可以不用配置,也会走默认值
            InternalResourceViewResolver的父类中有两个属性:prefix,suffix  代表前缀和后缀
            ModelAndView modelAndView =new ModelAndView("main");
            前缀和后缀会对ModelAndView中的参数进行拼接,拼接成"/main.jsp",
            一般请情况下,我们会使用默认的视图解析器,但是有时候我们会在WebContent下建立一个page目录用来存放
            jsp文件,此时在写ModelAndView modelAndView =new ModelAndView("main.jsp");是,需要前面加上
            page/main.jsp,为了省略page/一般会把prefix配置成page/
            
            在返回ModelAndView时,默认会走请求转发,在InternalResourceViewResolver父类UrlBasedViewResolver
            中有
            public static final String REDIRECT_URL_PREFIX = "redirect:";
            public static final String FORWARD_URL_PREFIX = "forward:";
            可以通过配置让其走重定向
            
         -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>

    下面都是参考别处;

    核心架构的具体流程步骤如下:
    1、首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
    2、DispatcherServlet——>HandlerMapping, HandlerMapping 将会把请求映射为HandlerExecutionChain 对象(包含一个Handler 处理器(页面控制器)对象、多个HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
    3、DispatcherServlet——>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
    4、HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter 将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView 对象(包含模型数据、逻辑视图名);
    5、ModelAndView的逻辑视图名——> ViewResolver, ViewResolver 将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
    6、View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
    7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

    下边两个组件通常情况下需要开发:

    Handler:处理器,即后端控制器用controller表示。

    View:视图,即展示给用户的界面,视图中通常需要标签语言展示模型数据。

    SpringMVC原理图:

    看到这个图大家可能会有很多的疑惑,现在我们来看一下这个图的步骤:(可以对比MVC的原理图进行理解)

    第一步:用户发起请求到前端控制器(DispatcherServlet)

    第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找

    第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)

    第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)

    第五步:处理器适配器去执行Handler

    第六步:Handler执行完给处理器适配器返回ModelAndView

    第七步:处理器适配器向前端控制器返回ModelAndView

    第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析

    第九步:视图解析器像前端控制器返回View

    第十步:前端控制器对视图进行渲染

    第十一步:前端控制器向用户响应结果

  • 相关阅读:
    警惕 InnoDB 和 MyISAM 创建 Hash 索引陷阱
    从头认识java-18.2 主要的线程机制(5)-守护线程与非守护线程
    leetcode
    算法学习笔记(五) 递归之 高速幂、斐波那契矩阵加速
    No WebApplicationContext found: no ContextLoaderListener registered?报错解决
    poj 3041 Asteroids (最小点覆盖)
    C语言函数--E
    APDU命令的结构和处理【转】
    Linux ALSA声卡驱动之一:ALSA架构简介【转】
    Linux 系统内核空间与用户空间通信的实现与分析
  • 原文地址:https://www.cnblogs.com/cplinux/p/9782515.html
Copyright © 2011-2022 走看看