刚考完期末,再也不用考试啦!!!
最近学习了慕课网的实战课《手写 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 为了解决 Servlet 太多的问题,引入了 DispatcherServlet ,进行统一调度。
SpringMVC 定义 DispatcherServlet 接管 / ,即所有请求,内部再将请求分发给各个 HandlerMapping ,通俗来说就是控制器中的方法。
做开发,不可不求甚解。