Headリクエスト、ディズパッチャについて

このQ&Aのポイント
  • HTTP HEADリクエストとサーブレットのディスパッチャに関する疑問について説明します。
  • HTTP HEADリクエストに関するエラーと、doHeadメソッドからdoGetメソッドに渡す方法について悩んでいます。
  • HEADリクエストができず、doHeadメソッドからdoGetメソッドに遷移する方法について教えてください。
回答を見る
  • ベストアンサー

Headリクエスト、ディズパッチャについて

以下、あるソフトウェアで、このような条件のときに不具合が出るという内容なのですが、理解できないのです。 wwwブラウザ等から、Http Headリクエストを送り、サーブレットが受けます。 リクエストオブジェクトをレスポンスオブジェクトをコンテナが生成します。 それを通じて、HttpServlet実装のdoHeadが呼び出され、その後、オーバーライドされたdoGetメソッドにリクエストオブジェクトとレスポンスオブジェクトが渡され(ここが疑問、doHeadをオーバーライドせずにこんなことができるのか?doHeadから明示的にdoGetを呼べばできそうだが、doHeadをオーバーライドしている場合は除くのだそうです) その渡されたリクエストオブジェクトとレスポンスオブジェクトをRequestDispatcherのfowardメソッドでディスパッチしようとするとレスポンスオブジェクトをHttpServletResponseFacadeにキャストしようとするのだが、実際にはNoBodyResponseである為キャストに失敗。java.lang.ClassCastExceptionが出る。 (1)HEADリクエストが出来ない HttpURLConnection.setRequestMethod("HEAD"); のようにしてURLに送ってみたのですが、 「ドキュメントにデータが含まれていません」 というエラーが出てしまいました。 htmlから<form name="form" method="head" action="URL">のようにした所、「Getメソッドが無いのにGetメソッドが呼ばれている」というエラーになってしまいました。 (2)doHeadを通過してdoGetに行くという図で示されているのですが、どういうことかわからないです。どうやって実現するのか? 何か思いつくことがあったら教えていただけると助かります。

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

試したことはないのですが、doHeadは、doGetを実行して、ヘッダだけ返却するものだと思います。 (1)doHeadは、処理的にはdoGetをするのでサーブレットにdoGetメソッドがないとそのエラーになるのではないでしょうか。 (2)doHeadからdoGetに行くのはHttpServletの仕様なので気にしなくていいのではないでしょうか。

azicyan
質問者

お礼

そうだったのですね。 doHeadをよんでも結局はdogetを呼ぶのですね。 回答ありがとうございました。

関連するQ&A

  • doGetとdoPostの違い

    それぞれブラウザからのリクエストの種類に対応する メソッドがdoGet,doPost。 doGetはブラウザからGETでそのサーブレットに リクエストがあった時に、処理が始まるメソッド、 doPostは同じようにPOSTを受け取った時に動き出す ・・・・・ということなのですが、 doGetもdoPostも、中身のコーディングの仕方としては 同様でいいのでしょうか? いま、doGetでリクエストに対応する処理をうけつけて いるのですが、255バイトまでなのでdoPostのほうが いいということがかかれていました。 これは、ブラウザ:Servletのメソッドで対応してれば いいだけで、結局は送信量の違いだけですか? そのへんがよくわかってないので教えてください。 ちなみに、doGetでやってる処理は、 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //Bean(workBean)のインスタンス作成 wk = new work_Bean(); //Bean処理実行 wk.Work(); ・ ・ ・ ・ //BeanをJSPに渡すためにHttpServletRequestオブジェクトにセット request.setAttribute("wk",wk) ; //ViewであるJSPを呼び出す RequestDispatcher rDispatcher = request.getRequestDispatcher("/kanri_JSP.jsp"); rDispatcher.forward(request,response); } こんなかんじでしてます。 あとは、ネットで、人のサンプルとかみると doGetメソッドに処理をかいており、doPostでは doGet(request,response);として doGetをよんでたりするんですが、 これは、PostでもGetと同様の処理ができると いうことですか? 基本的な質問過ぎるかとおもいますがおしえてください。

    • ベストアンサー
    • Java
  • doHeadメソッドを使いたい

    訳あって、doHeadメソッドを使ったサーブレットを作りたいのですが、 例題が無くて困っています。 いろいろ調べても、doHeadの説明は 「ヘッダだけを返す」 と書いてあるだけで、 ほとんどは実際の使用例になるとdoGetを使ったものになってしまっています。 doHeadを使う単純なサーブレットはどのように書いたらいいのでしょう? 何も表示しなくてもエラーさえ出なければかまいません。 public class HellodoHead extends HttpServlet{   public void doHead(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{   } } ためしにこのように何も記述しないで見たのですが、 HTTP Status 405 - HTTP の GET メソッドはこの URL ではサポートされていません。 というエラーです。 dogetメソッドが無いのに、GETリクエストを送った、ということらしいのですが、 ではheadリクエストのみを送ることはできるのでしょうか? 思いついたことがあれば何でもいいので、 回答いただけると助かります。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • RequestDispatcherオブジェクトについて。

    データベース表示を行うサーブレットを呼び出す処理を行うには、RequestDispatcherオブジェクトを取得して、そのforwardメソッドを呼び出すだけと聞きましたが、うまくいきません。どなたかどこが悪いか教えてください。 // データベース表示するために、RequestDispatcherを取得 ServletContext cx = getServletContext(); RequestDispatcher rd = cx.getRequestDispatcher( "/netjv/servlet/shuwa.ext_db5_2_1"); // サーブレットを呼び出す rd.forward(request, response); } catch (Exception e) { e.printStackTrace(); } } 後、URL部分にはどこからのパスを書けばよいのでしょうか?あってるか不安です。

    • ベストアンサー
    • Java
  • prototype.jsのAjax.Requestでeventを引数にしたのですが

    prototype.jsのAjax.Requestといつ便利な関数がありますが onComplete時の引数にeventオブジェクトを設定したらIE7では eventオブジェクトが引き継げませんでした。 たとえばこのようなメソッドで function ajax_request(url, params, method, ele1, ele2){ var nt = new Date(); var pr = params + "&nt=" + nt.getTime(); var a = new Ajax.Request( url, { method: "get", parameters: pr, onComplete: function(request){ method(request, ele1, ele2); } } ) }; ele1にeventオブジェクトを設定し、methodを実行しても デバックで、ele1.typeが何も表示されませんでした。 firefox2.0だと「click」など正しく表示もされオブジェクトが引き継がれておりました。 何が問題なのでしょうか?それともIE7ではeventオブジェクトを引き継ぐことは出来ないのでしょうか?

  • セッションオブジェクトの使い方(次画面の渡し方について)

    セッションオブジェクトの渡し方について教えてください。 セッションオブジェクトは、どのタイミングで、次の画面にセッションオブジェクトを渡しているのでしょうか? ▼リクエストオブジェクトを次の画面に渡す場合 request.setAttribute("キー" , 格納したい値); という風に、リクエストオブジェクトの中に値をセットできると思います。 そして、  ・RequestDispatcher rd = request.getRequestDispatcher("画面遷移先URL");  ・rd.foward(request, response); これが実行されたタイミングで、requestオブジェクトに格納した情報を、次の画面に渡していると思いますが ▼セッションオブジェクトを次の画面に渡す場合 いったいどこでセッションオブジェクトを、次の画面に渡しているのでしょうか? セッションの値の入れ方としては session.setAttribute("キー" , 格納したい値); という形でセッションオブジェクトに対して、値を格納しているのだとは思いますが・・・ ここでセットした値を、 どうやって、次の画面にもっていっているのでしょうか? 【不思議に感じているところ】  1.セッションオブジェクトを生成する  2.セッションオブジェクトの中に、値を格納する  3.rd.foward(request, response); で次の画面にリクエストを投げる  4.次の画面で「セッションオブジェクトは飛ばしていない筈なのに、セッションオブジェクトの中には値が格納されている」  うーん・・・  一体どこで、次の画面にセッションオブジェクトを渡しているのでしょうか?

    • ベストアンサー
    • 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
  • リクエストメソッド

    以下はPHPでBMIを計算するプログラムです。リクエストメソッドを取得する意味がよくわかりません。 $request_method = $_SERVER['REQUEST_METHOD']; の部分です。 <?php // 初期化 $height = ''; $weight = ''; $bmi = ''; $err_msg = array(); // エラーメッセージ用の配列 // リクエストメソッドを取得する $request_method = $_SERVER['REQUEST_METHOD']; // 「BMI計算」ボタンをクリックした(POSTされた)場合に処理する if ($request_method === 'POST') { // POSTデータを取得する $height = get_post_data('height'); $weight = get_post_data('weight'); // 身長の値が数値かどうかをチェックする if (is_numeric($height) === FALSE) { $err_msg[] = '身長は数値を入力してください'; } // 体重の値が数値かどうかをチェックする if (is_numeric($weight) === FALSE) { $err_msg[] = '体重は数値を入力してください'; } // エラーがない場合にBMIを算出する if (count($err_msg) === 0) { // BMIを算出する $bmi = calc_bmi($height, $weight); } } /** * BMIを計算する * @param mixed $height 身長(cm) * @param mixed $weight 体重(kg) * @return float 計算したBMIの値を返す */ function calc_bmi($height, $weight) { return round($weight/($height/100*$height/100),1); } /** * POSTデータを取得する * @param str $key 配列キー * @return str POSTの値 */ function get_post_data($key) { $str = ''; if (isset($_POST[$key]) === TRUE) { $str = $_POST[$key]; } return $str; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>BMI計算</title> </head> <body> <h1>BMI計算</h1> <form method="post"> 身長(cm) : <input type="text" name="height" value="<?php print $height ?>"> 体重(kg) : <input type="text" name="weight" value="<?php print $weight ?>"> <input type="submit" value="BMIを計算する"> </form> <?php if (count($err_msg) > 0) { ?> <?php foreach ($err_msg as $value) { ?> <p><?php print $value; ?></p> <?php } ?> <?php } ?> <?php if ($request_method === 'POST' && count($err_msg) === 0) { ?> <p>あなたのBMIは<?php print $bmi; ?>です</p> <?php } ?> </body> </html>

    • 締切済み
    • PHP
  • JSPとサーブレット間での画面遷移でうまく表示できません。

    いつもお世話になっております。。。 eclipse3.4 tomcat6.0 の環境で作業しています。 JSPから受け取ったパラメータをサーブレットで条件分岐して、 条件ごとにdispatch fowardで異なったページに遷移させるページを作りたいのですが、うまくいきません。 送信JSPで、 <form action="受け取りサーブレット名" method="post"> <input type="radio" name="url" value="value1"checked> <input type="radio" name="url" value="value2"> <input type="radio" name="url" value="value3"> <input type="submit" value="jump!"> </form> と書き、受け取りでサーブレットで public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { perform(request, response); }      private void perform(HttpServletRequest request, HttpServletResponse response)         throws ServletException, IOException { response.setContentType("text/plain; charset=Windows-31J"); request.setCharacterEncoding("Windows-31J"); request.getParameter("url"); String i = request.getParameter("url"); if( i.equals("value1")) {           request.getRequestDispatcher("/遷移先1").forward(request,response); }else if(i.equals("value2")) {           request.getRequestDispatcher("/遷移先2").forward(request,response); }else if(i.equals("value3")) {           request.getRequestDispatcher("/遷移先3").forward(request,response); としています。 これでJSPからデバッグを実行すると、変数iにparam"url"でとってきた"value1"が入っているので、getParameterが成功しているのが分かりますが、その後なぜか遷移先に移りません。 おそらくdispaccher fowardがうまくいっていないか、 if文が間違ってるかだと思うのですが、 どなたかご教授くださいm(_ _)m

  • ServletからのURLアクセス時のHEAD情報について

    こんにちは、yakatoと申します。 現在、Servletから他のURLにアクセスし、送信したRequestのHEAD情報と受信したResponseのHEAD情報と受信本文のログを保存しようとしています。 今の所、HttpURLConnectionクラスを使用しているのですが、送受信情報がクラスに隠蔽されてしまっているようで、以下のように送信している電文そのものを表示する事が出来ません。 GET http://*********.com/*****.htm HTTP/1.1 \r\n Host: *********.com \r\n User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) \r\n     .     .     . \r\n このような形式で送信Requestと受信Responseを扱う方法をご存知でしたらご教授下さい。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • HTTPステータス 404 - /servlet/Testが表示される

    はじめまして。Javaの初心者です。 どうしてもわからないことがあります。それは、 最初にTest.jspを実行して送信ボタンを押すと、 サーブレットからforwardされてきた「あああああ」 が表示されるのですが、再び送信ボタンを押すと、 「HTTPステータス 404 - /servlet/Test」が表示 されます。なぜなのでしょうか?また、どのようにす れば、404エラーを出すことがなく実行できるのが どうか教えてください。お願いします。 ************************************************* <%-- Test.jsp --%> <%@ page contentType="text/html; charset=Shift_JIS" %> <html> <head> <title>Test</title> </head> <body> <form method="POST" action="/servlet/Test"> <input type="submit" name="submit" value="送信"/><br/> </form> <% if(request.getParameter("submit") != null) { %> <hr/> <%= (String)request.getAttribute("b") %> <% } %> </body> </html> ************************************************* import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public final class Test extends HttpServlet { public void doPost ( HttpServletRequest request, HttpServletResponse response ) throws IOException,ServletException { request.setAttribute("b","あああああ"); ServletContext sc = this.getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/Test.jsp"); rd.forward(request,response); } } *************************************************

    • ベストアンサー
    • Java

専門家に質問してみよう