2017-08-12 51 views
2

我是servlet/JSP的初学者。 我已经读过JSP实际上是一个servlet(在容器将JSP文件转换成Java源代码并编译之后)。 但是在servlet中,至少有一个doGet()和doPost()。在JSP中,我不写任何代码来覆盖doGet()或doPost()。我写的是仅低于:JSP是servlet,但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()在哪里?

回答

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 ovveride。

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

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

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 { 
+0

所以当请求到来时,父类将决定调用doPost()或doGet()。例如,如果它选择了doPost(),那么doPost()将调用刚才实现的_jspService()。我的理解是否正确? – HAO

+0

你确定这是正确的吗?从我目前看到的它直接从服务方法中调用。 – Oleg

+0

这是不正确的,'_jspService'直接从'service'调用''doPost'和'doGet'完全与jsp页面无关。 – Oleg

0

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