質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

3696閲覧

サーブレットがサーバ上で実行できない

hirono_suke

総合スコア7

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

1クリップ

投稿2021/09/10 10:14

編集2021/09/10 11:17

現在『スッキリわかるサーブレット&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のエラーが出ました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/09/10 10:54

> 統合開発環境:eclipse(最新のものを使用) "最新"と言うのは今時点のもので、相対的なものです。後日、この質問回答を読んだ時に情報の価値が減るので、このような記載をする場合は具体的なバージョン情報を挙げましょう。 例えばEclipse のメニューから「Help」→「About Eclipse IDE」などと辿ってバージョン情報を確認することができるはずです。 また、 > サーバ:Tomcat10_Java16 ですが、Eclipseの新規プロジェクトで簡単なサーブレットを作ってちゃんと動きますか? まずそれが第一条件です。その基本的な状態で動かない場合、いじくりまわした個人のプロジェクトを動かすことは難しいです。
hirono_suke

2021/09/10 11:18

ご指摘ありがとうございます。質問に追記を加えましたので一度ご確認いただけると幸いです。
guest

回答1

0

自己解決

jakarta.servletがtomcat10_java16に対応していないのが問題のようでした。
新しくプロジェクトを作り、ターゲットランタイムをtomcat9_java16に設定し、同様の手順でサーブレットを起動させたら文字化けは起きたものの数字やアルファベットは表示されました。

投稿2021/09/10 14:07

hirono_suke

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問