springmvc在tomcat中的执行过程

https://www.cnblogs.com/hantalk/p/6652967.html

 

韩小亖

【spring mvc】springmvc在tomcat中的执行过程

一、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)

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 class DispatcherServlet extends FrameworkServlet {
     //实现子类的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);
    }
}

复制代码

三、具体的请求处理

 

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) throwsException;

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(去掉空格)

  

Spring MVC是一种基于Model-View-Controller(MVC)设计模式的轻量级Web框架,它的执行过程可以分为以下几个步骤: 1. **请求到达**:客户端发送HTTP请求到服务器,这个请求会通过Apache Tomcat、Jetty等应用服务器传递给Spring MVC。 2. ** DispatcherServlet**:DispatcherServlet是Spring MVC的核心控制器,它负责接收并处理所有HTTP请求。当接收到请求时,它会解析请求的URI,并寻找相应的处理程序。 3. **URL映射**:DispatcherServlet根据配置的@RequestMapping注解将URL映射到具体的Controller方法上。如果找到了匹配的方法,就会进一步处理。 4. **Controller方法执行**:找到对应的Controller后,Spring会创建该Controller的实例(如果尚未创建),然后调用指定的方法。这里通常是业务逻辑的处理。 5. **业务逻辑处理**:Controller方法通常包含业务逻辑代码,对数据进行处理、查询数据库或者调用其他服务。 6. **模型数据填充**:Controller方法将处理结果封装成Model(视图模型),这是一个包含了数据的对象,如Java Bean。 7. **视图渲染**:Spring MVC会查找对应的ViewResolver(视图解析器),根据Model的数据和配置文件,选择合适的View(HTML页面或者其他模板引擎生成的页面)。 8. **数据绑定**:最终,视图将数据绑定到视图上,例如jsp页面,展示给用户。 9. **响应返回**:DispatcherServlet将渲染好的视图内容作为响应返回给客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值