QA@IT

formタグのaction属性でサーブレットを指定してもエラーが発生する

13229 PV

サーブレット初心者です。初歩的な質問ですみません。
現在、あるサーブレットの入門書で学習中なのですが、エラーを解決する方法がわからないため質問させていただきます。

echo.jspというjspファイルにformタグでaction属性を記述したのですが、
「EchoServlet」の部分に赤線が引かれ、エラーになってしまいます。

echo.jsp

<form action="EchoServlet">
    <input type="text" name="message" >
    <input type="submit">
</form>

EchoServlet.javaというサーブレットを呼び出したいのですが、
URIの指定を色々と試したもののエラーが解消されません。
カーソルを合わせると「Element "EchoServlet" not found」と表示されます。
echo.jspを実行するとjava.lang.ClassNotFoundExceptionが発生します。

各ファイルのロケーションは以下の通りです。
ServletBeginner\src\echo\EchoServlet.java
ServletBeginner\WebContent\echo.jsp

このようなエラーが発生した場合の
疑われる原因とその対処法についてアドバイスを教えていただけたら幸いです。

なお、eclipseとtomcatを使って開発しています。
何卒、ご教授のほどよろしくお願いいたします。

  • javaファイルのままでは動作しません。classesはどこに配置されていますか? -

回答

とりあえず、Tomcatの状態はわかりませんが状況を聞いていると長くなりそうなので、
eclipseのダウンロードから簡単なサーブレットの実行まで示します。

どうやらこのサイトも画像もアップロードできるようになったみたいですし活用させてもらいます。

pleiadesプロジェクトのeclipseのダウンロード

まずeclipseをダウンロードします。
確実にtomcat付属のeclipseを用意したいというだけなので、入門書でも同じものをダウンロードしていたらそのままそれを使っても構いません。

ただし、自信がないのであれば改めてダウンロードされるといいでしょう(元のeclipseはそのままのこしてわかったら今回ダウンロードしたものを削除して、元のeclipseにもどって問題ありません)

以下のページから、Javaの32bitをダウンロードします。(64bit OSなら64bitでも構いません。)

http://mergedoc.sourceforge.jp/index.html#/pleiades.html

qait4138_01.png

解凍

任意のドライブ(ここでは仮にCとします)にqディレクトリを作成して、
c:\q\pleiades\eclipse となるように解凍します。

(c:\pleiades でも問題ありません。qというよくわからないディレクトリ名を指定してるのは、なるべくパスが長くならないようにしたくて1文字にしただけです)

例えばこんなような階層になっていればOKです。

qait4138_02.png

eclipseを開きます

そのまえに今使っているtomcatは停止してください(tomcatをどう入れたか知らないので説明できませんがtomacatの再起動をしたことがあれば、その並びに停止などもあると思います。)。
起動していると同じポートを使うために今解凍した方のtomcatが起動できません。

ワークスペースの位置はそのまま(../workspace)でかまいません。

qait4138_03.png

eclipseを起動したら、サーバープロジェクトを作成します。

ファイル > 新規 > その他

サーバーのサーバーを選択して次へ

qait4138_04.png

上にスクロールしてApacheを展開してTomcat 7を選択して次へ

qait4138_05.png

Tomcatインストールディレクトリに解凍したPleiadesのtomcat\7のディレクトリを指定して次へ

qait4138_06.png

次へを押して、完了。

動的Webプロジェクトの作成

ファイル > 新規 > プロジェクト

webの動的Webプロジェクト

さっき設定したサーバーの設定が一つだけあるので、Tomcat 7が勝手に選ばれている。

qait4138_07.png

プロジェクト名は適当に qait4138 とでもつけて次へ

qait4138_08.png

もう一度次へ

web.xmlデプロイメント~にチェックをつけて完了

qait4138_09.png

「~パースペクティブを開きますか?」は 「はい」

下のペインにサーバータブがあることを確認する。なければ、ウィンドウ > ビューの表示 > サーバー

qait4138_10.png

ここでサーバーの開始や停止などもできる(今はやらない)。

サーブレットの追加

qait4138プロジェクトを右クリックして、新規>サーブレット

qait4138_11.png

パッケージ名とクラス名を適当に入れる

qait4138_12.png

以降はデフォルトでいいので次へも押さずにもう完了ボタンで作成してしまう。

doGetのTODOコメントを消しての以下のようになるようにコードを1行追加。
(途中で「いくつかのコンテンツプロポーザルサインは・・・」というのがもし出たら、デフォルトの復元を押す。)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.getWriter().println("Hello"); // この行を追加

}

メニューの下にある開始ボタンを押す

qait4138_13.png

使用するサーバーの選択で、「ローカル・ホストのTomcat v7.0 サーバー」を選択されていること、

次へを押して「qait4138」が右側にいることを確認して完了を押す。

Helloとでればサーブレットは動作している状態。

qait4138_14.png

確認がすんだら、サーバータブの停止ボタンで、サーバーを停止する。
(ずっと使うならこまめにとめる必要はないが、元のtomcatに戻るときにこちらが起動してると元のtomcatが起動できなくなるので)

qait4138_15.png


(細かい説明は省きますが)今回の設定は開発用の設定なので、独立したtomcatに配置するのとはちょっと違っています。(eclipseの便利な機能におんぶにだっこで配置の事は考えてない)

なので独立したtomcatへの配置には参考にならないと思います。


別のtomcatに試しに配置

ついでに、tomcatのダウンロード~さっきのサーブレット動作確認まで。

画像は貼りすぎたのでもあまり貼りません。
jreかjdkがinstallされていること。

http://tomcat.apache.org/download-70.cgi

「32-bit Windows zip」または「64-bit Windows zip」をダウンロードする(64bit OSなら64bitでも良い)

適当なところに解凍する。
(仮にC:\apache-tomcat-7.0.57に解凍したとする)

ファイルをコピーする

  • ディレクトリ C:\apache-tomcat-7.0.57\webapps\qait4138 を作成

  • C:\q\pleiades\workspace\qait4138\WebContent\WEB-INF

    -> C:\apache-tomcat-7.0.57\webapps\qait4138\WEB-INF にコピー

  • C:\q\pleiades\workspace\qait4138\build\classes

    -> C:\apache-tomcat-7.0.57\webapps\qait4138\WEB-INF\classes にコピー

(多分その入門書でも最後にはwarを作るでしょうから最終的にはこんなベタなコピーはしなくなります)

  • C:\apache-tomcat-7.0.57\bin\startup.batでtomcatを起動。
    黒画面が残る。(残らない場合は、ほかのtomcatを停止し忘れていないか確認する) qait4138_16.png

ブラウザで http://localhost:8080/qait4138/Hello にアクセスして

Helloと表示されればOK

jsp

ちなみにhttp://localhost:8080/qait4138/index.jsp でjspを表示させる場合は、
C:\apache-tomcat-7.0.57\webapps\qait4138\index.jspにファイルを配置する。

バージョンエラー

以下の様なエラーが出た場合、

qait4138_17.png

実行に使われているバージョンとビルドに使われているバージョンが違ういうエラーなので、
eclipseのプロジェクトのプロパティで以下のコンパイラ準拠レベルを変更する。

システムに入っているjavaのバージョンに併せればよいが、そもそもtomcat 7はjava 1.6以降が必要なので、
1.6, 1.7, 1.8 それぞれ試してみればいいビルドしたらclassesをコピーしなおして、

C:\apache-tomcat-7.0.57\bin\shutdown.bat

C:\apache-tomcat-7.0.57\bin\startup.bat

の順に実行(ダブルクリック)する。shutdown.batを実行すると、開いたままだった黒画面が閉じる。

qait4138_18.png


以上、入門書のやり方と同じか知らないので参考になるかわからないですが、とりあえず動かせると思います。

※ 大分分量の多い回答になってしまいましたが、個人的に別件で何か所かでこの資料使う予定もあったので今回は特別です。

編集 履歴 (0)
  • 懇切丁寧に説明してくださってどうも有難う御座いました。問題の原因ははっきりしませんでしたが、eclipseを再インストールして設定し直したところ、問題なく実行することができました。重ねて御礼申し上げます。 -

すみません、eclipseを使用しているのですが、classesフォルダが見つかりませんでした。
調べてみたところ、どうやら一般的にはWEB-INF下にclassesを作成するみたいなのですが、
classesはプロジェクトを新規作成した時点で自動生成されるものなのでしょうか。
それとも別途自分自身で作成した方がよろしいのでしょうか。

編集 履歴 (0)
  • tomcatがeclipse付属の物であれば自動的に配置されている可能性はあります。
    (実際の公開を見越しているなど)tomcatを別立てしているのであれば、自分で配置する必要があります。(配置すべきclassファイルはeclipseがビルドしてくれているとおもいますので、workspace内を探してみてください。)
    -
  • エクスプローラでworkspace内を探したところ、プロジェクト下のbuildフォルダ内にclassesファイルが見つかりました(ファイルのパス:HelloServlet\build\classes)。ただ、eclipseのプロジェクトエクスプローラー上では、buildファイル内は空になっていてclassesファイルがありませんでした。
    -
  • あれから色々と見直したのですが、どうもEchoServlet.javaを保存してもweb.xmlに自動生成されていないことが原因のような気がしてきました。プロジェクトの設定では自動生成されるようにチェックをしたのですがなぜか出来ていません。 -
  • エラーの可能性として考えられるのは、classesファイル、web.xml、環境変数あたりでしょうか。 -
  • あまり根拠のない段階であれこれやると別の原因を作ってしまうことにもなるので注意してください。「EchoServlet.javaを保存してもweb.xmlに自動生成されていないことが原因のような」というのはサーブレットマッピングの設定ですかね?
    今は初歩の段階だとServer.xmlぐらいしか変えないような気がしますが。どこかのサイトを参考にしてるんですか?
    -
  • Tomcatはどのように用意してますか?eclipseとは別にダウンロードしてるんですか? -
ウォッチ

この質問への回答やコメントをメールでお知らせします。