一.SpringMvc节点启动分析

  1. 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。
  2. 接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。
  3. 接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。
  4. 容器创建<listener></listener>中的类实例,即创建监听(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
  5. 在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。
  6. 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。由上面的初始化过程可知容器对于web.xml的加载过程是context-param >> listener  >> fileter  >> servlet

二、springMVC的工作原理图

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

三、context-param和init-param区别

web.xml里面可以定义两种参数:
(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:
[html] view plain copy
  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>/WEB-INF/spring/applicationContext.xml,/WEB-INF/spring/appServlet/spring-security.xml</param-value>
  4. </context-param>

(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:

[html] view plain copy
  1. <servlet>
  2. <servlet-name>MainServlet</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:applicationContext.xml</param-value>
  7. </init-param>
  8. <load-on-startup>0</load-on-startup>
  9. </servlet>

第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到
第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得.

spring框架在加载web配置文件的时候。首先加载的是context-param配置的内容,而并不会去初始化servlet。只有进行了网站的跳转,经过了DispatcherServlet的导航的时候,才会初始化servlet,从而加载init-param中的内容。

注意:1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。

2)它的值必须是一个整数,表示servlet应该被载入的顺序

2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

3)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

5)当值相同时,容器就会自己选择顺序来加载。

所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。

四、<mvc:annotation-driven /> 作用

<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。

并提供了:数据绑定支持, 
@NumberFormatannotation支持, 
@DateTimeFormat支持, 
@Valid支持,读写XML的支持(JAXB), 
读写JSON的支持(Jackson)。

第一个是HandlerMapping的实现类,它会处理@RequestMapping 注解,并将其注册到请求映射表中。

第二个是HandlerAdapter的实现类,它是处理请求的适配器,说白了,就是确定调用哪个类的哪个方法,并且构造方法参数,返回值。

那么它跟<context:component-scan/>有什么区别呢?<context:component-scan/>标签是告诉Spring 来扫描指定包下的类,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件。

而<mvc:annotation-driven/>是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean到工厂中,来处理我们的请求。

五、<mvc:default-servlet-handler /> 和<mvc:resources />

在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。

一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

<mvc:default-servlet-handler />将静态资源的处理经由Spring MVC框架交回Web应用服务器处理。而<mvc:resources />更进一步,由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

首先,<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。

其次,<mvc:resources />依据当前著名的Page Speed、YSlow等浏览器优化原则对静态资源提供优化。你可以通过cacheSeconds属性指定静态资源在浏览器端的缓存时间,一般可将该时间设置为一年,以充分利用浏览器端的缓存。在输出静态资源时,会根据配置设置好响应报文头的Expires 和 Cache-Control值。

在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽,提高程序性能。

在springMVC-servlet中添加如下配置:

<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>

六、<context:component-scan />

spring mvc配置文件必须要配置<context:component-scan/>节点,配置在spring配置文件中,会报找不到改文件

它是用来指明让springmvc容器去哪里扫描@Controller注解,只有springmvc找到了@Controller注解,springmvc才能进入Controller.

配置方式为:<context:component-scan base-package="com.taotao.controller" />

七、<mvc:view-controller />

<mvc:view-controller path="/" view-name="open/login"/>   //路径/直接跳转到login.jsp页面,不经过spring mvc控制器

   <mvc:view-controller path="/" view-name="forward:open/login.html"/>   //路径/转发到open/login.html路径
<mvc:view-controller path="/" view-name="redirect:open/login.html"/>   //路径/重定向到open/login.html路径,与前者区别在于重定向不带参数跳转
   

spring-mvc笔记1相关推荐

  1. Spring MVC笔记

    关于写几个配置文件的说明 我看到有的人把配置文件写两份: 一个是原有的applicationContext.xml,这个文件从spring2.0-2.5时一直在使用. 别一个是新加的spring MV ...

  2. Spring MVC笔记 添加错误页面

    使用Spring MVC的Web项目,可以使用DispatcherServlet来指定异常页面,下面是具体的配置: 在Spring配置文件中配置: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  3. Spring MVC 笔记

    MVC核心思想:业务数据的抽取同业务数据的呈现相分离Model-View-Controller{一种架构模式,程序分层.分工合作一种思考方式 } Spring MVC流程架构图: Spring MVC ...

  4. Spring MVC 学习笔记 对locale和theme的支持

    Spring MVC 学习笔记 对locale和theme的支持 Locale Spring MVC缺省使用AcceptHeaderLocaleResolver来根据request header中的 ...

  5. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

  6. Spring MVC 学习笔记一 HelloWorld

    Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...

  7. Spring MVC 学习笔记(整理)

    SpringMVC学习 1.概述 Spring MVC是一种基于Java实现MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行解耦,基于请求-响应模型帮助我们 ...

  8. 【Java 系列笔记】语法基础 + Spring + Spring MVC + SpringBoot + 数据结构

    Java 强化笔记目录 Java 语言基础 Java 架构师体系课程 一些课程 前端笔记:前端学习笔记 Java 语言基础 回头补基础(此基础非小白)系列,学校教的其实真的就是一些皮毛而已,怕是连门都 ...

  9. 【Spring MVC】学习笔记汇总

    Spring MVC 学习笔记汇总 Java 系列笔记:[Java系列笔记]语法基础 + Spring + Spring MVC + 数据结构 数据结构与算法笔记(这个牛逼!):<恋上数据结构& ...

  10. spring 笔记2:Spring MVC : Did not find handler method for 问题的解决

    spring 笔记2:Spring MVC : Did not find handler method for 问题的解决 参考文章: (1)spring 笔记2:Spring MVC : Did n ...

最新文章

  1. 鼠标终将消失,未来我们有哪些人机交互方式?
  2. CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]
  3. Django运行SQL语句
  4. Elasticsearch 架构原理
  5. HDU3183(RMQ问题,ST算法)
  6. kubernetes mysql ip_弄明白kubernetes中的“三种IP”
  7. AngularJS:表达式
  8. go 多行字符串_Go语言基本功,了解Go语言基础语法
  9. 【PHP学习】—创建PHP文件(一)
  10. 2021级C语言大作业 - 霓虹深渊
  11. 背景图片铺不满全屏时处理
  12. 访问itunes store的时候提示网络连接超时的解决方案
  13. PHP框架TP5.1
  14. DDD领域驱动设计详解
  15. uniapp实现签名板效果
  16. SPSS多元线性回归及逐步回归学习笔记
  17. applyTo、renderTo 区别
  18. 上计算机课的心得体会作文,计算机学习心得体会范文
  19. android 音量曲线,Android音量控制曲线
  20. 英语中最常用的252个词根

热门文章

  1. window.onload=function(){};
  2. 使用SQL命令行更改数据库字段类型
  3. DML和DQL 总结
  4. MySql join on 和 where
  5. HTML5新标签 w3c
  6. IFrame中 Forms验证超时页面跳转跳出框架 简单解决方法
  7. mysql select符合查询_MySQL SELECT 联合查询
  8. linux java执行_linux下运行java
  9. (44)FPGA条件编译(选择语句)
  10. (26)FPGA计数器设计(VHDL代码实现)