1.1 接口Servlet

今天我们开始一个有趣的新话题——servlets。正是在 Java 中添加了 servlet,Java 才成为大型服务器应用程序的事实标准。世界上 80% 的企业软件都是用 Java 编写的。而在中国,一切都是100%。那么什么是servlet?

Servlet 正是将 Java 程序转换为 Web 服务并允许它处理来自客户端的请求的东西。是这样的……

上世纪 90 年代,万维网出现后,立即出现了网络客户端(浏览器)和网络服务器。Web 服务器通常只是简单地分发它们在 Internet 上存储的文件:html 页面、脚本、图片等。

在某个时候,每个人都得出结论,有必要让双方都变得更聪明。JavaScript 被添加到 HTML 页面,插件被添加到服务器 -响应特定请求而调用的特殊脚本,使服务器的行为更加灵活和智能。

所以servlet就是这样一个Java 插件,内置Java web-server并允许它在某些页面请求时执行 Java 代码。这段由从 Servlet 类继承的类表示的 Java 代码已经实现了其开发人员的预期。

正如您所知,最流行的 Java Web 服务器是Tomcat。顺便说一句,为了纪念卡通“汤姆和杰瑞”中的猫汤姆而命名。

Tomcat 如何与 servlet 交互?事实上,这个过程是标准化的,称为servlet 生命周期。其中,servlet是一个可加载对象,web服务器是一个servlet容器

如果 servlet 尚未加载,则:

  1. servlet 类由容器加载。
  2. 容器创建 servlet 类(对象)的实例。
  3. 容器调用init()servlet 对象上的方法。该方法仅被调用一次。

标准工作周期 -服务客户请求

  • 每个请求都在单独的线程中处理。
  • 容器调用service()servlet 上的一个方法并在那里传递 ServletRequest 和 ServletResponse 对象。
  • 要终止 servlet,需要destroy()在 servlet 对象上调用一个方法。它只被调用一次。

servlet 终止的原因有很多:

  • 程序员重新启动 web 服务器,有必要优雅地关闭所有 servlet。
  • 程序员加载新版本的 servlet,必须正确卸载旧版本。
  • 等等。

请记住最主要的事情:Web 服务器及其 servlet 应该可以无故障地工作并重新启动数月,每分钟处理数千个请求。因此,加载、工作和卸载 servlet 的代码应该始终编写得非常高质量。

1.2 HttpServlet类

Servlet 类的存在是为了标准化 servlet 和容器的工作方式。程序员不直接使用此类。好吧,他们很少工作。最常用的类HttpServlet继承自Servlet。

这个类有几个对我们有用的方法。你会经常使用它们:

方法 描述
1个 init() 加载 servlet 时调用一次
2个 destroy() 卸载 servlet 时调用一次
3个 service(HttpRequest, HttpResponse) 为 servlet 的每个新请求调用
4个 doGet(HttpRequest, HttpResponse) 为 servlet 的每个新 GET 请求调用
5个 doPost(HttpRequest, HttpResponse) 调用 servlet 的每个新 POST 请求
6个 doHead(HttpRequest, HttpResponse) 为 servlet 的每个新 HEAD 请求调用
7 doDelete(HttpRequest, HttpResponse) 调用 servlet 的每个新 DELETE 请求
8个 doPut(HttpRequest, HttpResponse) 为 servlet 的每个新 PUT 请求调用

init()和方法destroy()继承自 Servlet 类。因此,如果您决定在您的 servlet 中覆盖它们,您还需要从基类中调用它们的实现。该命令用于此super.method name()

服务小程序示例:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Getting the parameter “secret” from request
        String secret = request.getParameter("secret");
 
        // Put parameter “secret” into Http-session
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Print HTML as response for browser
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Header</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet example "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

1.3 service(HttpServletRequest, HttpServletResponse)方法

如果从 servlet 的角度来看客户端请求的处理,那么事情是这样的。

对于每个客户端请求,容器(Web 服务器)创建HttpServletRequest和对象HttpServletResponse,然后调用service(HttpServletRequest request, HttpServletResponse response)相应的 servlet 上的方法。将这些对象传递给它,以便该方法可以从中获取必要的数据request并将工作结果放入response.

该方法service()具有默认实现。如果没有重新定义,那么它将被执行。他就是这么做的。

该方法service()根据请求(GET、POST、...)确定HTTP方法类型,并调用请求对应的方法。

方法 描述
1个 service(HttpRequest, HttpResponse) 为 servlet 的每个新请求调用
2个 doGet(HttpRequest, HttpResponse) 为 servlet 的每个新 GET 请求调用
3个 doPost(HttpRequest, HttpResponse) 调用 servlet 的每个新 POST 请求
4个 doHead(HttpRequest, HttpResponse) 为 servlet 的每个新 HEAD 请求调用
5个 doDelete(HttpRequest, HttpResponse) 调用 servlet 的每个新 DELETE 请求
6个 doPut(HttpRequest, HttpResponse) 为 servlet 的每个新 PUT 请求调用

在您的班级中,您可以重新定义一个方法service(),也可以保留它,然后根据需要重新定义方法doGet()doPost()...。