今日看《spring解密》书中,看完spring ioc内容,看到书的后面介绍了spring mvc 的内容,觉得书中spring细分知识挺详细且多的,想换个思路再继续看aop,就看了看 作者讲的Spring -mvc知识,结果看的过瘾,把之前学Spring -mvc时的知识感觉串联了起来, 书是2009年出版的sping 的版本 就到了2.5,如今spring 已经5.x了,整理一下自己的笔记写出来。文章为记录型不是教程型,读者注意些,想看详细具体的教程,网上挺多的,不必在我这花时间。
先上图👇
相比更加具体
简要分析执行流程
HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
在web.xml中的配置,贴自己练习项目中 使用ssm框架,*.do 的url 请求。
<?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 进行配置,但内容多起来就会显得臃肿,因此使用外加配置的方式.
<?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 删除。