美文网首页
Servlet的理解

Servlet的理解

作者: 红烧排骨饭 | 来源:发表于2017-04-28 15:49 被阅读0次

    前言

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

    什么是 Servlet

    • 一个负责接收和响应客户端请求的 Java 程序

    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 客户端的网络请求。

    • Java Web 的三大组件(Servlet、Filter、Listener)之一

    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 相关的方法

    • doGet(HttpServletRequest req, HttpServletResponse resp)
    • doPost(HttpServletRequest req, HttpServletResponse resp)
    • doPut(HttpServletRequest req, HttpServletResponse resp)
    • doDelete(HttpServletRequest req, HttpServletResponse resp)

    和 Servlet 生命周期的相关方法

    • init()
    • destroy()

    当请求到来时,会调用 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);
    }
    

    这个方法只做了两件事

    • ServletRequest 强转为 HttpServletRequest;ServletResponse 强转为 HttpServletResponse
    • 调用 service(HttpServletRequest req, HttpServletResponse resp) 方法,在这个方法中会对 HTTP 的请求进行判断,然后调用对应的 doXX() 方法
    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与线程安全

    • 不要在Servlet中创建成员,创建局部变量即可
    • 可以创建无状态成员
    • 可以创建有状态的成员,但状态必须为只读的

    相关文章

      网友评论

          本文标题:Servlet的理解

          本文链接:https://www.haomeiwen.com/subject/hobwzttx.html