Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

HTTPステータス 405のエラー

フォームからテキストの値を取得しようとしています。

public class SampleServlet extends HttpServlet {

private static final long serialVersionUID = -8691047266971302396L;

protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=Shift_JIS");
    request.setCharacterEncoding("Shift_JIS");
    PrintWriter out = response.getWriter();
    String str = request.getParameter("text1");
    out.println("<html><body>");
    out.println("<h3>「" + str + "」</h3>");
    out.println("</body></html>");
    }
}

上記、本を丸写し & eclipseでクラス名SampleServletに黄色い線が引かれたので、serialVersionUIDを追加したものです。

以下、htmlです。

<html>
<head>
<title>テキスト入力</title>
<body>
<form action=/servlet/sample method=POST>
入力:<input type=text size=20 name=text1>
<input type=submit value="送信" name=btn1>
</form>
</body>
</html>

htmlでテキストを入力し、送信ボタンをクリック後、「HTTPステータス 405 - HTTPのPOSTメソッドは、このURLではサポートされていません。」のエラーになります。GET(doGet)は実行できたので、POST(doPost)がどこか間違っているのではないかと思っています。

doPostを調べたところ、「このメソッドをオーバーライドするときは、リクエストデータの取得、レスポンスヘッダの出力、レスポンスの Writer もしくは OutputStream オブジェクトの取得、そして最後に、レスポンスデータの出力、という順になります。」とありました。

response.setContentType("text/html;charset=Shift_JIS"); ←レスポンスヘッダの出力
PrintWriter out = response.getWriter(); ←レスポンスの Writer もしくは OutputStream オブジェクトの取得
String str = request.getParameter("text1"); ←リクエストデータの取得
out.println("<html><body>"); ←以下レスポンスデータの出力

と思っているのですが、違うのでしょうか?

エラーメッセージを検索して出てきた、「メソッドが許可されない」というのも意味がよくわかりません。

度々恐縮ですが、ご教示いただければと思います。よろしくお願いします。

12

回答

17548

閲覧

12件の回答

評価

0

ログは確認しました?

評価

0

eclipseのコンソール・tomcatのログ共にエラーは出ていませんでした。

最初に明記せずすいません。

評価

0

こういう場合は、web.xmlの中身を漁ってみる。
コンテキスト(この場合はsampleか)、getとかpostを探してみたら?

評価

0

protected -> publicとか

評価

0

protectedをpublicに変えても、結果は変わらずでした・・・

>こういう場合は、web.xmlの中身を漁ってみる。
>コンテキスト(この場合はsampleか)、getとかpostを探してみたら?
せっかく教えていただいたのですが、意味がよくわかりません(すいません)。
一応、プロジェクトのフォルダ内に自分で作ったweb.xml・tomcatのconf内のweb.xml共に見てみたのですが、getやpostに関する記述は見つかりませんでした。
「web.xml post」で検索したところ、セキュリティの設定<security-constraint>内にgetやpostなどを設定してあるようなのですが、仰ってらっしゃるのはこれでしょうか?それとも全く見当外れ?

評価

0

言い忘れてました、warファイルを作成して配置しているのですが、これが関係するのでしょうか。

評価

0

そのことです。
何らかの認証を行っていて、セキュリティの設定があるなら、
getだけ存在してputの記述がない、ということも考えられたんだが。

評価

0

再度確認しましたが、やはり<security-constraint>は設定していませんでした。

自分のことだから、すごくしょーもないことでミスってる気がするので、もう一度最初から確認してみます。

不良社員さん、回答下さった皆さん、ありがとうございます。

評価

0

1日費やして調べましたが、原因が突き止められませんでした。

htmlの method=POST -> method=GET に変更して、
protected void doGet(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}

とすると、望み通りに動きはするのですが・・・

web.xml・server.xmlの設定?調べてはみましたが、何か足りないのかもよく分かりません。
ビルドパスなども、eclipseが勝手に設定してくれているようで、自分では何も設定してはいないのですが。
(今ライブラリに入っているのは、jreと、tomcat内のjasper-runtime・jsp-api・servlet-apiの3つのjarです)
その辺り、調べなおしてみます。

評価

0

Apacheは経由してない?

評価

0

経由、してるように思います。

スタート->すべてのプログラム->Apache Tomcat5.5になってます。
起動時のeclipseコンソールにも、
org.apache.catalina.core.AprLifecycleListener lifecycleEvent のように出ます。

Apache Tomcat = Tomcat ではない?今までずっと同じだと思って動かしてました。

追記 servletをJSPに変えて作成したら動いているみたいです。servletとJSPの違いがわかりません。

評価

0

よく見てみたら、JSPではserviceを使っているようなので、調べてそちらから呼び出してみようと思います。

でも、出来れば直接doPost使えた方がいいので、ご存知の方いらっしゃれば引き続き情報をいただければと思います。よろしくお願いします。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。