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

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

新規登録して質問してみよう
ただいま回答率
85.47%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

2回答

202閲覧

コンテキストpathが間違っているのか、ClassNotFoundException:エラーが解決できない

Riehlvelt_love

総合スコア43

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2024/04/17 01:36

編集2024/04/18 06:55

実現したいこと

ClassNotFoundException:エラーを解決したい

前提

MVCモデルを勉強しています。

search.jspにて、検索キーワードを入力したらデータベース検索し、list.jspにて検索結果を表示させたいのですが、検索するとClassNotFoundException:が出てきて解決されません。
よろしくお願いします

フォルダ階層

発生している問題・エラーメッセージ

java.lang.ClassNotFoundException: SearchAction at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:421) at java.base/java.lang.Class.forName(Class.java:412) at tool.FrontController.doPost(FrontController.java:43) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at tool.EncordingFilter.doFilter(EncordingFilter.java:30) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1583)

該当のソースコード

Action.java

1//アクションクラスのスーパークラス 2package tool; 3 4import jakarta.servlet.http.HttpServletRequest; 5import jakarta.servlet.http.HttpServletResponse; 6 7public abstract class Action { 8 9 public abstract String execute( 10 HttpServletRequest request, HttpServletResponse response 11 ) throws Exception; 12}

SearchAction.java

1 2package chapter23; 3 4import java.util.List; 5 6import bean.Product; 7import dao.ProductDAO; 8import jakarta.servlet.http.HttpServletRequest; 9import jakarta.servlet.http.HttpServletResponse; 10import tool.Action; 11 12public class SearchAction extends Action{ 13 14 public String execute( 15 HttpServletRequest request, HttpServletResponse response 16 ) throws Exception{ 17 String keyword=request.getParameter("keyword"); 18 19 ProductDAO dao=new ProductDAO(); 20 List<Product> list=dao.search(keyword); 21 22 request.setAttribute("list", list); 23 return "list.jsp"; 24 25 } 26 27} 28

FrontController.java

1//コントローラーのクラス 2package tool; 3 4import java.io.IOException; 5import java.io.PrintWriter; 6 7import jakarta.servlet.ServletException; 8import jakarta.servlet.annotation.WebServlet; 9import jakarta.servlet.http.HttpServlet; 10import jakarta.servlet.http.HttpServletRequest; 11import jakarta.servlet.http.HttpServletResponse; 12 13/** 14 * Servlet implementation class FrontController 15 */ 16@WebServlet(urlPatterns= {"*.action"}) 17public class FrontController extends HttpServlet { 18 private static final long serialVersionUID = 1L; 19 20 /** 21 * @see HttpServlet#HttpServlet() 22 */ 23 public FrontController() { 24 super(); 25 // TODO Auto-generated constructor stub 26 } 27 28 29 30 /** 31 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 32 */ 33 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 // TODO Auto-generated method stub 35 //doGet(request, response); 36 PrintWriter out=response.getWriter(); 37 System.out.print("ビンゴ"); 38 39 40 41 try { 42 String path=request.getServletPath().substring(1); 43 String name=path.replace(".a", "A").replace('/', '.'); 44 Action action=(Action)Class.forName(name).getDeclaredConstructor().newInstance(); 45 String url=action.execute(request, response); 46// System.out.print(url); 47// String url1="WEB-INF/jsp/"; 48 request.getRequestDispatcher(url).forward(request,response); 49 }catch(Exception e) { 50 e.printStackTrace(out); 51 } 52 } 53 54 /** 55 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 56 */ 57 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 58 // TODO Auto-generated method stub 59 //response.getWriter().append("Served at: ").append(request.getContextPath()); 60 doPost(request,response); 61 } 62 63} 64

search.jsp

1//検索するjsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%@ include file="header.jsp" %> 5 <p>検索キーワードを入力してください</p> 6 <form action="Search.action" method="post"> 7 <input type="text" name="keyword"> 8 <input type="submit" value="検索"> 9 10 </form> 11 <%@ include file="footer.jsp" %> 12

list.jsp

1//検索結果を表示するjsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <%@ include file="header.jsp" %> 5 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 6 7 list.jspだよ 8 <c:forEach var="p" items="${list }"> 9 10 ${p.id}: ${p.name}: ${p.price} 11</c:forEach> 12 <%@ include file="footer.jsp" %>

試したこと

SearchActionクラスが見つからないとエラーが言っているのでFrontController.javaが原因だとは思うのですが、何が間違ってい折るのか分かりません。

補足情報(FW/ツールのバージョンなど)

サーバー情報:Tomcat10Java21

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

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

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

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

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

jimbe

2024/04/17 04:31 編集

コードのマークダウンでファイル名等("Action.java(アクションクラスのスーパークラス)")を書かれている個所は言語名("java")を書く所です。 ファイル名等はコードのマークダウンの外に書いてください。 また、 JSP と JSF は違うものです。
Riehlvelt_love

2024/04/17 07:18

コメントありがとうございます。 ファイル名等は今後、コードのマークダウンの外に書くようにします。 タグの修正もjsf→jspに変更いたしました。
jimbe

2024/04/18 04:49

修正ありがとうございます。 >ファイル名等は今後、コードのマークダウンの外に書くようにします。 質問はずっと残り、後進の方々への情報となります。言語名にするとコード内のキーワードに色が付いて一層読みやすくなります。 後と言わず本件から直して戴けるとより良くなると思いますが如何でしょうか。
Riehlvelt_love

2024/04/18 04:54

承知しました。 質問のファイル名をを修正いたしました。
jimbe

2024/04/18 10:09

すいません、ファイル名にするのでは無く言語名です。 例えば ```Action.java とされている所を Actrion.java ```java とすると、 package とか import とかが青くなったりクラス名が赤くなったりとなります。修正中でもプレビューで色が変わるのも見られると思いますので、変化を確認してみてください。
guest

回答2

0

ベストアンサー

SearchActionクラスが見つからないとエラーが言っているのでFrontController.javaが原因だとは思うのですが、何が間違ってい折るのか分かりません

「何が」を確認するためには「何処で」というのも重要な情報になります。
例外のスタックトレースの中に

at tool.FrontController.doPost(FrontController.java:43)

という行があり、例外が発生した時の一連のメソッド呼び出しの中で唯一ご自身のコードが関係している個所を示しています。
FrontController.java の 43 行目は

Action action=(Action)Class.forName(name).getDeclaredConstructor().newInstance();

であり、クラス名文字列からオブジェクトを生成してる個所ですので文字列が間違っていたら ClassNotFound が起きることが分かります。
name の値と、その値で目当てのクラスにアクセス出来る設定なのかを確認てください。

投稿2024/04/17 04:25

jimbe

総合スコア12659

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

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

Riehlvelt_love

2024/04/18 02:38 編集

回答ありがとうございます。 参考書には.getServletPath()で、/chapter23/Search.actionのpathが得られると書いてあるのですがSystem.out.println(path); System.out.println(name); としてpathとnameの値を確認すると、SearchAction、しか取得できていませんでした。 考えている内に頭がまとまらなくなってきたのでまた検証いたします。
jimbe

2024/04/18 04:42 編集

getServletPath() で "/chapter23/Search.action" を得るには、 html の form の action にそうなる様に書く必要があるでしょう。 html (を表示するブラウザ) 側はサーブレットの存在自体知らないので勝手に chapter23 を入れてくれることはありませんし、サーブレット側もパッケージまで補完してくれる機能はありません。
Riehlvelt_love

2024/04/18 06:57

serch.jspにて <input type="hidden"value="chapter23." name="url">とし、 FrontControlle.java側で下記のように受け取り、インスタンス生成することが出来ました。ありがとうございます。 m.ts10806様も本当にありがとうございました。 try { String url1=request.getParameter("url"); String path=request.getServletPath().substring(1); String name=path.replace(".a", "A").replace('/', '.'); Action action=(Action)Class.forName(url1+name).getDeclaredConstructor().newInstance(); String url=action.execute(request, response); System.out.print(url); String url2="WEB-INF/jsp/"; RequestDispatcher dispatcher= request.getRequestDispatcher(url2+url); dispatcher.forward(request,response); System.out.print("成功"); }catch(Exception e) { e.printStackTrace(out); } }
guest

0

単にFrontControllerから"SearchAction"だけで呼び出そうとしているので
同じパッケージ内(今の構成だとtool)のSearchActionを参照しようとしているのではないかと思います。

何かしらでパッケージ名も含めてクラス名を渡してあげてください。

actionのURLに含む、クラスとパッケージのマッピング配列みたいなものを作る、プロパティファイルに定義する など

投稿2024/04/17 04:25

m.ts10806

総合スコア80850

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

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

Riehlvelt_love

2024/04/18 02:17 編集

回答ありがとうございます。 参考書には.getServletPath()で、/chapter23/Search.actionのpathが得られると書いてあるのですがSystem.out.println(path); System.out.println(name); としてpathとnameの値を確認すると、SearchAction、しか取得できていませんでした。 >何かしらでパッケージ名も含めてクラス名を渡してあげてください。 >actionのURLに含む、 ご教示ありがとうございます。 String url1="/chapter23/"; のような形で定義し、 Action action=(Action)Class.forName(url1+name).getDeclaredConstructor().newInstance();と呼び出そうかと思いましたが、 url1の参照先が毎回/chapter23/なら良いと思いますが、参照先が変わる場合(パッケージがchapter24やchapter26など)はどうすれば良いでしょうか? >クラスとパッケージのマッピング配列みたいなものを作る、プロパティファイルに定義する  こちらについても、参照されるパッケージ名が毎度同じと限らない場合はどうすればいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問