サーバーサイド技術の学習を始めたばかりの新参者です。
今回はサーブレットが動作しない問題が発生したため、質問させて頂きます。
要件はウェブブラウザで"UserAuthentication.html"にアクセスし、そのページのステータスをTomcat上に構成されたサーブレットに渡し、返却されるhtmlを受け取って表示する、という単純な物です。
サーブレットの構成に必要なリソースを以下の様な内容に編集し、準備しましたが、実際にTomcatのサービスを起動し、ブラウザで"UserAuthentication.html"上の"送信"ボタンを押すと、"HTTPステータス 404 ~ The requested resource (/System/TestServlet) is not available."というエラーが返却されてしまいます。
2日余りこの問題と向き合いましたが、エラーが除去出来ず、途方に暮れています。
何が問題なのかご指摘頂けませんでしょうか、よろしくお願いします。
=TestServlet.class=
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
// ContentTypeを設定
response.setContentType("text/html; charset=Shift_JIS");
// 出力用PrintWriterを取得
PrintWriter out = response.getWriter();
out.println("<html");
out.println("<head>");
out.println("<title>テストサーブレット</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Welcome!! MyServlet!!</h1>");
out.println("</body>");
out.println("</html>");
}
}
=web.xml=
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>TestServlet.class</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/System/UserAuthentication.html</url-pattern>
</servlet-mapping>
</web-app>
=UserAuthentication.html=
<html>
<head>
<title>システム:利用者認証画面</title>
</head>
<div align="center">
<h1>利用者認証画面</h1>
<h2>認証する利用者の情報を入力して"送信"ボタンを押して下さい</h2>
<br>
<form action="TestServlet" method="get">
<table border="4">
<tr>
<td> ネーム:<input type="text" name="name"></td>
<td>パスワード:<input type="text" name="password"></td>
</tr>
<tr>
<td><div align="left"><a href="index.html">戻る</a></div></td>
<td><div align="right"><input type="reset" value="取消"><input type="submit" value="送信"></div></td>
</tr>
</table>
</form>
<br>
</div>
</body>
</html>
No.2ベストアンサー
- 回答日時:
今回のエラーはX4-LDさんの回答されている通り、/System/TestServletというリソースが見つからないというエラーですね。
web.xmlの定義とformのactionの定義とでミスがありますね。
web.xmlの<servlet-class>タグにはサーブレットのクラス名を定義します。
.classはいりません。(ファイル名ではなくあくまでクラス名です。)
TestServletクラスのソースを見る限りパッケージが定義されていないので、TestServletだけで定義はokです。(余談ですが、デフォルトパッケージはあまりおすすめじゃありませんよ。簡単なサンプルでもパッケージ管理は必須と思っといた方が良いと思います。)
<url-pattern>サーブレットに対してのURLを定義するのですが、この定義方法はコンテキストルートからの指定になりますので、/Systemを明示的に定義する必要はありません。
(コンテキストにつきましては、ちょっと長くなるので説明は割愛します。ネットとかで調べてみて下さい。)
つまり、上記の定義ですと、actionに/System/System/UserAuthentication.html(または、System/UserAuthentication.html)と定義すれば、sarami_77さんが思うようなサーブレットの呼び出しが可能となりますが、多分sarami_77さん的にはactionの定義はTestServletで呼び出したいと思うので、<url-pattern>の定義を/TestServletと変更してみて下さい。
これで404エラーは解消されるとは思いますが。。。。
上記のようなweb.xmlを定義したら直接URLをたたいて見てください。
http://サーバアドレス:8080/System/TestServlet
でサーブレット呼び出しがうまく行くようになると思います。
(Tomcatのポートはデフォルトでかきました。sarami_77さんの環境に合わせて適宜変更して下さい。)
ご回答有難う御座います。
指摘された通り、ファイルを修正しましたが、まだ404エラーが吐き出されてしまいます。
参考にしている書籍が[パッケージ名]、[実体クラス名]、[付与したサーブレット名]、[アプリケーション名]をいずれもよく似た文字列を使っているので、凄く解かりづらいのです。
あなたの回答を参考に一歩でも正解に近づければと、参考にさせて頂きます。もう少し頑張ってみますね。
No.4
- 回答日時:
NO1です。
NO02さんのおっしゃるおとり、<url-pattern>にはアプリケーション名は不要で、作成したサーブレットクラスをURL呼び出す文字列を決定するタグです。
ところでアプリケーション名.xmlを作成しましたか?
$CATALINA_HOME\conf\Catalina\localhost\
に作成するのですが。ここでアプリケーションのルートを決定させるのですが。
回答有難う御座います。
X4-LDさんの言われた通りコンテキストルートについて調べてみましたが、今回のエラーとは関係ない?みたいです。
現時点ではデフォルト(何の設定もしてない)なのですが、今後必要になる事だと思うので、勉強したいと思います。
ご回答有難う御座いました。
No.3
- 回答日時:
web.xmlで認識違いがあるみたいなので補足します。
> [web.xml]
> <servlet>
> <servlet-name>実体に付与するサーブレット名</servlet-name>
> <servlet-class>パッケージ名.サーブレットの実体クラス名</servlet-class>
> </servlet>
上記はその通りです。
> <servlet-mapping>
> <servlet-name>実体に付与したサーブレット名</servlet-name>
> <url-pattern>/アプリケーション名/実体に付与したサーブレット名</url-pattern>
> <servlet-mapping>
<url-pattern>の定義はサーブレットを示すユニークなURLを定義するところです。ですので
/アプリケーション名/実体に付与したサーブレット名
では無く、
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/abc<url-pattern>
</servlet-mapping>
と定義することもできます。
その時は、actionに"/System/abc"と定義することでこのサーブレット呼び出しが行なわれるはずです。
と、いうよりwebブラウザーから
http://サーバアドレス。。。うーん、きっとTomcatを動かしているPCから確認はしてますよね?
http://localhost:8080/System/abc
でアクセスしてみてサーブレットで書き出したものが表示されず、404と出てしまう場合は、web.xmlの定義がまだ間違っている可能性はありますが、web.xmlがWEB-INFの下にない、または、WEB-INFの下のclassesディレクトリ以下にclassファイルが無いこと(コンパイルされてない)等が考えられます。
※ちなみにclassesディレクトリ以下の構成はパッケージと同じ構成になります。
例えば、hoge.sample.TestServletクラスであった場合、
WEB-INF/classes/hoge/sample/TestServlet.class
という構成になっている必要があります。
あっ!!今気づいたのですが、htmlを表示する時のURLは何を指定しましたか?
もしかして
http://localhost:8080/UserAuthentication.html
じゃないですよね?
自分の認識では、
http://localhost:8080/System/UserAuthentication. …
でhtmlの表示は上手くいったと思っているのですが。。。
ごめんなさい、返信遅れました。
ご指摘の通り、やっぱり認識に違いがあったようです。
パッケージ化したクラスファイルについてもフォルダに格納せず、そのまま放り込んでいました・・・(今回の場合はこのファイルを使ってませんが)。
頂いたアドバイスを元にweb.xmlを修正したら404エラーは無くなりました。
代わりに違うエラーでましたが(汗
ですが、サーブレットとして動作するレベルになっているのでここからは自分でなんとかしたいと思います。
アドバイス有難う御座いました。
No.1
- 回答日時:
久しぶりにみたから間違ってるかも。
間違ってたらごめんなさい。たぶんですけど、/System/TestServlet がどこにあるか認識していないのではないですか?
気になるのは、web.xmlですね。
<servlet-class>TestServlet.class</servlet-class>
.classっていらないんじゃないでした?
<servlet-name>TestServlet</servlet-name>
<url-pattern>/System/UserAuthentication.html</url-pattern>
<servlet-name>に書かれたクラスのパスを<url-pattern>に書くんじゃないですか?この場合、
【HTML】
<form action="/System/TestServlet" method="get">
【web.xml】
<url-pattern>/System/TestServlet</url-pattern>
とするんじゃなかと思います。
この回答への補足
回答ありがとう御座います。
ご指摘頂いた通り修正しましたが、やはり404エラーが発生してしまいます。
どうやらパス指定とサーブレット名の指定を混同してしまっているようです。
下記の様な認識は間違っているのでしょうか。
[web.xml]
<servlet>
<servlet-name>実体に付与するサーブレット名</servlet-name>
<servlet-class>パッケージ名.サーブレットの実体クラス名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>実体に付与したサーブレット名</servlet-name>
<url-pattern>/アプリケーション名/実体に付与したサーブレット名</url-pattern>
<servlet-mapping>
[html]
<form action="アプリケーション名/実体に付与したサーブレット名">
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP php ログイン 1 2022/11/01 00:24
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPからServletへの遷移
-
servletでHTTPステータス404エ...
-
tomcatとapacheの連携
-
resin.confの設定でご質問です
-
サーブレットが実行できない
-
JSPからサーブレットを呼び出す...
-
JSPからクラス(サーブレット)...
-
list<クラス名> とは何でしょう...
-
サーブレットが起動しない
-
eclipse servlet 404対処方法
-
JSPからサーブレットを呼び出す...
-
is this even a thing?
-
Eclipseで、プロジェクト名のと...
-
Eclipse・プロジェクトで、フォ...
-
html上で、バッチやexeファイル...
-
Eclipse(JAVA)のデバッグで他...
-
split関数で区切り文字がない場合
-
正しいURL指定しているにもかか...
-
JSPのクラスをコンパイルできな...
-
シンボルが見つかりませんとい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPからServletへの遷移
-
servlet (resin) について
-
【Servletのエラーについて教え...
-
「javax.servlet.ServletExcept...
-
サーブレットが起動しない
-
servletでHTTPステータス404エ...
-
eclipse servlet 404対処方法
-
JSPからサーブレットを呼び出す...
-
サーブレットが実行できない
-
[Servlet]ページ表示に関して
-
Eclipseにおけるサーブレット作...
-
WEB開発をはじめたばかりの初心...
-
eclipse でjspからJavaを実行す...
-
resin.confの設定でご質問です
-
Tomcatでサーブレットを動かそ...
-
サーブレット フィルタ
-
Tomcat起動時にエラーが発生し...
-
テーブルにレコードを追加する...
-
HTTPステータス 404 - /servlet...
-
list<クラス名> とは何でしょう...
おすすめ情報