设为首页 收藏本站
查看: 1155|回复: 0

[经验分享] 【spring mvc】springmvc在tomcat中的执行过程

[复制链接]

尚未签到

发表于 2017-12-26 07:45:43 | 显示全部楼层 |阅读模式
  一、WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象(每个web应用程序唯一),它代表当前web应用web容器提供其一个全局的上下文环境,其为后面的spring IoC容器提供宿主环境;
  二、读取web.xml
  服务器软件或容器如(tomcat)加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param >> listener >> fileter >> servlet​。(同类多个节点以出现顺序依次加载)
  1、ServletContext创建后,通过启动WebApplicationContext的Servlet(org.springframework.web.context.ContextLoaderServlet)或Web容器监听器(org.springframework.web.context.ContextLoaderListener)触发初始化WebApplicationContext事件,这个就是spring的ioc容器;(application context的初始化过程,可参考:http://www.cnblogs.com/hantalk/p/6647772.html)
DSC0000.png

DSC0001.png

  2、容器会读取context-param(springmvc中可以没有这个context-param,即WebApplicationContext不用配置具体数据),spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,context-param为属性value对并存入servletContext;
  servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context);
  例如:
  

<context-param>  <param-name>contextConfigLocation</param-name>
  <param-value>
  classpath:spring-common-config.xml,
  classpath:spring-budget-config.xml
  </param-value>
  
</context-param>
  

  3、读取listener创建监听,根据指定的类路径来实例化过滤器filter;
  4、初始化web.xml中的dispatcherservlet
  首先,利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE从ServletContext中获取之前的WebApplicationContext作为自己上下文的parent上下文。
  然后,读取/WEB-INF/[servlet名字]-servlet.xml文件,初始化自己持有的上下文。初始化完毕后,spring也将dispatcherservlet的上下文存到ServletContext中。
  DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,读下面代码,可以在initStrategies方法中看到主要职责如下:
  1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
  2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
  3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
  4、通过ViewResolver解析逻辑视图名到具体视图实现;
  5、本地化解析;
  6、渲染具体的视图等;
  7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
  

public>//实现子类的onRefresh()方法,该方法委托为initStrategies()方法。  
    @Override
  protected void onRefresh(ApplicationContext context) {
  initStrategies(context);
  }
  //初始化默认的Spring Web MVC框架使用的策略(如HandlerMapping)
  protected void initStrategies(ApplicationContext context) {
  initMultipartResolver(context);
  initLocaleResolver(context);
  initThemeResolver(context);
  initHandlerMappings(context);
  initHandlerAdapters(context);
  initHandlerExceptionResolvers(context);
  initRequestToViewNameTranslator(context);
  initViewResolvers(context);
  initFlashMapManager(context);
  }
  
}
  

  三、具体的请求处理
DSC0002.png

  1、首先用户发送请求http://localhost:9080/springmvc-chapter2/hello到web容器,web容器根据“/hello”路径映射到DispatcherServlet(url-pattern为/)进行处理;
  2、当收到请求时,dispatcherservlet将请求交给handlerMapping,让它找出对应请求的handlerExecutionChain对象,handlerExecutionChain返回拦截器和处理器。handlerExecutionChain是一个执行链,它包含一个处理该请求的handler(处理器,就是代码中的xxxController),同时还可能包括若干个对该请求实施拦截的handlerInterceptor(拦截器);
  3、SimpleControllerHandlerAdapter将HandlerExecutionChain中的处理器(xxxController)适配为SimpleControllerHandlerAdapter;
  4、SimpleControllerHandlerAdapter将会调用xxxController中的具体方法进行功能处理,该处理方法返回一个ModelAndView给DispatcherServlet;handlerAdapter对外有三个方法API:
  //判断这个adapter是否可以处理这类handler
  boolean supports(Object handler);
  //封装handler处理request的逻辑
  ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
  long getLastModified(HttpServletRequest request, Object handler);
  handlermapping是把请求找到对应的处理对象,具体用什么方法处理它不管。而handlerAdapter正是调用具体的方法处理请求。
  5、dispatherServlet通过配置文件中的ViewResolver,把controller中的modelAndview的数据传递到前端模板freemarker/velocity;
  6、前端模板渲染,将在处理器传入的模型数据在视图中展示出来;
  7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
  参考:
  http://www.imooc.com/article/5385
  https://segmentfault.com/q/1010000000210417
  http://sishu ok.com/forum/blogPost/list/5188.html(去掉空格)
  http://sishuo k.com/forum/blogPost/list/5160.html(去掉空格)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428105-1-1.html 上篇帖子: maven集成tomcat插件以及乱码解决 下篇帖子: Tomcat闪退的解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表