我对 SpringMVC 的一些误解
引言
刚考完期末,再也不用考试啦!!!
最近学习了慕课网的实战课《手写SpringMVC
,剑指开源框架灵魂》。
spring-boot
太过智能了,智能到我们完全不用去管底层是如何实现的,都可以很轻易地去开发一款web
应用。
最近将本课程和《看透Spring MVC
》结合起来学习,感觉受益匪浅,同时,纠正了我之前对SpringMVC
的一些误解。
误解
洪荒时代的Java Web
当年,开发Java Web
都需要手动去实现Servlet
。
public class TestServlet implements Servlet { @Override public void init(ServletConfig config) throws ServletException { } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { } @Override public String getServletInfo() { return null; } @Override public void destroy() { } }
Servlet
中规定了五个方法。
init
初始化方法,service
业务逻辑方法,destroy
销毁方法。
在web.xml
文件中配置路由到Servlet
之间的映射,也就是说,我们没开发一个接口,都需要写一个Servlet
,然后配一遍xml
。
<!-- 基本配置 --> <servlet> <servlet-name>test</servlet-name> <servlet-class>TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
所以就导致了项目中会有很多的Servlet
,以及极其冗长的xml
配置文件。
执行流程
整体执行流程就如下图所示:
当来请求时,客户端和服务端的Tomcat
建立连接,Tomcat
去找web.xml
,然后根据其中定义的url
到Servlet
的映射,去初始化相应的Servlet
,然后调用service
方法处理业务,返回。
最开始对SpringMVC
的多线程不是很理解,现在终于明白了,多线程其实并不是SpringMVC
管理的,而是当有一个新的客户端建立连接时,Tomcat
就会新建一个线程去调用Servlet
的方法处理请求,所以多线程其实是Tomcat
的多线程。
SpringMVC
SpringMVC
为了解决Servlet
太多的问题,引入了DispatcherServlet
,进行统一调度。
SpringMVC
定义DispatcherServlet
接管/
,即所有请求,内部再将请求分发给各个HandlerMapping
,通俗来说就是控制器中的方法。
总结
好读书,不求甚解。 ---晋·陶渊明《五柳先生传》做开发,不可不求甚解。