2016-10-24 8 views
-1

私はservletsを勉強しています。私は教授が作成した完全な実例を見て​​いました。私のサーブレットのservice()方法は、次のようになります。上記の例service()jarアーカイブのJavaインターフェイス

public void service (ServletRequest req, ServletResponse res) 
         throws ServletException, IOException { 
    res.setContentType("text/plain"); 
    PrintWriter out = res.getWriter(); 

    out.println("Some response"); 
    out.close(); 
} 

ServletResponseオブジェクトを使用していますので、私は私のservlet-api .jarに入った、javax.servlet.ServletResponse.classを検索しServletResponse.classはインタフェース(public abstract interface javax.servlet.ServletResponse)であることが分かりました。だから私のコードでは、タイプServletResponseのオブジェクトをインターフェイスとして使用していますが、Javaでインターフェイスをインスタンス化できないと思っていました。私はまた、このインターフェイスがServletResponseWrapper.classによって実装されていることに気づいた。

だから私の質問は以下のとおりです。

  • なぜコンパイラは、私はインターフェイスをインスタンス化させていますか?
  • なぜServletResponseWrapperオブジェクトを使用しないのですか?
+0

あなたはそれを発症しますか?初期コードを表示してください。 – MordechayS

+0

匿名クラスを使用すると、インスタンス化できます。それ以外の場合は、そのインタフェースを実装しているクラスをインスタンス化し、それにキャストすることができます(ポリモーフィズム)。 'List' - >' List myList = new ArrayList(); ' – Pau

+0

サーブレットコンテナはコンテナのオブジェクトを渡します'ServletResponse'インターフェースを実装する特定のクラスです。あなたが知る必要があるのは、それがインターフェースを実装していることだけです。 – Henry

答えて

1

インターフェイスServletResponseをインスタンス化していません。サーブレットのservice()メソッドを呼び出すときにサーブレットコンテナによって渡された参照を使用しています。コンテナは、ServletRepsonseインターフェイスを実装するクラスをインスタンス化します。インスタンス化された(具体的な)クラスは、ServletResponseインターフェイスを実装している限り、ServletResponseWrapperまたはその他の「内部」クラスになります。

service()方法でres.getClass().getName()を印刷してみてください。これは、サーブレットコンテナによってインスタンス化されている正確なクラス名を示すはずです。

+0

ありがとうございました。あなたは正しいです、私は結局何もインスタンス化しませんでした。 – Mazzola

+0

あなたのアドバイスで、私はインターフェイスを実装するクラスが '@ org.apache.catalina.connector.ResponseFacade'であることを知りました。もう一度ありがとう。 – Mazzola

0

ServletResponseをインスタンス化したとは思いません。あなたは単にあなたに渡されたインスタンスを使用しています。実装の詳細は気にしません。インターフェイスで指定された契約を気にするだけです。

インターフェイスで連絡先が指定されており、さまざまな実装が可能です。彼らはそれぞれ異なる方法でコントラクトを実装することができますが、それぞれの動作はまったく同じです(インターフェイスに指定されているものと一致します)。

関連する問題