- ベストアンサー
サーブレットの構成が上手く行かない
サーバーサイド技術の学習を始めたばかりの新参者です。 今回はサーブレットが動作しない問題が発生したため、質問させて頂きます。 要件はウェブブラウザで"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>
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
今回のエラーは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さんの環境に合わせて適宜変更して下さい。)
その他の回答 (3)
- X4-LD
- ベストアンサー率22% (11/49)
NO1です。 NO02さんのおっしゃるおとり、<url-pattern>にはアプリケーション名は不要で、作成したサーブレットクラスをURL呼び出す文字列を決定するタグです。 ところでアプリケーション名.xmlを作成しましたか? $CATALINA_HOME\conf\Catalina\localhost\ に作成するのですが。ここでアプリケーションのルートを決定させるのですが。
お礼
回答有難う御座います。 X4-LDさんの言われた通りコンテキストルートについて調べてみましたが、今回のエラーとは関係ない?みたいです。 現時点ではデフォルト(何の設定もしてない)なのですが、今後必要になる事だと思うので、勉強したいと思います。 ご回答有難う御座いました。
- Pkakedashi
- ベストアンサー率68% (11/16)
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 でhtmlの表示は上手くいったと思っているのですが。。。
お礼
ごめんなさい、返信遅れました。 ご指摘の通り、やっぱり認識に違いがあったようです。 パッケージ化したクラスファイルについてもフォルダに格納せず、そのまま放り込んでいました・・・(今回の場合はこのファイルを使ってませんが)。 頂いたアドバイスを元にweb.xmlを修正したら404エラーは無くなりました。 代わりに違うエラーでましたが(汗 ですが、サーブレットとして動作するレベルになっているのでここからは自分でなんとかしたいと思います。 アドバイス有難う御座いました。
- X4-LD
- ベストアンサー率22% (11/49)
久しぶりにみたから間違ってるかも。間違ってたらごめんなさい。 たぶんですけど、/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="アプリケーション名/実体に付与したサーブレット名">
お礼
ご回答有難う御座います。 指摘された通り、ファイルを修正しましたが、まだ404エラーが吐き出されてしまいます。 参考にしている書籍が[パッケージ名]、[実体クラス名]、[付与したサーブレット名]、[アプリケーション名]をいずれもよく似た文字列を使っているので、凄く解かりづらいのです。 あなたの回答を参考に一歩でも正解に近づければと、参考にさせて頂きます。もう少し頑張ってみますね。