JSP是servlet,但JSP中没有名为doGet()或doPost()的函数?

时间:2017-08-12 21:04:22

标签: java jsp servlets java-ee web

我是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 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分: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 {

答案 2 :(得分:0)

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