現在『スッキリわかるサーブレット&JSP入門 第2版』で学習を進めています。
その中で簡単なサーブレットを作成し、サーバ上で実行する項目があり、そこで躓いてしまいました。
ディレクトリ構造は以下の通りです。
ちなみに、Ayabe.htmlをサーバで実行することはできています。
SampleServlet.java
package servlet; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jakarta.servlet.annotation.WebServlet; @WebServlet("/SampleServlet") public class SampleServlet extends HttpServlet{ static final long serialUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ String[] luckArray = {"大吉", "末吉", "凶"}; int index =(int)(Math.random() * 3); String luck = luckArray[index]; Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("MM月dd日"); String today = sdf.format(date); response.setContentType("text/html, charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>占い</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>" + today + "の運勢は「" + luck + "」です</p>"); out.println("</body>"); out.println("</html>"); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" id="WebApp_ID" version="2.4"> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <description></description> <display-name>SampleServlet</display-name> <servlet-name>SampleServlet</servlet-name> <servlet-class>servlet.SampleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleServlet</servlet-name> <url-pattern>/SampleServlet</url-pattern> </servlet-mapping> </web-app>
以上が今回記述したコードです。この状態で実行すると以下のようなエラー画面が出てきてしまいます。
また、コンソールには、
また、コンソールには
情報: Serverのバージョン名: Apache Tomcat/10.0.6 [金 9月 10 18:56:08 JST 2021]
情報: Server ビルド: May 8 2021 15:24:15 UTC [金 9月 10 18:56:08 JST 2021]
情報: サーバーのバージョン番号: 10.0.6.0 [金 9月 10 18:56:08 JST 2021]
情報: OS 名: Windows 10 [金 9月 10 18:56:08 JST 2021]
情報: OS バージョン: 10.0 [金 9月 10 18:56:08 JST 2021]
情報: アーキテクチャ: amd64 [金 9月 10 18:56:08 JST 2021]
情報: Java Home: C:\pleiades-2021-06-java-win-64bit-jre_20210629 (2)\pleiades\java\16 [金 9月 10 18:56:08 JST 2021]
情報: JVM バージョン: 16.0.1+9 [金 9月 10 18:56:08 JST 2021]
情報: JVM ベンダ: AdoptOpenJDK [金 9月 10 18:56:08 JST 2021]
情報: CATALINA_BASE: C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0 [金 9月 10 18:56:08 JST 2021]
情報: CATALINA_HOME: C:\pleiades-2021-06-java-win-64bit-jre_20210629 (2)\pleiades\tomcat\10 [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: -Dcatalina.base=C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0 [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: -Dcatalina.home=C:\pleiades-2021-06-java-win-64bit-jre_20210629 (2)\pleiades\tomcat\10 [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: -Dwtp.deploy=C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: --add-opens=java.base/java.io=ALL-UNNAMED [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: --add-opens=java.base/java.util=ALL-UNNAMED [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: -Dfile.encoding=UTF-8 [金 9月 10 18:56:08 JST 2021]
情報: コマンドライン引数: -XX:+ShowCodeDetailsInExceptionMessages [金 9月 10 18:56:08 JST 2021]
情報: 商用環境に最適な性能を発揮する APR ベースの Tomcat ネイティブライブラリが java.library.path [C:\pleiades-2021-06-java-win-64bit-jre_20210629 (2)\pleiades\java\16\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/pleiades-2021-06-java-win-64bit-jre_20210629 (2)/pleiades/eclipse//jre/bin/server;C:/pleiades-2021-06-java-win-64bit-jre_20210629 (2)/pleiades/eclipse//jre/bin;C:\Java\apache-maven-3.8.1\bin;C:\Java\apache-maven-3.8.1\bin;C:\Program Files\AdoptOpenJDK\jdk-11.0.11.9-hotspot\bin;C:\Program Files (x86)\Common Files\Apple\Apple Application Support;C:\Program Files (x86)\Intel\iCLS Client;C:\Program Files\Intel\iCLS Client;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Common Files\Roxio Shared\DLLShared;C:\Program Files (x86)\Common Files\Roxio Shared\OEM\12.0\DLLShared;C:\Program Files (x86)\Roxio 2010\OEM\AudioCore;c:\Program Files (x86)\Common Files\Ulead Systems\MPEG;C:\Program Files\Intel\WiFi\bin;C:\Program Files\Common Files\Intel\WirelessCommon;C:\Program Files (x86)\Fujitsu\FJAgent\Core\bin;C:\WINDOWS\System32\Op;C:\Program Files\Git\cmd;C:\Users\makin\AppData\Local\Microsoft\WindowsApps;C:\Users\makin\AppData\Local\atom\bin;C:\Users\makin\AppData\Local\GitHubDesktop\bin;E:\BCC102\bin;%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;;C:\pleiades-2021-06-java-win-64bit-jre_20210629 (2)\pleiades\eclipse;;.] に存在しません。 [金 9月 10 18:56:08 JST 2021]
情報: プロトコルハンドラ ["http-nio-8080"] を初期化します。 [金 9月 10 18:56:09 JST 2021]
情報: サーバーの初期化 [1532]ms [金 9月 10 18:56:09 JST 2021]
情報: サービス [Catalina] を起動します [金 9月 10 18:56:09 JST 2021]
情報: サーブレットエンジンの起動:[Apache Tomcat/10.0.6] [金 9月 10 18:56:09 JST 2021]
情報: プロトコルハンドラー ["http-nio-8080"] を開始しました。 [金 9月 10 18:56:09 JST 2021]
情報: サーバーの起動 [832]ms [金 9月 10 18:56:09 JST 2021]
情報: サーブレット [servlet.SampleServlet] を利用不可能にマークします [金 9月 10 18:56:10 JST 2021]
重大: サーブレット [servlet.SampleServlet] に例外を割り当てます [金 9月 10 18:56:10 JST 2021]
と記載されていました。
その後web.xmlに問題があると思い、<servlet>から</servlet-mapping>ををコメントアウトすると、
500のエラー(クラス [servlet.SampleServlet] はServletではありません)が以下の記述とともに出てきました。
例外
jakarta.servlet.ServletException: クラス [servlet.SampleServlet] はServletではありません
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1696)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:831)
根本原因
java.lang.ClassCastException: class servlet.SampleServlet cannot be cast to class jakarta.servlet.Servlet (servlet.SampleServlet is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @3568f9d2; jakarta.servlet.Servlet is in unnamed module of loader java.net.URLClassLoader @5a10411)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1696)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:831)
様々なサイトやこのサイトの似たような質問も拝見し試してみましたがうまくいきませんでした。
どこを直したらうまくいきますでしょうか?もし有用なサイトや不備がありましたら教えていただきたく思います。
ちなみにweb.xmlについては私は手を加えておらず一度コメントアウトした箇所はservlet作成の際に自動で付け加えられたものです。
開発環境
統合開発環境:Eclipse IDE(version:2021-06 (4.20.0))
サーバ:Tomcat10_Java16
追記
新規→その他→サーブレットからServlet.javaを作成し、とくにコードを付け加えていない状態のままサーバ上で実行しましたが、web.xmlでのコメントアウト前はTomcatの実行に失敗し、コメントアウト後では404のエラーが出ました。
回答1件
あなたの回答
tips
プレビュー