質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.10%

jspの<form>の内容をサーブレットで受け取る

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,788

score 109

//index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="POST"  action="/javaweb/SampleServlet">
<input type="text" name="message">
<button type="submit">Send</button>

</form>
</body>
</html>
//SampleServlet.java
package javaweb;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/SampleServlet")
public class SampleServlet extends HttpServlet {


//HttpServletクラスのdoPostメソッドをオーバーライドしている



        public void doPost(HttpServletRequest req, HttpServletResponse res)
                throws ServletException,IOException {

            System.out.println(req.getParameter("message"));

        }

}


eclipseの内部ブラウザからhttp://localhost:8080/javaweb/index.jspへリクエストをして,ブラウザへレスポンスされたwebページのformから入力された内容をサーブレット側で受け取りたいのですが、 HTTPステータス 404 エラーがでてしまいます。

@WebServlet("/SampleServlet") などの指定が間違っているのでしょうか?

Apache Tomcat のバージョンは 9.0.20です。

tomcat 7 以降だと @WebServlet の指定が可能みたいなのですが

アドバイス頂けると助かります。

--------------質問の追記-----------------------
eclipseの内部ブラウザからhttp://localhost:8080/javaweb/index.jspにリクエスト何度かしたところ、何回目かに突然404エラーが出てしまいました。

イメージ説明

※上記はkoko.htmlにリクエストをしております。(index.jspファイルに間違えがないか)

一番上のjavawebフォルダのところに黄色いビックリマークがあるのでしょうが、これが原因なのでしょうか?(調べたらビルドパスがなんたらでてきました。。)

原因が分からなたたのでアドバイス頂けると助かります。

---変更点・質問の追記・解決点---

---解決点---
eclipseの内部ブラウザからhttp://localhost:8080/javaweb/index.jspにリクエスト何度かしたところ、何回目かに突然404エラーが出てしまいました。

上記の部分は、tomcatプロジェクト(javaweb) のjavaのビルド・パスのライブラリの欠落しているものを削除。 コンパイラーの準拠レベルの設定の変更。
上記変更をしたところ、javawebフォルダのところに黄色いビックリマークがなくなり、http://localhost:8080/javaweb/index.jspへのリクエストが問題なくできるようになりました。

---変更点---
index.jspファイルの
<form method="POST"  action="SampleServlet">
上記を
<form method="POST"  action="/javaweb/SampleServlet">
に変更
しかし、form タグの内容をサーブレット側へ受け渡せませんでした。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

Eclipseからサーバへ公開しているWebアプリケーションを samplewebapp とした場合で、

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form method="POST" action="SampleServlet">
<input type="text" name="message">
<button type="submit">Send</button>
</form>
</body>
</html>


このJSPを呼び出すURLが、http://localhost:8080/samplewebapp/sample.jsp だとして、

このJSPの<form action>指定している SampleServlet は、
http://localhost:8080/samplewebapp/SampleServlet が呼び出されます。

ところで、action属性で / から開始した場合は、/コンテキストパス/サーブレットパス でリクエストする仕様になっていますので、
このWebアプリケーションが、samplewebapp の名前で公開されているなら、/samplewebapp/SampleServlet を指定します。

このformでsubmitした場合は、method="POST" なので、受け取るサーブレットは次のようになるでしょう。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/SampleServlet")
public class SampleServlet extends HttpServlet {

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String value = request.getParameter("message");
        log(value);

        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

}

@WebServletで指定するパスは「サーブレットパス」だけです。
@WebServletを指定した場合は、web.xmlに同じサーブレットを登録していけません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/07 14:07

    すいません、こちらのコメントでのミスでした。 コードの方では/SampleServletとなっております。

    キャンセル

  • 2019/06/07 14:35

    実際にサーバ(Tomcatなど)に搭載されているWebアプリケーションは、サーバの設定を買えていないのであれば、コードを修正した後再起動しないと反映されません。
    JSPから404が表示されるのであれば、実際に ブラウザから 当該サーブレットをリクエストして、同様に 404が出力されるのかを確認すべきでしょう。よく陥りがちな事象として、すでに別のTomcatが立ち上がっている状態のまま新しいTomcatを起動して失敗して、更新が反映されていない状態なども確認してください。少なくとも、サンプルで示したコードで動作しない状態であれば、環境の異常です。

    キャンセル

  • 2019/06/07 14:43

    解答ありがとうございます。
    再起動したところ問題なくサーブレットが実行されました。
    コードの修正をした場合、毎回再起動しないといけないのでしょうか?

    キャンセル

+1

この場合はサーブレット側のURI(@WebServlet)の設定ではなく、actionに指定するURIの設定の方だと思います。

下記の質問がほぼそのまま該当しそうです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/07 12:08

    そのように試してみたのですが、404エラーがでてしまいます。。
    回答の「参考サイト」部分の内容にxmlファイルで色々指定しているのでそれが足りていないのかなと思ったのですが。

    キャンセル

  • 2019/06/07 12:11

    念のための確認ですが、「どの状態からどういう操作を行ったら」404になりますか?

    キャンセル

  • 2019/06/07 12:25

    eclipseの内部ブラウザからhttp://localhost:8080/javaweb/index.jsp へ リクエストを出し
    レスポンスされたwebページのformタグに入力されたものをhttp://localhost:8080/javaweb/index.jspへリクエストし
    (formタグの内容をもう一度http://localhost:8080/javaweb/index.jspへリクエストしているのかはまだ理解できておりません) 
    jspからサーブレットへformに入力されたものを渡し表示させたいんですが

    http://localhost:8080/javaweb/index.jsp へ リクエストを出しwebページを取得まではできています。
    webページのformに入力して送信すると 
    http://localhost:8080/javaweb/SampleServlet
    404エラー
    オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。
    となってしまいます。

    すいません長々となってしまい。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る