2017-08-12 50 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)