spring mvc请求过程
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请求过程的更多相关文章
- spring MVC 运行过程
以Tomcat为例,想在Web容器中使用Spirng MVC,必须进行四项的配置: 1.修改web.xml, 2.添加servlet定义.编写servletname-servlet.xml( serv ...
- Spring MVC启动过程(1):ContextLoaderListener初始化
此文来自https://my.oschina.net/pkpk1234/blog/61971 (写的特别好)故引来借鉴 Spring MVC启动过程 以Tomcat为例,想在Web容器中使用Spirn ...
- Spring MVC请求执行流程
学习Spring MVC时间有点长了,但是最近打算找工作,需要重新了解下,所以又去温故知新了.Spring MVC就是用来写web的框架,简化你写web的一些不必要的流程,让程序员能专注于业务逻辑也就 ...
- spring mvc 启动过程及源码分析
由于公司开源框架选用的spring+spring mvc + mybatis.使用这些框架,网上都有现成的案例:需要那些配置文件.每种类型的配置文件的节点该如何书写等等.如果只是需要项目能够跑起来,只 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- spring mvc 请求转发和重定向
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- mvc请求过程总结
前言 最近在思考一个问题,我的学习方法一般主要是看博客来学习新东西,但是光看,基本也没总结过,所以经常会出现这样的问题,某个知识点我知道,但是就是不能很好的表达出来,很简单的东西往往都不知道如何简短精 ...
- Spring MVC请求流程
Spring MVC 发起请求到前端控制器DispathServlet 前端控制器请求处理器映射器 handerMapping查找handler 处理器映射器handerMapping像前端控制器返回 ...
- Spring MVC请求参数绑定
所谓请求参数绑定,就是在控制器方法中,将请求参数绑定到方法参数上 @RequestParam 绑定单个请求参数到方法参数上 @RequestParam("id") Integer ...
随机推荐
- C#在Winform程序中显示QQ在线状态
首先,引入必要的命名空间 using System.Windows.Forms; using System.Net; 其次,在Form中拖入一个PictureBox控件,并设置其SizeMode为A ...
- Java 使用 jacob 将 word 文档转换为 pdf 文件
网上查询了许许多多的博客,说利用 poi.iText.Jsoup.jdoctopdf.使用 jodconverter 来调用 openOffice 的服务来转换等等,我尝试了很多种,但要么显示不完全, ...
- where
(二)WHERE //where不单独使用,与match,optional match,start,with搭配 where 与match,optional match 一起用,表示约束 where ...
- jmeter脚本录制的两种方式
完成一次完整的性能测试: 1.创建用户: 2.选择协议(HTTP) 3.使用工具去模拟协议操作(1.手工编写(抓包工具):2.工具自带录制) 4.运行工具进行压力测试
- wepy中页面的跳转
1.在pages中创建好页面之后,需要在app.wpy中的config中配置好页面路由:2.如果跳转的按钮在page页面中 this.$navigate({url:"content" ...
- js实现多标签页效果
点击导航按钮切换div的内容 html代码: <div class="tabs"> <ul id="tab"> <li>&l ...
- Spring整合jedis 集群模式
引入jedis依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- 20155312 2016-2017-2《Java程序设计》课程总结
20155312 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:做中学learning by doing个人感想 ...
- 7月底的list
多校的新姿势: 超大数比较 置换群 树归 莫比乌斯反演 7月26日做了的list: a.补了多校的两道题. b.学了如何比较特别多特别大的数 c.看了波循环群 d.看了点kmp 7月27想做的li ...
- Codeforces 1098 简要题解
文章目录 前言 A题 B题 C题 D题 E题 传送门 前言 没错因为蒟蒻太菜了这场的最后一道题也咕掉了,只有AAA至EEE的题解233 A题 传送门 题意简述:给出一棵带点权的树,根节点深度为111, ...