2017-08-12 23 views
2

私はサーブレット/ JSPの初心者です。 私は、JSPが実際にサーブレットであることを読んでいます(コンテナがJSPファイルをJavaソースコードに転送してコンパイルした後)。 しかし、サーブレットには常にdoGet()とdoPost()の少なくとも1つがあります。 JSPでは、doGet()またはdoPost()をオーバーライドするコードは書きません。私が書くことは、単に以下の通りです:JSPはサーブレットですが、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

中に存在するであろうdoXXXメソッドでは、すべてのリクエストは実際には
public void service(ServletRequest req, ServletResponse res)で処理されます。この方法は、実際にタイプして、HTTP要求を分類し、あなたのServletにovveride doXXXメソッドを呼び出します protected void service(HttpServletRequest req, HttpServletResponse resp)

javax.servlet.http.HttpServletクラスは、このメソッドを実装し、すべてのdoXXXメソッドと呼び出しを定義します。

org.apache.jasper.runtime.HttpJspBaseは、JSPで生成されたすべてのサーブレット(これはTomcat実装)の基本クラスであり、分類を行うメソッドHttpServlet.serviceをオーバーライドします。このメソッドは、コンパイル済みのJSPで実装されている_jspServiceを呼び出しています。

JSPでhttpリクエストのタイプを知りたい場合は、request.getMethod()を使用できます。

0

クラス全体を見ると、インプリメンテーションに依存する親クラスが拡張されていることがわかります。これは必然的にServletから継承されます。これらの親クラスの1つは、doGetdoPostのメソッドを実装し、それらは必然的に、生成されたJSPクラスのメソッドを呼び出すことになります。ここで

は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

これらの方法は、あなたがjavax.servlet.Servletインターフェイスを見れば、あなたはそれが実際にはいずれかを持っていないことがわかります親クラス(HttpServletを)

関連する問題