spring mvc处理请求过程

1、    首先客户端发送一个HTTP请求,Web服务器接收这个请求,如果匹配DispatcherServlet的请求映射路径,web容器将请求转交给DispatcherServlet处理。

2、    DispatcherServlet接收到请求,根据请求信息(包括URL,HTTP方法,请求报文,请求参数,cookie等)及HandlerMapping的配置找到对应的请求处理器(Handler),在spring MVC中并没有定义一个Handler接口,任何一个object都可以成为请求处理器。

3、    通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler,HandlerAdapter负责对各种Handler方法调用。

4、    处理器完成业务逻辑后返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名与模型数据信息。

5、    DispatcherServlet通过ViewResolver完成逻辑视图名到真实视图对象的解析工作。

6、    当得到真实对象的Veiw,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。

配置DispatcherServlet

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

配置了<servlet-name>为springmvc,DispatcherServlet默认自动加载/WEB-INF/springmvc-servlet.xml(即<servlet-name>-servlet.xml)的spring配置文件,启动web层spring容器。

多个spring容器之间可以设置为父子容器,实现良好解耦,在spring mvc中,web层spring 容器将作为业务层spring容器的子容器,即web层容器可以引用业务层容器的bean,而业务层却访问不到web层容器的bean。

DispatcherServlet参数设置

如果需要对DispatcherServlet的默认规则修改,可以通过<servlet>的<init-param>指定

namespace

DispatcherServlet对应命名空间,默认为<servlet-name>-servlet,显示指定该属性后,配置文件对应路径为/WEB-INF/<namespace>.xml,如/WEB-INF/springmvc.xml

contextConfigLocation

如果DispatcherServlet上下文对应的spring配置文件有多个,可以使用该属性指定配置文件位置,如:”classpath:bb1.xml,classpath:bb2.xml”

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

<init-param>

<param-name>

contextConfigLocation

</param-name>

<param-value>

/WEB-INF/springmvc.xml

</param- value>

</init-param>

</servlet>

DispatcherServlet内部逻辑

DispatcherServlet通过initStrategies方法装配springmvc组件

protected voidinitStrategies(ApplicationContext context) {

initMultipartResolver(context);//初始化文件上传解析器

initLocaleResolver(context);//初始化本地解析器

initThemeResolver(context);//初始化主题解析器

initHandlerMappings(context);//初始化处理器映射器

initHandlerAdapters(context);//初始化处理器适配器

initHandlerExceptionResolvers(context);//初始化异常解析器

initRequestToViewNameTranslator(context);//初始化请求到视图名称解析器

initViewResolvers(context);//初始化视图解析器

initFlashMapManager(context);

}

initStrategies()方法在WebApplicationContext初始化后自动执行,此时spring上下文中的Bean已经初始化完成,该方法通过反射机制查找并装配spring容器中用户显示自定义的组件Bean,如找不到再装配默认组件实例。

org.springframework.web.servlet类路径下DispatcherServlet.properties指定了默认组件

#本地解析器

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

#主题解析器

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

#处理器映射器 (2个)

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

#异常解析器

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\

org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

#视图解析器

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

如果用户希望采用非默认类型组件,则需要在spring配置文件中配置自定义组件bean,spring mvc一旦发现上下文中拥有自定义组件,就不会使用默认组件。

DispatcherServlet初始化后,会自动扫描上下文的bean,根据名称或类型匹配机制查找自定义组件,找不到则使用DispatcherServlet.properties指定的默认组件

spring mvc请求过程的更多相关文章

  1. spring MVC 运行过程

    以Tomcat为例,想在Web容器中使用Spirng MVC,必须进行四项的配置: 1.修改web.xml, 2.添加servlet定义.编写servletname-servlet.xml( serv ...

  2. Spring MVC启动过程(1):ContextLoaderListener初始化

    此文来自https://my.oschina.net/pkpk1234/blog/61971 (写的特别好)故引来借鉴 Spring MVC启动过程 以Tomcat为例,想在Web容器中使用Spirn ...

  3. Spring MVC请求执行流程

    学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了.Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就 ...

  4. spring mvc 启动过程及源码分析

    由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...

  5. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  6. spring mvc 请求转发和重定向

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  7. mvc请求过程总结

    前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...

  8. Spring MVC请求流程

    Spring MVC 发起请求到前端控制器DispathServlet 前端控制器请求处理器映射器 handerMapping查找handler 处理器映射器handerMapping像前端控制器返回 ...

  9. Spring MVC请求参数绑定

    所谓请求参数绑定,就是在控制器方法中,将请求参数绑定到方法参数上 @RequestParam 绑定单个请求参数到方法参数上 @RequestParam("id") Integer ...

随机推荐

  1. Hotspot参数分析

    -XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析 -Xmx与-Xms 虚拟机堆参数 -Xoss 设置本地方法栈 ...

  2. MySQL数据库相关操作

    查看数据库 mysql> SHOW DATABASES; 选择数据库 mysql> USE 数据库名称: 查看当前数据库 mysql> select database(); -- 第 ...

  3. UML 类图几种关系的总结(图文并茂、案例详解)

    听语音 | 浏览:2831 | 更新:2017-03-01 13:06 1 2 3 4 5 6 7 分步阅读 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(R ...

  4. java正则表达式(字符串)

    参考:http://blog.csdn.net/kdnuggets/article/details/2526588 补充: ?号的使用: ^/branch/([a-z]+[/]?)$  可以匹配 /b ...

  5. STL基础1:vector

    #include <iostream> #include <vector> #include <algorithm> #include <numeric> ...

  6. R语言2版本3版本安装

    ./configure --prefix=/YZpath/public/software/R/R-3.5.0 --with-readline=no --with-x=no make make inst ...

  7. python中的open( )函数

    函数原型 open(file, mode=‘r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) buff ...

  8. iOS中堆和栈的区别

    管理方式: 对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来讲,释放工作有程序员控制,容易产生memory Leak. 申请大小: 栈:在Windows下,栈是向低地址扩展的数据结构,是一块 ...

  9. 添加/删除-HTML DOM 常用对象 -BOM-打开和关闭窗口- history-location

    1. 添加/删除 3步: 1. 添加一个空元素 var a=document.createElement("a"); <a></a> 2. 定义元素的关键属 ...

  10. 2019.02.09 codeforces451 E. Devu and Flowers(容斥原理)

    传送门 题意简述:给出n堆花,对于第j堆,有f[j]朵花,每堆花的颜色不同,现在要从中选出s朵,求方案数. 思路: 假设所有花没有上限直接插板法,现在有了上限我们用容斥扣掉多算的 状压一下再容斥:fi ...