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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3590閲覧

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

kokok

総合スコア145

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/06/03 22:44

編集2019/06/07 02:44

jsp

1//index.jsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="UTF-8"> 8<title>Insert title here</title> 9</head> 10<body> 11<form method="POST" action="/javaweb/SampleServlet"> 12<input type="text" name="message"> 13<button type="submit">Send</button> 14 15</form> 16</body> 17</html>

java

1//SampleServlet.java 2package javaweb; 3 4import java.io.IOException; 5 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12 13@WebServlet("/SampleServlet") 14public class SampleServlet extends HttpServlet { 15 16 17//HttpServletクラスのdoPostメソッドをオーバーライドしている 18 19 20 21 public void doPost(HttpServletRequest req, HttpServletResponse res) 22 throws ServletException,IOException { 23 24 System.out.println(req.getParameter("message")); 25 26 } 27 28} 29

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 タグの内容をサーブレット側へ受け渡せませんでした。。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>Insert title here</title> 8</head> 9<body> 10<form method="POST" action="SampleServlet"> 11<input type="text" name="message"> 12<button type="submit">Send</button> 13</form> 14</body> 15</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" なので、受け取るサーブレットは次のようになるでしょう。

java

1import java.io.IOException; 2 3import javax.servlet.ServletException; 4import javax.servlet.annotation.WebServlet; 5import javax.servlet.http.HttpServlet; 6import javax.servlet.http.HttpServletRequest; 7import javax.servlet.http.HttpServletResponse; 8 9@WebServlet("/SampleServlet") 10public class SampleServlet extends HttpServlet { 11 12 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13 String value = request.getParameter("message"); 14 log(value); 15 16 response.getWriter().append("Served at: ").append(request.getContextPath()); 17 } 18 19}

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

投稿2019/06/07 03:57

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/06/07 04:18

解答ありがとうざいます。 action の指定を /javaweb/Sampleservlet と変えてみても404エラーが出てしまいます。(SampleServletのみの指定も試してみました。) @WebServletで指定するパスは"/SampleServlet"としております。 コンテキストパスはjavawebです。
A-pZ

2019/06/07 05:01

/Sampleservlet /SampleServlet Javaは大文字小文字を区別します
kokok

2019/06/07 05:07

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

2019/06/07 05:35

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

2019/06/07 05:43

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

0

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

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

投稿2019/06/04 00:20

編集2019/06/04 02:09
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/06/04 21:55

ありがとうがざいます。他のエラーが出でしまったので、そこを対処してから解決してみます。
m.ts10806

2019/06/04 22:12

こちらの質問で解決すべき問題と思います。 新しい質問は削除依頼し、問題が起きるまでの手順や経緯を含めてこちらの質問に追記してください。
kokok

2019/06/04 22:46

質問の削除依頼をしておきました。 質問の追記もしておきました。
m.ts10806

2019/06/04 22:48

情報が不足しています。 ファイルがどこにあるか分かりませんし「リクエストしております」もどのようにリクエストしているかが分かりません。 具体的に記載願います。あと、私が回答に提示した内容は先に対応した方が良さそうに思いますが
kokok

2019/06/04 23:48

返信ありがとうございます。 どのようにリクエストの部分がまだ理解できておりません。 (ブラウザからwebサーバに対してindex.jspのファイルください的な感じで理解しております。) 回答の方ですが、index.jspファイルのaction URL の指定を "/javaweb/SampleServlet" このようにしたのですが、404エラーが出てしまいます。 すいません、理解がまだまだできておらず。。
m.ts10806

2019/06/05 00:01

> ブラウザからwebサーバに対してindex.jspのファイルください的な感じで理解しております。 おおよそ合っていると思います。 「ファイルください」というよりURL自体がリクエストとなってサーバーに届けられ、そのリクエストをもとにサーバーが処理を行っているということです。 つまりブラウザから送られるのはURLだけでURLの解釈から出力(レスポンス)まではサーバーが行っています。 > "/javaweb/SampleServlet" このようにしたのですが 回答の「参考サイト」部分のほうが良いと思います。getContextPath()のほうですね。 これもですが、質問本文に対応状況として追記しておいてください
kokok

2019/06/07 02:47

解答ありがとうございます。 回答の「参考サイト」部分などを見たのですが、自分でxmlファイルを作成しないといけないのでしょうか?
m.ts10806

2019/06/07 02:50

getContextPath()を使おうという話をしているのですが、なぜ直に書いたのでしょうか。
kokok

2019/06/07 02:54

すいません。 色々調べてみたのですが、getContextPath()の方がなかなか理解できず。。 もう少し、調べてみます。
m.ts10806

2019/06/07 02:57

requestはjspでもそのまま使えたはずなので、単に下記のように書くだけだと思うのですが。 <form method="POST" action="<%= request.getContextPath()%>/SampleServlet">
kokok

2019/06/07 03:08

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

2019/06/07 03:11

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

2019/06/07 03: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エラー オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。 となってしまいます。 すいません長々となってしまい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問