JSP是一种Servlet,但在JSP中没有名为doGet()或doPost()的函数?

3

我是一个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()在哪里?

3个回答

3
如果你查看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方法,该方法执行分类。这个方法只是调用编译后的JSP中实现的_jspService
如果你想在你的JSP中知道http请求的类型,可以使用request.getMethod()方法。

0

这些方法将出现在父类(HttpServlet)中。


0

如果你看整个类,你会发现它继承了一个内部的、依赖于实现的父类,这个父类不可避免地继承自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()吗?我的理解正确吗? - HAO
你确定这是正确的吗?从我目前所看到的,它直接从服务方法中调用。 - Oleg
这不正确,_jspService 是直接从 service 调用的,而 doPostdoGet 完全与 jsp 页面无关。 - Oleg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接