zoukankan      html  css  js  c++  java
  • --------------springMVC的开篇,以及底层执行流程,配置视图解析器,静态资源的访问,流程图,工作原理

    springMVC:

    一:创建第一个项目
    01.引入需要的jar包
    web webmvc context context-support
    02.在web.xml文件中 配置我们需要的核心控制器 DispatcherServlet
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    注意点:
    <servlet-name>springmvc</servlet-name>
    那么我们springmvc的核心配置文件名称 必须是 springmvc-servlet.xml
    因为底层明确了文件的名称是 <servlet-name>-servlet.xml
    这个文件的位置 现阶段 只能在web-inf 下面

    03.在web-inf文件下创建需要的核心配置文件 springmvc-servlet.xml
    头部信息增加
    xmlns:mvc="http://www.springframework.org/schema/mvc"

    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    04.书写一个controller(其实就是我们的servlet) 继承 AbastractController


    二:第一个项目的整体流程

    01.用户在index.jsp页面中点击Hello超链接
    02.点击之后请求路径是 /hello <a href="hello">Hello</a>
    03.会被我们web.xml文件中配置的DispatcherServlet拦截
    04.默认执行doDispatch()
    HandlerExecutionChain mappedHandler = null; 处理器执行链
    mappedHandler = this.getHandler(processedRequest); 根据用户的请求获取处理器执行链
    4.1.跟进getHandler()看到了
    for (HandlerMapping hm : this.handlerMappings)
    handlerMappings是一个List<HandlerMapping>

    HandlerExecutionChain handler = hm.getHandler(request);
    hm是List<HandlerMapping>是集合中的一个元素===》HandlerMapping
    根据用户的请求在处理器映射器中查询Handler
    4.2.跟进getHandler()看到了
    Object handler = getHandlerInternal(request); 获取需要执行的Handler

    HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);

    4.3.跟进getHandlerExecutionChain
    发现方法中有处理器拦截器
    for (HandlerInterceptor interceptor : this.adaptedInterceptors)

    所以mappedHandler(处理器执行链)中包含一个即将执行的handler和一些列的interceptor(拦截器)

    05.HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    获取处理器适配器
    跟进 getHandlerAdapter()
    for (HandlerAdapter ha : this.handlerAdapters)
    handlerAdapters是一个List<HandlerAdapter>
    ha就是List<HandlerAdapter>其中一个元素 就是HandlerAdapter

    if (ha.supports(handler)) {
    return ha;
    }
    5.1:跟进supports
    进入了HandlerAdapter====》是一个接口!
    接口有5个实现类!默认执行3个!

    在webmvc的jar包中的根目录下找到DispatcherServlet.properties

    默认的处理器映射器的配置
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

    默认的处理器适配器的配置
    org.springframework.web.servlet.HandlerAdapter
    =org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    5.2:回到doDispatch()
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    跟进handle()发现 HandlerAdapter====》是一个接口的handle()有5个实现
    首先进入HttpRequestHandlerAdapter,我们的HelloController和HttpRequestHandler没关系,继续执行下一个Adapter
    进入SimpleControllerHandlerAdapter,我们的HelloController继承了AbstractController,
    AbstractController实现了Controller! 产生了关系!

    5.3:跟进SimpleControllerHandlerAdapter类中的handler()

    return ((Controller) handler).handleRequest(request, response);
    只有转换成Controller才有handleRequest这个方法!
    关键是我们的HelloController中的方法名称是handleRequestInternal()

    001.只有转换成Controller才有handleRequest这个方法!
    002.AbstractController重写了Controller的handleRequest
    003.但是返回的是一个handleRequestInternal()
    004.我们的HelloController中的方法名称是handleRequestInternal()
    005.所以执行Controller的handleRequest就是执行HelloController中的handleRequestInternal()


    三:配置视图解析器
    为什么?
    01.我们controller中肯定会返回很多页面
    02.页面的前缀/WEB-INF ==>安全
    03.后缀都是以.jsp结尾

    我们现在统一把所有的前缀和后缀写在一个地方!
    只要是后台有返回页面,我会自动的给页面加前缀和后缀!
    这时候就需要我们配置视图解析器


    有疑问?
    通关观察dispatcherServlet.properties文件我们看到了有默认的试图解析器
    就是InternalResourceViewResolver!
    那为什么我们还需要设置?
    因为我们需要对InternalResourceViewResolver视图解析器中的属性赋值!

    InternalResourceViewResolver的父类中 UrlBasedViewResolver的属性没有值

    private String prefix = "";
    private String suffix = "";


    四:静态资源的访问
    问题的引入:

    01.我们在web.xml文件中配置核心控制器的url-pattern是什么? 是 /
    02./ 不能匹配 .jsp .js .css .png....后缀路径
    03.如果我们项目中需要这些文件,是不能使用的!

    所以需要设置允许静态资源的访问!

    解决方式3种

    01.去tomcat服务器中找到conf/web.xml中有如下配置
    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern> 不会匹配静态文件
    </servlet-mapping>

    在web.xml文件中配置
    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>

    问题?
    如果我们的图片后缀比较多!那么我们的web.xml文件中的节点是不是很多!


    02.在springmvc核心配置文件中配置 推荐使用
    注释掉web.xml文件中的配置

    03.在springmvc核心配置文件中配置
    <mvc:default-servlet-handler/>

    五、springmvc的流程图:

    (1)

     工作yuanl

    (2)

    (3)--------------------------------------------------------------------------------------------------------------------------------------------------

    (4)底层代码实现图:

    六、springMVC的工作原理:

    SpringMVC的工作原理:

    1. SpringMVC所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。
    2. DispatcherServlet查询一个或多个HandleMapping,找到处理请求的Controller.
    3. DispatcherServlet提交到目标Controller.
    4. Controller进行业务逻辑处理后,会返回一个ModelAndView
    5. Dispatcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
    6. 视图对象负责渲染返回给客户端。
  • 相关阅读:
    分布式日志收集系统: Facebook Scribe之日志收集方案
    20111030 19:37 杨辉三角形 (java)
    pku acm 1833 排列
    俞敏洪郑大演讲经典语句
    自己在inode客户端的大量问题(不断更新中)(20120223 21:24 )
    智力测验:硬币问题
    windows up可以更新但是无法上网的一天挣扎
    hdu1754 I Hate It
    acm算法资源网站
    pku3041 Asteroids
  • 原文地址:https://www.cnblogs.com/laosunlaiye/p/7717407.html
Copyright © 2011-2022 走看看