Servlets

 20th August 2020 at 2:19pm

Servlets 是 J2EE 中的一个概念。我感觉他是 J2EE 规范中比较底层的东西,兼容 J2EE 规范的框架,最终都必需符合 Servlets 的接口规范,比如将 Servlets API 封装整合成更易用、更强大的上层接口。它类似于 WSGI,提供了一个应用程序(你的业务代码)与 Web 容器(如 Tomcat,Websphere)间交互的方式。

一个 Servlets 需要实现 3 个函数,这 3 个函数都由 Web 容器去调用,而不是业务代码自己调用:

  • init():Web 容器启动时,会且仅会调用一次,一般做一些资源初始化
  • service():每个 HTTP 请求到达 Web 容器时,Web 容器会创建一个线程去执行这段代码
  • destroy():Servlets 生命周期结束时(比如 Web 容器停止、reload 配置),会且仅会调用一次,可以用来做清洁工作,如断开数据库连接,缓存写入磁盘等

示例如下:

package example;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet implements Servlet {
    private ServletConfig servletConfig;

    public void init(ServletConfig servletConfig) throws ServletException {
        this.servletConfig = servletConfig;
    }

    public ServletConfig getServletConfig() {
        return servletConfig;
    }

    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        servletResponse.setContentType( "text/html" );
        PrintWriter out = servletResponse.getWriter();
        out.println( "<html><head>" );
        out.println( "<title>A Sample Servlet!</title>" );
        out.println( "</head>" );
        out.println( "<body>" );
        out.println( "<h1>Hello, World!</h1>" );
        out.println( "</body></html>" );
        out.close();
    }

    public String getServletInfo() {
        return "Hello Servlet";
    }

    public void destroy() { }
}

还有一个更上层的 Servlet 类,叫 HttpServlet,多了一些 doGet(), DoPost() 函数。

参考