- PR -

ServletContext,HttpServletRequestなどについて

1
投稿者投稿内容
ナスティキャット
常連さん
会議室デビュー日: 2004/03/03
投稿数: 24
投稿日時: 2004-03-05 12:00
こんにちはナスティキャットです。

現在サーブレットの勉強をしているのですが、ServletContext,HttpServletRequestのところで困ってます。
HttpServletRequestはServletRequestを継承していますが、両方ともインターフェースとなっていて、実際の処理の部分は何処で行われているのでしょうか?
APIリファレンスを見るる限りではわかりません。
サーブレットコンテナが処理の部分を定義しているのでしょうか?
サーブレットが定義しているとしたら

public void doGet (HttpServletRequest request,
HttpServletResponse response) {

この部分のHttpServletRequestはインターフェースであると思うのですが・・・

インタフェースとは、ある特定の機能の概要を記述したもので、インタフェースを実装したクラスは、同一のインタフェースを実装したクラスとの間においてある特定の機能の概要を共通に持ち、機能概要の詳細はそれぞれのクラスで定義するもの。

と認識していますがここではインスタンス化しているように思うのですが・・・

下手な質問でごめんなさい、どなたかご教授ください。
ちば
大ベテラン
会議室デビュー日: 2003/02/14
投稿数: 114
お住まい・勤務地: 都内勤務
投稿日時: 2004-03-05 13:25
こんにちわ、ちばです。

引用:

ナスティキャットさんの書き込み (2004-03-05 12:00) より:

HttpServletRequestはServletRequestを継承していますが、両方ともインターフェースとなっていて、実際の処理の部分は何処で行われているのでしょうか?
APIリファレンスを見るる限りではわかりません。



apiリファレンスに載ってますね。
http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/
HttpServletRequestを実装しているクラスはHttpServletRequestWrapperクラスです。

引用:

インタフェースとは、ある特定の機能の概要を記述したもので、インタフェースを実装したクラスは、同一のインタフェースを実装したクラスとの間においてある特定の機能の概要を共通に持ち、機能概要の詳細はそれぞれのクラスで定義するもの。

と認識していますがここではインスタンス化しているように思うのですが・・・

下手な質問でごめんなさい、どなたかご教授ください。



インスタンス化はしていません。
どこかでインスタンス化したオブジェクトの型、HttpServletRequestをパラメータとして
渡しているだけです。

うまいこと説明できていませんが、他の方のレスも参考にしてください。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-05 13:38
直接 HttpServletRequest を new することは出来ませんが、HttpServletRequest をimplements した HttpServletRequestWrapper を HttpServletRequest として扱うことはできますよね。
オブジェクト指向の多態性ですよ。

ここが参考になると思います。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-03-05 14:09
で、サーブレットに対して渡される HttpServletRequest の実体はコンテナ側で実装されています。
クラス名を表示すればわかりますが、
・Tomcat では org.apache.coyote.tomcat5.CoyoteRequest
http://cvs.apache.org/viewcvs.cgi/jakarta-tomcat-catalina/catalina/src/share/org/apache/coyote/tomcat5/CoyoteRequest.java?rev=1.31&view=markup
・WebLogic では weblogic.serlvet.internal.ServletRequestImpl
とかになります。まぁ、実装の中身をみずにインターフェースでコーディングできるのがオブジェクト指向ですから、あまり気にすることはありません。
インターフェースから期待できる挙動を示さない場合だけソースをみたりサポートに問い合わせれば良いわけです。
ナスティキャット
常連さん
会議室デビュー日: 2004/03/03
投稿数: 24
投稿日時: 2004-03-05 17:26
ちばさん、でゅうくさん、インギさん、どうもありがとうございます。
大変勉強になりました。

引用:
--------------------------------------------------------------------------------
直接 HttpServletRequest を new することは出来ませんが、HttpServletRequest をimplements した HttpServletRequestWrapper を HttpServletRequest として扱うことはできますよね。
--------------------------------------------------------------------------------

この考え方を使えばより良いプログラムが組めそうですね、
JUnitのMockObjectなどもこのような考え方なのでしょうか?


でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-05 18:11
引用:

ナスティキャットさんの書き込み (2004-03-05 17:26) より:
JUnitのMockObjectなどもこのような考え方なのでしょうか?


そうですね。
テストされるクラスは、型が同じなので MockObject だと意識する事無く動作することが出来ます。
これらの考え方は、オブジェクト指向を有効に活用するために欠かせないものですので、しっかりと押さえておくと良いでしょう。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-03-05 19:31
HttpServletRequestWrapper はその性質からコンストラクタに HttpServletRequest が必要ですので、単体では new できないという罠がありますので Mockアプローチのテストにそのままでは使えません。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-03-05 19:31 ]
1

スキルアップ/キャリアアップ(JOB@IT)