【问题标题】:JSP is servlet but there is no function called doGet() or doPost() in JSP?JSP 是 servlet,但 JSP 中没有称为 doGet() 或 doPost() 的函数?
【发布时间】:2026-02-06 16:15:01
【问题描述】:

我是 servlet/JSP 的初学者。 我读过JSP实际上是一个servlet(在容器将JSP文件转换成Java源代码并编译之后)。 但是在 servlet 中,总是至少有 doGet() 和 doPost() 之一。在 JSP 中,我不编写任何代码来覆盖 doGet() 或 doPost()。我写的就在下面:

<%@ page import="com.example.*, java.util.*" %>
<html>
<body>
the page count is:
<%=
Counter.getCount()
%>
</body>
</html>

我知道上面的代码会改成java代码,比如:

public void _jspService(){
    out.println(......)
}

但我没有看到 doGet() 或 doPost()。 那么,JSP 中的 doGet() 和 doPost() 在哪里呢?

【问题讨论】:

    标签: java jsp servlets jakarta-ee web


    【解决方案1】:

    如果您查看javax.servlet.Servlet 接口,您会发现它实际上没有任何doXXX 方法,所有请求实际上都在:
    public void service(ServletRequest req, ServletResponse res) 中处理。

    javax.servlet.http.HttpServlet 类实现了这个方法,定义了所有的doXXX 方法和调用: protected void service(HttpServletRequest req, HttpServletResponse resp) 这个方法实际上是按类型对 http 请求进行分类,并调用您在 Servlet 中覆盖的 doXXX 方法。

    org.apache.jasper.runtime.HttpJspBase 是所有 JSP 生成的 servlet(这是 tomcat 实现)的基类,它覆盖了进行分类的 HttpServlet.service 方法。这个方法所做的只是调用_jspService,它在编译后的JSP中实现。

    如果您想知道 JSP 中 http 请求的类型,可以使用request.getMethod()

    【讨论】:

      【解决方案2】:

      如果您查看整个类,您会发现它扩展了一个内部的、依赖于实现的父类,该父类不可避免地继承自 Servlet。其中一个父类将实现doGetdoPost 方法,并且不可避免地会调用生成的JSP 类的_jspService 方法。

      以下是 Glassfish 的示例:

      package org.apache.jsp;
      
      import javax.servlet.*;
      import javax.servlet.http.*;
      import javax.servlet.jsp.*;
      
      public final class x_jsp extends org.apache.jasper.runtime.HttpJspBase
          implements org.apache.jasper.runtime.JspSourceDependent {
      

      【讨论】:

      • 所以当请求到来时,父类会决定调用doPost()还是doGet()。例如,如果它选择doPost(),那么doPost() 会调用我刚刚实现的_jspService() 吗?我的理解正确吗?
      • 你确定这是正确的吗?从我目前看到的情况来看,它是直接从服务方法调用的。
      • 这是不对的,_jspService是直接从service调用doPostdoGet跟jsp页面完全没有关系的。
      【解决方案3】:

      这些方法将存在于父类(HttpServlet)中

      【讨论】: