为什么还需要学习Servlet
我从Java SE转向Java Web学习的时候,心中就总有那么一个疑问,main函数去哪里了?为什么在学习Java SE的时候,总是从main函数开始运行,而在学习Java Web的时候,按照步骤莫名奇妙的就可以跑起来了。这个疑问之前困扰了我很久。
后面渐渐的Spring的兴起,渐渐的main函数又出现了。不得不说,Spring使得Java Web的学习曲线平滑了少许。不过现在回过头来看,对于Java EE来说,main函数已经封装在了 Web的服务器上了,也就是我们常见的Tomcat,还是Weblogic这样的中间件。而我们在编写Servlet的时候,就是在这些Web服务器的约定上进行编程,main函数的已经委托给了中间件来实现。
回过来看今天的Spring Boot,它帮我们封装了Tomcat,又对Servlet进行了封装。所以我们在开发Spring 项目的时候,就可以大大地降低了开发难度,提高开发的效率。
回到主题,为什么我们还需要学习Servlet呢?
尽管基于Sevrlet的JSP技术开始淘汰,但是追本溯源,Spring Boot的项目底层还是基于Servlet实现的,因此我们还是有必要对其进行学习
Servlet的本质
Servlet 是JavaEE规范的一种,其本质就是一个Java 的接口,我们通过实现这个接口,来达到我们的目的。Tomcat 通过调用service()的方法对请求进行操作。
如下就是一个Servlet的接口
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public void destroy();
public String getServletInfo();
public ServletConfig getServletConfig();
}
service 方法主要包含了两个参数,其中一个是ServletRequest代表着请求,另外一个是ServletResponse代表着相应。
我们最常用的Servlet就是HttpServlet, 他是Servlet接口的一个实现类,我们通过实现其中的doGet()和doPost()方法来对不同的请求进行操作。而这个doGet()和doPost()方法就是在HttpServlet中在调用的。
Tomcat是如何调用Servlet的
从Servlet的本质来看,其实他只是一个接口,而传入的参数是两个对象。
但是数据传输是使用二进制进行传输的,所以Tomcat的主要作用之一就是负责处理字节流,将字节流转换成ServletRequest和ServletResponse。
在处理字节流同时,还要负责维护Socket连接。除此之外,tomcat还需要加载管理Servlet以及Request请求。
Tomcat如何调用Servlet的,整一个流程可以简化为:
- 监听网络端口
- 接受网络请求连接
- 读取网络请求字节流
- 根绝具体应用层协议解析字节流,生成统一的Tomcat Request 对象
- 将Tomcat Request对象转换成标准的ServletRequest对象
- 调用Servlet容器,得到ServletResponse
- 将ServletResponse转化成Tomcat Response对象
- 将Tomcat Response对象转成网络字节流,将相应的字节流写回给浏览器
继续将连接器细化,可以分为三个部分
- Endpoint负责提供字节流给Processor
- Processor 负责提供 Tomcat Request 对象给 Adapter
- Adapter 负责提供 ServletRequest 对象给容器