質問: ### 前提・実現したいこと javaのサーブレットとjspを用いて学習しております。 jspで入力した名前をサーブレットを通して他のjspに出力するプログラムを作っております。 jspはブラウザにて表示されますが、名前を入力してボタンを押してもエラーが出て進みません。 ### 発生している問題・エラーメッセージ ``` 以下のようなメッセージが出力される。 HTTPステータス 500 - サーブレットクラス form.inputServlet を初期化中にエラーが発生しました type 例外レポート メッセージ サーブレットクラス form.inputServlet を初期化中にエラーが発生しました 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 javax.servlet.ServletException: サーブレットクラス form.inputServlet を初期化中にエラーが発生しました org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) 原因 java.lang.ClassNotFoundException: form.inputServlet org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:745) ``` ### ファイルの設定位置 ``` Nameinput(プロジェクト) -WEB-INF/src --form(パッケージ) ---inputServlet.java(サーブレット) -form-input(jspファイル) --input.jsp(入力画面) --inputConfirm.jsp(出力画面) -WEB-INF --web.xml 見づらいかもしれませんがこのような形です。 ``` ### 該当のソースコード servlet ``` package form; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class inputServlet extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { common(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { common(request,response); } private void common(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("Windows-31J"); String name=request.getParameter("name"); //(1) request.setAttribute("name",name); //(2) response.setContentType("text/plain;charset=Windows-31J"); RequestDispatcher dispatcher=request .getRequestDispatcher("/form-input/inputConfirm.jsp"); dispatcher.forward(request,response); } } ``` jsp(入力画面) ``` <%@page contentType="text/html; charset=Windows-31J" %> 氏名を入力してください。 氏名 ``` jsp(出力画面) ``` <%@page contentType="text/html; charset=Windows-31J" %> 氏名を確認します。 氏名<%=request.getAttribute("name") %> ``` web.xml ``` inputServlet form.inputServlet inputServlet /inputServlet ``` ### 試したこと 再起動を繰り返す→変化なし 環境変数を設定すると解決するらしく、試したが通らない(おそらく指定の仕方が間違っている) ### 補足情報(言語/FW/ツール等のバージョンなど) 開発環境:Eclipse4.6 Tomcat8.0.37 Eclipse及びTomcatは下記のサイトからダウンロードしたものを使っております。 http://mergedoc.osdn.jp/ 「All in One」をダウンロードしましたので、Tomcatは個別に設定を行っておりません。 ちなみにTomcatフォルダで作り、Tomcatアイコンを起動して、ブラウザでアドレスを入力しています。 原因を調べてみても詳しい理由と解決方法がわからず困っています。
回答: 私も最近javaサーブレットを学習しました。 その時エラーが頻発してかなり時間を消費したのを覚えています。 簡単なトラブルシューティングの経験を ご参考のためにお話しします。(解決する方法と言うより物の見方と解釈して下さい) 以下詳細です。 ■対処1■ 基本的に今の環境でjsp単体ではなく javaサーブレットを介した簡単なプログラムが起動する →この場合単純に ClassNotFoundException等エラーが出ていますので プログラムが悪いのでその部分を直すべきです。 javaサーブレットが動くかどうかは すごく重要です、tomcatがちゃんと設定されているかとか jarファイルが指定位置に配置されているかとか しっかり土台がミスしていない時しかサーブレットは動きませんので。 今のサーブレットプログラムではなく 『他の人が書いたサーブレットプログラムがきちんと動作するか』を 判断基準にして切り分けてトラブルシューティングすると楽です。 ■対処2■ web.xmlの設定を見直してください。 jspの この部分がなんとなく気になったんですが ではダメでしょうか? 微妙な部分の間違えで動かない等も有りますので 設定の確認をもう1度しましょう。 ■対処3■ tomcatは最近のeclipsの場合中に入っているので tomcatを使う時にコンテキストの更新をして 設置を確認して下さい 詳しくはわからなければ調べてください。 tomcatでもし不安があっても 下手にtomcatをインストールとかすると競合してエライ事に なるのでその場合はコンパネから余計なtomcatがあれば消してください 要はeclipsに入ってるtomcatをちゃんと動かせばいいと言うだけです。 ※ちなみに私の環境ではうまく動かなかったので eclips4.3に入っているtomcatでサーブレットを動かしてました。 長々といろんな方向からアドバイスしてしまい 解決が余計難しく感じたかもしれません >java.lang.ClassNotFoundException: form.inputServlet >form.inputServlet ここが無いってエラーはいてるっぽいので まずは最初に疑うはここでしょうね 設定を見直すなど 上記のアドバイスをご参考に ぜひ頑張ってください。