こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

インタフェースのメソッド

最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。

たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、

doPost(HttpServletRequest req , HttpServretResponse res){
HttpSession session = req.getSession(true)

}
としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。

知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。

投稿日時 - 2007-08-01 21:34:30

QNo.3219233

暇なときに回答ください

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。

その通り、HttpServletRequestはインターフェイスです。実際には、doGet/doPostでは、HttpServletRequestインスタンスが渡されるわけではなく、HttpServletRequestを実装した「なにか」が渡されます。

サーブレットは、サーブレットコンテナの仕様となるもので、実際にはさまざまなベンダーによって独自にサーブレットコンテナが実装されているわけです。その際の「リクエストはこういう形で設計してください」という仕様としてHttpServletRequestインターフェイスがあります。そして、それぞれのサーブレットコンテナでは、このHttpServletRequestを実装したそれぞれのクラスを定義し、それらのインスタンスが渡されるわけです。例えば、Tomcatの場合、doGet/doPostの引数で渡されるHttpServletRequest/HttpServletResponseは、それぞれを実装した以下のクラスのインスタンスが渡されます。

org.apache.catalina.connector.RequestFacade
org.apache.catalina.connector.ResponseFacade

要するに、さまざまなベンダーがサーブレットコンテナを作成したとき、どんなクラスであっても「このインターフェイスを実装したクラスであれば、同様にサーブレットが機能する」という土台としてインターフェイスが定義されているわけです。そのおかげで、我々は実際にサーブレットを書くとき、「TomcatだからRequestFacadeが渡されるはずだ」などと考慮することなく、すべてHttpServletRequestが渡されるものとしてコードを書けるわけです。

投稿日時 - 2007-08-01 23:32:34

お礼

なるほど、すっきりしました。

まさに「使う側が実装を気にせず使える」というインタフェースの特徴が利用されてたわけですか。

勉強になりました。ありがとうございました。

投稿日時 - 2007-08-02 07:26:51

あなたにオススメの質問