发表于: 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 配置的时候发现很多人的配置是这样的:
- <web-app>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <!-- 根上下文的配置 -->
- <param-value>/WEB-INF/root-context.xml</param-value>
- </context-param>
- <servlet>
- <servlet-name>app1</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <!-- app1 专属的的子上下文 -->
- <param-value>/WEB-INF/app1-context.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>app1</servlet-name>
- <url-pattern>/app1/*</url-pattern>
- </servlet-mapping>
- </web-app>
然后我的配置根本就没有 listener 与 context-param 的部分,明天仔细研究一下。
明天的计划:
1. 学习 SpringMVC 的配置,很详细那种。
想起来基本上每个日报的明日计划都是立 flag,说了肯定就没做了····
评论