• 締切済み

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

最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。 たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、 doPost(HttpServletRequest req , HttpServretResponse res){ HttpSession session = req.getSession(true) … } としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。 知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数2

みんなの回答

noname#49664
noname#49664
回答No.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が渡されるものとしてコードを書けるわけです。

t-a-k-u-
質問者

お礼

なるほど、すっきりしました。 まさに「使う側が実装を気にせず使える」というインタフェースの特徴が利用されてたわけですか。 勉強になりました。ありがとうございました。

関連するQ&A

  • メソッドの引数に指定されているインタフェースについて

    最近サーブレットをいじっているので例としてサーブレットを扱いますが、一般的な話題として扱っていただければと存じます。 非常に質問を文章化しにくいのですが・・ たとえば、クラスHttpServletには以下のようなメソッドがあります。 doGet(HttpServletRequest req, HttpServletResponse resp) このメソッドの引数に指定されているHttpServletRequest/Responseはいずれもインタフェースなわけですが、メソッドの引数にインタフェースを指定するというのは、具体的にどういうことなのでしょうか? これがたとえばintだったりStringだったりした場合は簡単にイメージできるのですが、インタフェースだとさっぱりわかりません。 質問がわかりにくいかもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • httpセッション

    失礼致します。 セッションについてお聞きします。 httpsessionの受け渡しについてなのですが、画面jspページから ログイン名とパスワードを取得し、サーブレットに渡しています。 サーブレットの書き出しは次のようになっています。 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { HttpSession session3 = req.getSession(true); ・・・ このあとsession3セッションにパスワードをセットし、 jspページでセッションチェックした後falseならログイン画面に リダイレクトします。ここまでは出来ました。 ところが、このログイン名を文字列操作したいと思い、 サーブレットからjspページにディスパッチする前に一旦 文字列操作用javaページで文字列操作をしようと思いました。 ところが、サーブレットでない純粋なjavaページではhttpsessionが使えないことが分かりました。 HttpSessionを型に解決できませんと言われます。 この問題は一度は直面したことのある方も多いのではないかと思い、質問させて頂きました。 このような場合、どのように対処されていますでしょうか?

  • セッションを使ったint型の値の保持

    こんにちは。 少し文が長いですがよろしくお願いします。 AccessのDBから取得したint型の値を、セッションを使って保持したいのですが while(rs.next()){ String name = rs.getString("NAME"); int value = rs.getInt("VALUE"); HttpSession session1 = req.getSession(true); HttpSession session2 = req.getSession(true); session1.setAttribute("Name", name); session2.setAttribute("Value", value); dispatcher2.include(req, res); } のコードの session2.setAttribute("Value", value); でコンパイルエラー DBAccess.java [37:1] javax.servlet.ServletRequest の setAttribute(java.lang.String,java.lang.Object) は (java.lang.String,int) に適用できません。 がでてうまくいきません。 セッションを使ってint型の値の保持を行うにはどうすればよいのでしょうか?

    • ベストアンサー
    • Java
  • (true)の意味

    基本が抜けている(かといってハイレベルの内容が分かるわけでもない)javateaです。 もしお暇でしたら次の記述の意味を教えていただけますか? HttpSession session = req.getSession(true) とりあえずsessionにセッション情報を格納しているんだなということは分かります。ただ、右辺が分かりません。trueからセッション情報をrequestするとはいったいどういう意味なのでしょうか?? どうもサーブレットになってから値の受け渡しが格段に難しいです。dogetからよく分かっていない(というかget、postと混同してます)ですし・・Ψ(・O・)Ψ

    • ベストアンサー
    • Java
  • セッションタイムアウト時のページ表示

     セッションタイムアウト時、その旨のページを表示すること考えてい ます。表示方法をご存知の方、もしくは別のアプローチをご存知の方、 御教授下さい。 (1)セッションタイムアウトの検知はHttpSessionBindingListenerを使用。 (2)セッションタイムアウトしたときに表示するページは、用意している   sessiontimeout.htmlにRequestDispatcherを用い、ディスパッチ。 (3)ディスパッチ処理は、セッションタイムアウト時に呼ばれる   valueUnbound(...)メソッドに記述。 <問題点>  RequestDispatcherを用いてディスパッチするときのメソッドは引数にHttpServletRequest,HttpServletResponseが必要です。  これをvalueUnbound(...)メソッド内で行う場合、 上記2つの引数をどのように取得すればよいのでしょうか? -------------------------------------------------------------------- public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { HttpSession s = req.getSession(false); if(s == null) {    s = req.getSession(true);    s.setAttribute("listener", this);   } }  //中略 //HttpSessionBindingListener public void valueUnbound(HttpSessionBindingEvent event) {   System.out.println("valueUnBound"); //セッションタイムアウト時、sessiontimeout.htmlを表示   ServletConfig config = this.getServletConfig();   ServletContext context = config.getServletContext();   RequestDispatcher rd =     context.getRequestDispatcher("/sessiontimeout.html");   rd.forward(req,res);   //HttpServletReqest,HttpServletResponseをどう取得する?--- }

    • ベストアンサー
    • Java
  • Javaでのセッションについて

    質問があります。 ServletでSessionを用いるときににまず初めに、 /*セッションの開始*/ HttpSession session = req.getSession(); というふうにすると思います。 ここで、HttpServletRequestのメソッドとしgetSessionがあるわけですが、 セッションというのはリクエストから受け取り開始するものなのですか? 私の解釈では、リクエスト→セッション→コンテキストという順番でスコープが広くなっていると認識しています。 なのになぜ、リクエストからセッションを受け取るのかが疑問でなりません。 また、ブラウザで×ボタンを押すとセッションは終了すると思いますが、 この時にもし、セッション上に明示的に解放しなければならないBeanなどをあげていた場合、 どうやって解放してあげればいいのでしょうか。 たぶん、大きな勘違いをしていると思うのですが、 どなたかご教授願いますでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • doGetの引数に「入るモノ」について

    サーブレットにおけるクラスのdoGetメソッドについて 質問です(Tomcat3.2.1 + JDK1.3)。 public void doGet(HttpServletRequest request, HttpServletResponse response) 理屈で考えると、このdoGetメソッドの2つの仮引数 (request, response)には、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス ‥‥と、 「インターフェースHttpServletRequestをimplements したクラス」のインスタンス の2つのインスタンスが入れられるハズですよね。 そこで疑問なのが、 1. それら2つのクラスの名前はなんというのでしょう? (というのはインターフェースHttpServletRequestや インターフェースHttpServletResponseを 実装したクラスのメソッドの処理内容の定義を 見たいのです‥) 2. 誰がそのクラスをインスタンス化しているのでしょう? (サーブレットコンテナのTomcat? JRE? JVM?‥ いったい誰が?‥‥用語の区別も曖昧なのですが) 補足すると、 Javaアプリケーションのmainメソッドでは、 public static void main(String[] args) として、コマンドラインの引数がそのまま仮引数argsに 入る。じゃあ、サーブレットの場合はどうなのか? といった感じです。 2.のほうはトンチンカンな質問かもしれませんが、 1.の質問は切実です。 ご存知の方、教えてください。

    • ベストアンサー
    • Java
  • セッションタイムアウトになった時

    やりたいことは 1)セッション情報を取り出す 2)取り出した値を使ってDBに書き込みする 3)セッション情報を破棄する です。 http://oshiete1.watch.impress.co.jp/qa455453.html ほぼここの方と同じです。 ここの方はうまくいったようなのですが・・・ 初心者で悩んでいます。よろしくお願いいたします。 HttpSessionBindingListener セッションが切れた(valueUnbound)時 getAttribute("aaa")で "1111111"←ユーザーIDを取得したい。 req_.getSession().getAttribute("aaa");で取得できません。 よろしくお願いします。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** セッション開始終了処理のテストサーブレット **/ public class SessionServlet extends HttpServlet implements HttpSessionBindingListener { HttpServletRequest req_; HttpServletResponse res_; public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("valueBound"); } public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println(req_.getSession().getAttribute("aaa")); System.out.println("valueUnBound"); } public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req_=req; res_=res; HttpSession session1 = req.getSession(); res.setContentType("text/html; charset=Shift_JIS"); req.setCharacterEncoding("Shift_JIS"); PrintWriter out = res.getWriter(); // パラメータの取得 String act = req.getParameter("act"); // ログイン処理 if (act == null) { // セッション変数の作成、設定 SessionServlet data = new SessionServlet(); session1.setAttribute("aaa", "1111111"); session1.setAttribute("data", data); // セッション開始画面の表示 out.println("<html><body>"); out.println("<h1>セッション開始</h1>"); out.println("<form method=\"POST\" action=\"SessionServlet?act=lo\">"); out.println("<input type=\"submit\" value=\"logout\">"); out.println("</form>"); out.println("</body></html>"); out.close(); // ログアウト処理 } else { // セッション終了画面の表示 out.println("<html><body>"); out.println("<h1>セッション終了</h1>"); out.println("</body></html>"); out.close(); // セッションの無効化 session1.invalidate(); } } }

  • インターフェースについて

    いまサーブレットをやっています。 Java言語仕様では、 「インターフェースの定義には、メソッドの定義を書いてはいけない」 (メソッドの定義はそのインターフェースをimplementsしたクラスのなかで オーバーライドする) ということになってますよね? …でも、 APIリファレンスを読むと、 インターフェースHttpServletRequestのメソッドgetParameterには、 「リクエストパラメータの値をString型として返す」と書かれています。 ↑これって上記のJava言語仕様と矛盾してませんか? まるでどこかでgetParameterメソッドの定義がなされているかのようです。 これってどういうことでしょう? 考えれば考えるほど、訳わかりません。とっても混乱中です(-_-)

    • ベストアンサー
    • Java
  • サーブレットforward時の実行メソッドについて

    初歩的な質問で失礼します。 サーブレットAに doGet, doPost, serviceメソッドを実装しています。 サーブレットBのdoPostメソッド内にて サーブレットAにforwardを実行する場合に、 呼出されるのはサーブレットAのどのメソッドですか? JSPへのforwardはできたのですが、 サーブレットへのforwardができず悩んでいます。 サーブレットのAPIを読んでもいまいちわかりません。 何かメソッドに関する制約があるのでしょうか? 上の質問は全くマト外れでしょうか? 追加ですが・・・ サーブレットからforwardされたサーブレットで、 そこからさらにJSPへforwardすることはできますか? Apache2.0.43+tomcat4.1.12+Java1.4.0_01です。

    • ベストアンサー
    • Java

専門家に質問してみよう