发表于: 2020-05-15 23:31:07

1 1363


今天完成的事情:

1.jsp 提交的中文乱码的问题今天经过排查已经能确定是 tomcat 配置的问题,使用 jetty 时一切正常。具体是 tomcat 的什么配置不对我还没有头绪。


2.师兄今天问了我一个问题,SpringMVC 中一个请求处理的流程是怎样的?

想想自己确实不太清楚,所以昨天整个 debug 的流程也基本都是抓瞎,网上搜到什么就试什么。

最近完成了 SpringMVC 的一部分步骤,对这个框架有了一些实践,正好来补充一下细节。


收获:

1.SpringMVC 处理请求的流程:

(a)客户端发送一个 HTTP 请求,web 服务器接受到请求,开始匹配 DispatcherServlet 的请求映射路径,并且转交给 DispatcherServlet 来处理了。

        DispatcherServlet 对应到我的项目中就是 web.xml 中的如下部分:

<!--配置SpringMVC 中的 DispatcherServlet-->
<!--
把请求交给 Spring 框架中的 DispatcherServlet 处理,由他来找到请求对应的 Controller
请求交给这个 Controller 处理。
-->
<servlet>
<servlet-name>SpringMVC-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化参数:作用是配置SpringMVC配置文件的位置和名称-->
 <init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>SpringMVC-dispatcher</servlet-name>
<!-- 默认匹配所有的请求 -->
 <url-pattern>/</url-pattern>
</servlet-mapping>


(b)DispatcherServlet 接收到请求之后根据请求的信息(包括URL, HTTP方法,请求报文头与请求参数Cookie等)以及 HandlerMapping 的配置找到处理请求的处理器。


这个 HandlerMapping 我去搜了一下,嗯,有点复杂。不过我还是可以大致了解一下它做了什么。

首先我们发出的请求都有一个请求头,里面记录了这个请求是个什么方法(get post delete put patch····),还有我们发出请求的链接也就是 url。根据这些信息 HandlerMapping 就开始根据 @Controller 注解的类中的 @RequestMapping 注解来建立 request 与 method(这个地方很多资料描述为 Handler,我不太习惯) 之间的关系(也就是建立映射)。


(c)如果在映射表中完成了匹配那就是找到了对应的 controller(也就是很多资料描述的 Handler),处理权就交给了这个 controller,由它对应的方法进行具体的调用。


(d)controller 下对应的方法完成了数据处理之后就会返回一个 ModelAndView() 对象(也有可能是 String,Model 或者其他的)给 DispatcherServlet。


(e)DispatcherServlet 再把 ModelAndView 转化为真正的视图 View。


(f)将视图返回给客户端。

以上就是我所理解的大致流程,我可能理解有一点偏差,烦请师兄指正(你懂我意思吧


遇到的问题:

我在搜索 web.xml 配置的时候发现很多人的配置是这样的:

  1. <web-app>  
  2.   
  3.     <listener>  
  4.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  5.     </listener>  
  6.   
  7.     <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <!-- 根上下文的配置 -->  
  10.         <param-value>/WEB-INF/root-context.xml</param-value>  
  11.     </context-param>  
  12.   
  13.     <servlet>  
  14.         <servlet-name>app1</servlet-name>  
  15.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  16.         <init-param>  
  17.             <param-name>contextConfigLocation</param-name>  
  18.             <!-- app1 专属的的子上下文 -->  
  19.             <param-value>/WEB-INF/app1-context.xml</param-value>  
  20.         </init-param>  
  21.         <load-on-startup>1</load-on-startup>  
  22.     </servlet>  
  23.   
  24.     <servlet-mapping>  
  25.         <servlet-name>app1</servlet-name>  
  26.         <url-pattern>/app1/*</url-pattern>  
  27.     </servlet-mapping>  
  28.   
  29. </web-app>  

然后我的配置根本就没有 listener 与 context-param 的部分,明天仔细研究一下。


明天的计划:

1. 学习 SpringMVC 的配置,很详细那种。


想起来基本上每个日报的明日计划都是立 flag,说了肯定就没做了····



返回列表 返回列表
评论

    分享到