我是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()在哪里?
答案 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。其中一个父类将实现doGet
和doPost
方法,这些方法将不可避免地调用生成的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)
中