• ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.2

最初に確認しておきたいのですが,azicyanさんの質問は「doHeadの例題を知りたい」,「doHeadの動作の確認をしたい」のどちらなのでしょうか? > doHeadを使う単純なサーブレットはどのように書いたらいいのでしょう? と書かれているので前者のようにも思えるのですが,質問の後半やNo.1の補足欄を見ると,後者のようにも思えます。 この回答は後者の立場で記述します。 まず,確認だけなら,No.1の方が書かれている方法(telnet)で簡単に確認できます。 ただ,テストのために何回もこれをやるのは煩わしいというのであれば,No.1の補足欄から,HEADリクエストを発行するプログラムを自分で書かれると読めるのですが,そういうことなら,「doHeadの動作の確認」する目的に,そのプログラムを使いまわして,HEADを発行できるHTTPクライアントを作ればよいのではないでしょうか? いずれにせよ,HEADリクエストの発行は,java.net.HttpURLConnectionのインスタンスを作り,java.net.HttpURLConnection#setRequestMethod("HEAD")してやれば簡単に出来ると思います。 最後に,本題からは少し逸れますが, > GETリクエストにはHEADリクエストも含まれているでしょうか・・・ いいえ。 GETリクエストのレスポンスは,HEADリクエストのレスポンスを含んでいますが,GETリクエストと HEADリクエスト自体は別の物です。 従って, > doHeadとdoGet両方を書いておけば、 > doHead、doGetの両方が実行されるでしょうか? いいえ。 doHeadとdoGet両方が書いてある場合, HEADリクエストが来た時はdoHeadだけが, GETリクエストが来た時はdoGetだけが実行されます。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/net/HttpURLConnection.html
azicyan
質問者

補足

いずれにせよ,HEADリクエストの発行は,java.net.HttpURLConnectionのインスタンスを作り,java.net.HttpURLConnection#setRequestMethod("HEAD")してやれば簡単に出来ると思います。 あーーー 助かります。 これも知りたかったのです。 実際なかなか見つからない情報です・・・ ありがたいです。 またお礼いたします!

その他の回答 (1)

回答No.1

通常のブラウザではHEADのみ送信することはできないと思います。 telnet でhttpのポート(80など)に接続し、 HTTP/1.0 HEAD url などと打てば、doHeadだけをテストはできると思います。 同じような方法で、通常のhttpサーバーがどのようなレスポンスを返すかわかると思うので、doGetと同じような方法で、responseを返してあげればいいと思います。 詳しくはHTTPのRFCとか、それを解説している本などを参考にしてください。

azicyan
質問者

補足

回答畏れ入ります。 やはりのみは無理なのですね・・・ ということはGETリクエストにはHEADリクエストも含まれているでしょうか・・・ 質問文に書ききれていなかったことなのですが、 も少し詳しくやりたいことを言いますと、 fowardメソッドもしくはinclude メソッドで、リクエストを送り、 そのリクエストがHEADリクエストでdoHeadを呼び出す・・・ という状態を作りたいのです。 includeもしくはforwardメソッドで、HEADリクエストを送る方法、 または、 doHeadとdoGet両方を書いておけば、 doHead、doGetの両方が実行されるでしょうか? また、この場合doHeadが確かに実行されていることを確認するにはどうすればいいでしょうか・・・

関連するQ&A

  • サーブレット初歩に関して。

    package oty; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Otys */ public class Otys extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Otys() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } 初期状態がこんな状態なんですが、これになにを追加したらhelloworldとでますか?? 普通にJAVA入門みたいに、System.out.printlnしたらいいんでしょうか??

    • ベストアンサー
    • Java
  • サーブレットのコンパイルについて

    はじめまして。 学校の課題の方でJSP/サーブレットをやっているのですが、サーブレットのコンパイルが通りません。 プログラムとエラーと環境変数は以下の通りです。 【プログラム】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { printWriter out = response.getWriter(); out.println("hello"); } } 【エラー】 HelloServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloServlet の クラス public class HelloServlet extends HttpServlet ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:9: シンボルを解決できません。 シンボル: クラス printWriter 場所 : HelloServlet の クラス printWriter out = response.getWriter(); 【環境変数】 CATALINA_HOME C:\servletbook\apache-tomcat CLASSPATH %CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;%CATALINA_HOME%\common\lib\servlet-jsp.jar; よろしくお願いします。

  • サーブレットを始めようとしたのですが・・・

    サーブレットを始めようとして、「10日でおぼえるJSP/サーブレット入門教室」を使って勉強しようとしているのですが、最初のファイルをコンパイルしようとしたら下記のようなエラーが出てコンパイルできませんでした。 SrvIntro.java:6: パッケージ javax.servlet は存在しません。 import javax.servlet.ServletException; ^ SrvIntro.java:7: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServlet; ^ SrvIntro.java:8: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServletRequest; ^ SrvIntro.java:9: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.HttpServletResponse; ^ SrvIntro.java:11: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : day07.SrvIntro の クラス public class SrvIntro extends HttpServlet{ ^ SrvIntro.java:12: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : day07.SrvIntro の クラス public void doGet(HttpServletRequest request, HttpServletResponse respon se) ^ SrvIntro.java:12: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : day07.SrvIntro の クラス public void doGet(HttpServletRequest request, HttpServletResponse respon se) ^ SrvIntro.java:13: シンボルを解決できません。 シンボル: クラス ServletException 場所 : day07.SrvIntro の クラス throws ServletException, IOException{ ^ エラー 8 個 調べた感じだとクラスパスの設定が間違っている可能性大ということらしいのですが、何度確かめてもクラスパスは合ってると思うのです・・ 何かこれじゃないか?という原因に心当たりがあればよろしくお願いします。

    • ベストアンサー
    • Java
  • サーブレットの動作

    以下のようなサーブレットのプログラムがあります。 本サーブレットを実行すると、simpleDB.jspに飛ぶようになっています。 疑問点は以下です。 ・GetやPostを使って送られてくるデータがないのに、なぜ  本プログラムが動くのか分かりません(根本的に分かって  ないんですが)。 ・getServletContext().setAttribute("list", employeeList)で  listに設定をしてますが、listは飛ぶ先のsimpleDB.jspで定義  されています。なぜこのサーブレットで定義されていないものを、  設定することが可能なのでしょうか? 以上、ご回答頂けると幸いです。 ---------- import java.io.IOException; import文以下略 public class EmployeeServlet extends javax.servlet.http.HttpServlet { /** * 初期化メソッド * 社員一覧をapplicationスコープにセットします */ public void init() { EmployeeDAO dao = new EmployeeDAO();     //EmployeeDAOクラスは他で定義済み ArrayList<Employee> employeeList = dao.findAll(); getServletContext().setAttribute("list", employeeList); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /** * リクエストを処理するメソッド * simpleDB.jspに移動し、社員一覧を表示します */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String nextPage = "/view/simpleDB.jsp"; ServletContext context = getServletContext(); RequestDispatcher rd = context.getRequestDispatcher(nextPage); rd.forward(request, response); } }

    • ベストアンサー
    • Java
  • getRequestDispatcher の機能について

    こんいちは。 下記の機能を使用して転送したいのですがエラーになってしまいます。 tomcatの設定ファイル、web.xmlなどのファイルに何か情報を登録しなければならないのでしょうか? どなたかご存知でしたら教えていただけないでしょうか? 環境 tomcat4.1 機能 ****** getServletConfig().getServletContext().getRequestDispatcher("/cc/t_1.jsp").forward(request,response); ****** ソース package cc; import mng.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class t_1 extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { //response.sendRedirect("/cc/t_1.jsp"); getServletConfig().getServletContext().getRequestDispatcher("/cc/t_1.jsp").forward(request,response); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { doGet(request,response); } } 下記がエラー内容になります。 HTTP Status 404 - /cc/t_1.jsp The requested resource (/cc/t_1.jsp) is not available.

    • ベストアンサー
    • Java
  • このソースのコンパイルできません。

    java, サーブレット初心者でコンパイルできません。エラーは以下のとおりです。 初歩的な質問で申し訳ないですがよろしくお願いします。 http://www.javaroad.jp/opensource/js_tomcat2.htm のページのHelloServlet.javaをコピーしてコンパイルをしようとしたらエラーが、、、。 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); } } ーーーーーーーーーーーーーーーーーーーーーーーーーーー HelloServlet.java:7: エラー: パッケージjavax.servletは存在しません import javax.servlet.*; ^ HelloServlet.java:8: エラー: パッケージjavax.servlet.httpは存在しません import javax.servlet.http.*; ^ HelloServlet.java:10: エラー: シンボルを見つけられません public class HelloServlet extends HttpServlet { ^ シンボル: クラス HttpServlet HelloServlet.java:11: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, ^ シンボル: クラス HttpServletRequest 場所: クラス HelloServlet HelloServlet.java:12: エラー: シンボルを見つけられません HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス HelloServlet HelloServlet.java:13: エラー: シンボルを見つけられません throws IOException, ServletException { ^ シンボル: クラス ServletException 場所: クラス HelloServlet エラー6個 エラー

    • ベストアンサー
    • Java
  • doPost+doGet

    public class Class{ public void doPost (HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException try{ //処理 }catch(Exception e){ e.printStackTrace(); } } public void doGet (HttpServletRequest request,HttpServletResponse response){ try{ doPost(request, response); }catch(Exception e){ e.printStackTrace(); } } } この処理は、doGetで送信されたものをdoPostに送って処理するということでよろしいのでしょうか? 分かる方がいましたら、よろしくお願いします。

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

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

    • ベストアンサー
    • Java
  • 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
  • java servletについて

    java servletを使用したユーザ認証プログラムを作成しています。 ------------ public class CustomAuth1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ ・ ・ response.sendRedirect(response.encodeRedirectURL("./Login")); ------------ 上記のようなプログラムで「http://AAAAA/Login」のページに飛ばしたいのですが、「http://BBBBB/Login」となってしまい、リダイレクト先のURLをうまく設定できていません。 このBBBBBの部分をAAAAAに変更するにはどうすればよいでしょうか? 抽象的な表現で申し訳ありませんが、ご教授いただけますようお願いします。

専門家に質問してみよう