【问题标题】:How webcontainer knows which method of Servlet to be called at time of request sent by client? [duplicate]webcontainer 如何知道客户端发送请求时要调用哪个 Servlet 方法? [复制]
【发布时间】:2016-09-29 16:32:53
【问题描述】:

我正在学习 servlet,我知道 servlet 生命周期将在加载 servlet 时或每当向 servlet 发送请求时调用。但是 Web 容器如何知道在加载 servlet 时我需要调用 Servlet init 方法还是在请求到来时我需要调用 Service() 方法?我想知道 web 容器在加载 servlet 和客户端在代码级别发送的请求时如何在内部调用 init()、Service() 方法?

【问题讨论】:

  • @BalusC。下面是答案我所期待的这个问题与你提到的不同。

标签: java spring jsp servlets


【解决方案1】:

我从 Tomcat 8 源代码中获取了以下代码,该代码加载 servlet 并 调用 servlet 的 init()

完整的源代码可用here

   @Override
    public synchronized Servlet loadServlet() throws ServletException {
        if (singleThreadModel) {
            Servlet instance;
            try {
                instance = existing.getClass().newInstance();
            } catch (InstantiationException e) {
                throw new ServletException(e);
            } catch (IllegalAccessException e) {
                throw new ServletException(e);
            }
            instance.init(facade);
            return instance;
        } else {
            if (!instanceInitialized) {
                existing.init(facade);
                instanceInitialized = true;
            }
            return existing;
        }
    }

Head first servlets & JSP book 中的这一页清楚地解释了生命周期,

更多详情,推荐阅读Head First Servlets & JSP

【讨论】:

  • 感谢您的回复。但我的问题是在代码级别哪个类正在调用 init 方法。我可以查看内部代码以获得更多理解吗?里面到底发生了什么。
  • 我更新了我的答案,如果有帮助,你可以接受。
【解决方案2】:

init() 在请求时初始化 servlet 对象,并不是每次访问都调用它,仅在创建 servlet 时 service() 在决定运行哪个方法后为每个请求创建线程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 2018-08-02
    • 1970-01-01
    相关资源
    最近更新 更多