Servlet的理解

2017-04-28  本文已影响0人  红烧排骨饭

前言

好记性不如烂笔头,而且学习了却没有做笔记总结,就不算学习。因此写了一篇文章总结一下对 Servlet的理解。

什么是 Servlet

A servlet is a small Java program that runs within a Web server.
Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

打开 Servlet.java 的源码,可以看到这一段注释。它说:Servlet 就是一个运行在 Web 服务器中的 Java 程序。servlet 可以接收和响应 Web 客户端的网络请求。

Servlet 的架构

Servlet 的继承关系

public interface Servlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
public abstract class HttpServlet extends GenericServlet

所有的 Servlet 都需要实现 Servlet 接口。Servlet 接口定义了 Servlet 的生命周期方法

init(ServletConfig config)
service(ServletRequest req, ServletResponse res)
destroy()

Servlet 初始化时会调用 init(ServletConfig config) 方法;在 service(ServletRequest req, ServletResponse res) 方法中对客户端的请求进行处理;如果 Servlet 不用了,会调用 destroy() 方法销毁,然后等待垃圾回收。

GenericServlet

为了方便编写 Servlet,创造了 GenericServlet 抽象类,只需要实现 public abstract void service(ServletRequest req, ServletResponse res) 方法即可。

HttpServlet

HttpServlet 是和 HTTP 协议有关的 Servlet,只需要重写几个 HTTP 相关的方法

和 Servlet 生命周期的相关方法

当请求到来时,会调用 service(ServletRequest req, ServletResponse res),在 HttpServlet 中方法的实现如下

public void service(ServletRequest req, ServletResponse res) {
    HttpServletRequest  request;
    HttpServletResponse response;
    
    if (!(req instanceof HttpServletRequest &&
            res instanceof HttpServletResponse)) {
        throw new ServletException("non-HTTP request or response");
    }

    request = (HttpServletRequest) req;
    response = (HttpServletResponse) res;

    service(request, response);
}

这个方法只做了两件事

protected void service(HttpServletRequest req, HttpServletResponse resp) {
    String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
        // ...
        doGet(req, resp);
    } else if (method.equals(METHOD_HEAD)) {
        // ...
        doHead(req, resp);
    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);          
    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);          
    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);          
    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req,resp);          
    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req,resp);          
    } else {
        // ...          
    }
}

Servlet与线程安全

上一篇 下一篇

猜你喜欢

热点阅读