一起养成写作习惯!这是我参与「掘金日新计划·4月更文挑战」的第19天,点击查看活动详情。
在现在的很多大学教材里都会出现一个叫Servlet的东西,网上的博客里,自己平时debug代码不小心跳进去的,都会看到这个名词。想我这样的半路出家的程序员,对这个东西的概念一直比较模糊,曾经以为就是一个web容器,具体怎么实现完全没有研究过。今天来简单探究一下。
首先,Servlet是什么?借助一些翻译app,这个词是为Java量身定制的:(尤指 Java 语言中在服务器上运行的)小型应用程序;小服务程序。看到这个概念对我过去的理解冲击很大,它首先并不是容器,只是一小段程序。那到底怎么理解呢?事实上,确实有这么一个容器,但是是装Servlet的一个容器,Servlet本身就是一个接口,业务代码实现Servlet接口后会被收集到Servlet容器中。以大家熟知的Tomcat为例:
Servlet本身可以理解为我们写的每一个Rest API,spring的框架帮我们实现了Servlet接口并注册到tomcat中。这样外部客户端来请求时就可以找到的处理方法,而不是将api后缀直接配置到http服务器中,http服务器本身就不能和业务耦合在一起。
那所谓的Servlet接口到底有哪些呢?
public interface Servlet {
    void init(ServletConfig config) throws ServletException;
    
    ServletConfig getServletConfig();
    
    void service(ServletRequest req, ServletResponse res)throws ServletException, IOException;
    
    String getServletInfo();
    
    void destroy();
}
这便是Servlet的几个关键接口,从初始化到服务的请求和返回到销毁,全部都有定义。在日常开发中,经常会有人把api的入参直接写成HttpServletRequest,然后再从这个里面获取params。倒是没有这个必要,因为spring已经帮我们绑定好了,不需要使用这么原始的类了。如果有一些大龄开发者,应该会记得当年的spring MVC需要配置一个web.xml,这里面就会配置Servlet需要的很多信息。配合这个web.xml,Servlet实现时是需要重写其中的doGet和doPost的,分别对应不同的请求方法。而现在的spring-boot把这些原始的东西全部封装了。