前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring-MVC 整理

Spring-MVC 整理

原创
作者头像
猎户星座1
修改2020-06-15 17:19:51
5290
修改2020-06-15 17:19:51
举报
文章被收录于专栏:Java StudyJava Study

今日看《spring解密》书中,看完spring ioc内容,看到书的后面介绍了spring mvc 的内容,觉得书中spring细分知识挺详细且多的,想换个思路再继续看aop,就看了看 作者讲的Spring -mvc知识,结果看的过瘾,把之前学Spring -mvc时的知识感觉串联了起来, 书是2009年出版的sping 的版本 就到了2.5,如今spring 已经5.x了,整理一下自己的笔记写出来。文章为记录型不是教程型,读者注意些,想看详细具体的教程,网上挺多的,不必在我这花时间。

先上图👇

书中作者归纳的spring mvc 框架的工作的大致流程 赞
书中作者归纳的spring mvc 框架的工作的大致流程 赞

自己学习时的记录,b站秦疆老师的上课截图
自己学习时的记录,b站秦疆老师的上课截图

相比更加具体

简要分析执行流程

  1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
  • 我们假设请求的url为 : localhost:8080/SpringMVC/hello
  • 如上url拆分成三部分:
  • localhost:8080服务器域名
  • SpringMVC部署在服务器上的web站点
  • hello表示控制器
  • 通过分析,如上url表示为:请求位于服务器XXXlocalhost:8080上的SpringMVC站点的hello控制器。
  1. HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
  2. HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器为:hello。

HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。

  1. HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
  2. Handler让具体的Controller执行。
  3. Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
  4. HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
  5. DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
  6. 视图解析器将解析的逻辑视图名传给DispatcherServlet。
  7. DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
  8. 最终视图呈现给用户

在web.xml中的配置,贴自己练习项目中 使用ssm框架,*.do 的url 请求。

代码语言:html
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

<!--配置加载类路径的配置文件 -->
<context-param>
  <param-name>contextConfigLocation</param-name>    <!--该项目使用spring -sercurity 框架正常没有 -->
  <param-value>classpath*:applicationContext.xml,classpath*:spring-security.xml;</param-value>
</context-param>

  
<!--配置监听器 加载 spring容器,根据applicationContext.xml进行加载. -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
    <!--监听request的对象创建和销毁-->
   <listener>
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
   </listener>

        <!--   前端控制器 加载classpath:springmvc.xml 服务器启动时创建 servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

     <!--初始化参数 ,创建servlet的对象 ,加载springmvc的配置文件-->
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring-mvc.xml</param-value>
</init-param>

    <!--服务器启动时,让servlet 对象创建启动-->
    <load-on-startup>1</load-on-startup>

</servlet>


<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


  <!--解决中文乱码的过滤器-->

  <filter>
    <filter-name>charaterEncorndingFilte</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter>           <!--spring-security 的拦截-->
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>charaterEncorndingFilte</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


</web-app>

书中也指出了DispatcherServlet启动后将加载spring-mvc配置构建相应的webApplicationContext.该webApplicationContext

将把之前通过ContextLoaderListener加载的ROOTWebApplication作为父容器,说出了ContextLoaderListener的意义.

指向的spring-mvc的配置文件如下 , spring-mvc 使用的DispatcherServlet 为一个servlet ,正常情况下,servlet可以去配置init param 标签去 对该servlet 进行配置,但内容多起来就会显得臃肿,因此使用外加配置的方式.

代码语言:html
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop.xsd
           ">


    <!-- 扫描controller注解,需要配置一个组件扫描器  别的不扫描-->
    <context:component-scan base-package="ssm.controller"></context:component-scan>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 配置从项目根目录到指定目录一端路径 ,建议指定浅一点的目录-->
        <property name="prefix" value="/pages/"></property>
        <!-- 文件的后缀名 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--设置静态资源的不过滤-->
    <mvc:resources mapping="/css/**" location="/css/"/>
    <mvc:resources mapping="/img/**" location="/img/"/>

    <mvc:resources mapping="/plugins/**" location="/plugins/"/>

    <!--开启对springmvc的注解的支持-->
    <mvc:annotation-driven/>

    <!--
            支持aop的注解支持,aop底层使用代理技术
            JDK动态代理,要求必须要有接口
            cglib 代理,生成子类对象,proxy-target-class="true" 默认使用cglib代理

    -->
       <aop:aspectj-autoproxy proxy-target-class="true"/>



</beans>

springboot的开发中,因为maven项目中默认为有spring mvc的依赖,因此以上一下配置直接可以在yml 配置文件中使用 spring.mvc.**进行配置 如常用的:

spring.mvc.view.prefix=/WEB-INF/

spring.mvc.view.suffix=.jsp

流程总结一下哈:

根据配置web.xml 可知,所有页面的请求 都被spring-mvc的 DispatcherServlet 拦截到了,然后DispatcherServlet

根据 HandlerMapping 去找到 具体的请求对应的 controller ,然后去交给 DispatcherServlet 去调用 controller 经过开发者编写的代码, controller(当然 controller 的返回值类型为ModelAndView) 去返回 ModelAndView , 然后视图解析器ViewResolver 去根据 ModelAndView 中的页面类型 去决定 哪种类型的视觉去处理( 文本型 html ,jsp, 二进制型 excel ) 返回给 DispatcherServlet

(返回视图名) 最终DispatcherServlet去 将数据和页面去调用视图,最终显示在页面上.

以后再补 记录 spring 揭秘 第23章

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档