码迷,mamicode.com
首页 > 编程语言 > 详细

springMVC学习一 工作机制

时间:2018-10-13 13:42:22      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:根据   string   用户   请求   映射   不用   应该   for   span   

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

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

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

springMVC学习一 工作机制

标签:根据   string   用户   请求   映射   不用   应该   for   span   

原文地址:https://www.cnblogs.com/cplinux/p/9782515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!