发表于: 2019-10-17 22:10:04

1 889


今天完成的事情:了解spring mvc在tomcat中的执行过程,在服务器上使用resin部署项目
明天计划的事情:继续任务二
遇到的问题:今天踩到的坑比较多,首先是web.xml头部不规范,就直接给删了。然后就是get函数不存在,无法跳转jsp页面。在这期间把代码的资源文件整了个大换血,resin也重装了还是没能解决问题。查看日志发现日志已经输出数据,修改和添加页面也能正常执行,就查询页面无法跳转

查看查询页面的代码发现这里有个get方法,应该就是报错的原因

直接改成list后终于解决问题

很奇怪的是在本地都能跑通,在服务器使用tomcat和jetty也能部署,就是使用resin时出错了。

也很感谢师兄陪我踩了一下午的坑

收获:


spring mvc在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容器

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

例如:


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来解析。

三.具体的请求处理


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:

handlermapping是把请求找到对应的处理对象,具体用什么方法处理它不管。而handlerAdapter正是调用具体的方法处理请求。

5、dispatherServlet通过配置文件中的ViewResolver,把controller中的modelAndview的数据传递到前端模板freemarker/velocity;

6、前端模板渲染,将在处理器传入的模型数据在视图中展示出来;

7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束




返回列表 返回列表
评论

    分享到