K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2233] eclipseでHenacatを作成したい
投稿者:こー
2020/08/15 18:05:40

書籍『基礎からのWebアプリケーション開発入門』をもとに、 eclipseを用いてHenacatを作成(第3章)していますが、以下のような状況です。 なお、Webアプリケーションの名前はmakeTcpServerとしています。 Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 java.lang.ClassNotFoundException: ShowBBS at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) at java.base/java.lang.Thread.run(Thread.java:834) とExceptionが発生してしまいます。 作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に 設置しているのですが、そのほかに原因があるのでしょうか。 書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2234] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/15 22:50:18

はじめまして。ご質問ありがとうございます。 >Mainを実行して、URL(http://localhost:8001/makeTcpServer/ShowBBS)をたたくと、 > >java.lang.ClassNotFoundException: ShowBBS > at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) > at java.base/java.net.FactoryURLClassLoader.loadClass(URLClassLoader.java:899) > at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) > at com.kokun.henacat.servletimpl.ServletService.createServlet(ServletService.java:17) > at com.kokun.henacat.servletimpl.ServletService.doService(ServletService.java:56) > at com.kokun.henacat.webserver.ServerThread.run(ServerThread.java:90) > at java.base/java.lang.Thread.run(Thread.java:834) このスタックトレースから分かることは、Hanecatから掲示板のクラス(ShowBBS)を 読み込もうとしてそれが見つからないのでエラーになっている、ということです。 Henacatでは、サーブレットのクラスファイルを置くパスをソース内にべた書きしているので、 Eclipseの設定とかが原因とも思えません。 >作成したクラスファイルは、WEBAPPS_DIR = "C:\\Henacat_0_1\\webapps"配下に >設置しているのですが、そのほかに原因があるのでしょうか。 ここですが、 C:\Henacat_0_1\webapps\ の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 >書籍132ページのクラスファイルの部分が正確に理解できていない気もしていますが、ご教授いただけるとありがたいです。 書籍132ページにはこうあります。 >作成したクラスファイルの配置場所ですが、リスト3-15のWebApplication.javaの8 行目の >WEBAPPS_DIRに設定されているディレクトリの下に、Webアプリケーション名(testbbs)の >ディレクトリを作成し、その直下に入れてください(WEB-INFとかclassesディレクトリは不要)。 つまり、 C:\Henacat_0_1\webapps\testbbs\ の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを くっつけたパスからクラスを検索しているからで、 20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); 21: this.classLoader 22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 8: WebApplication app = WebApplication.createInstance("testbbs"); 9: app.addServlet("/ShowBBS", "ShowBBS"); 10: app.addServlet("/PostBBS", "PostBBS"); これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2235] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/16 13:04:20

ご回答いただきありがとうございます。 >C:\Henacat_0_1\webapps\ >の直下にShowBBS.classがあるような配置でしょうか。そうだとすると間違っています。 いいえ、webapps\testbbs\に配置しております。 (実際にはtestbbsでなく当方が独自につけたアプリケーション名) >C:\Henacat_0_1\webapps\testbbs\ >の下にShowBBS.class, PostBBS.class, Message.classを配置するのが正解です。 >testbbsフォルダが必要なのは、WebApplication.javaで以下のようにWEBAPPS_DIRにdirを >くっつけたパスからクラスを検索しているからで、 > >20: Path pathObj = fs.getPath(WEBAPPS_DIR + File.separator + dir); >21: this.classLoader >22: = URLClassLoader.newInstance(new URL[]{pathObj.toUri().toURL()}); > >このdirの出処は、List3-13 Main.javaの8行目のこの呼び出しです。 > > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); > >これで回答になっていますでしょうか? ご教授いただいた部分、理解することができました。 しかし、その上で確認をしても誤っている箇所が見つかっておりません。 何かその他に考えうることはありますでしょうか。 お手数おかけしますが、よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2236] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/16 23:52:36

>いいえ、webapps\testbbs\に配置しております。 >(実際にはtestbbsでなく当方が独自につけたアプリケーション名) 了解しました。「独自につけたアプリケーション名」はmakeTcpServerであると 先の投稿にもありましたね。失礼しました。 本と変えたのであれば、変えたところを教えてください。 具体的には、 ①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた  正確な場所 C:\Henacat_0_1\webapps\makeTcpServer\ これで合っていますか? ②そのフォルダに置いたクラスファイルのファイル名すべて ③List3-13 Main.javaの8~10行目に相当する箇所のソースコード 元は以下: > 8: WebApplication app = WebApplication.createInstance("testbbs"); > 9: app.addServlet("/ShowBBS", "ShowBBS"); >10: app.addServlet("/PostBBS", "PostBBS"); アプリケーション名やクラス名を変えたのなら、ここも変えないと動きません。 ただ、8行目のtestbbsをmakeTcpServerに変えていないのだとすれば、 そもそもサーブレットへのリクエストだと認識されずNot Foundが返るので、 8行目は変えてあるはずですね。 9行目と10行目は、リクエストのパスとクラス名の対応付けをしています。 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS 第2引数がクラス名です。パッケージを使っているならパッケージ名が要りますし、 その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に なっていなければいけません。 ④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2237] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/17 14:01:09

ご回答いただきありがとうございます。 >①「当方が独自につけたアプリケーション名」を含む、クラスファイルを置いた > 正確な場所 > >C:\Henacat_0_1\webapps\makeTcpServer\ > >これで合っていますか? ※を参照願います >②そのフォルダに置いたクラスファイルのファイル名すべて ShowBBS.class Message.class PostBBS.class の3つです。 >③List3-13 Main.javaの8~10行目に相当する箇所のソースコード WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); となります。 >パッケージを使っているならパッケージ名が要りますし、 >その場合はクラスファイルの置き場所もパッケージに沿ったフォルダ構成に >なっていなければいけません。 ※ここが原因かもしれません。 ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 そのため、フォルダ構成を以下のように変更しました。 C:\Henacat_0_1\webapps\makeTcpServer\chapter3 そのうえで、http://localhost:8001/makeTcpServer/chapter3/ShowBBSをたたいたところ、 C:\webserver\error_documentに格納した404.htmlが表示されました。 (リスト3-14:ServerThread.javaの87行目でNoSuchFileExceptionがcatchされました。) >④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 Main.java package com.kokun.henacat.webserver; import java.net.ServerSocket; import java.net.Socket; import com.kokun.henacat.servletimpl.WebApplication; public class Main { public static void main(String[] args) throws Exception{ WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "ShowBBS"); app.addServlet("/PostBBS", "PostBBS"); try(ServerSocket server = new ServerSocket(8001)){ for(;;) { Socket socket = server.accept(); ServerThread serverThread = new ServerThread(socket); Thread thread = new Thread(serverThread); thread.start(); } } } } 変更はMain.javaのみです。 よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2238] Re:eclipseでHenacatを作成したい
投稿者:(ぱ)こと管理人
2020/08/18 00:58:03

>※ここが原因かもしれません。 >ShowBBS.java、PostBBS.java、Message.javaの3つは、"chapter3"というパッケージの中にあります。 であれば、.classファイルは >C:\Henacat_0_1\webapps\makeTcpServer\chapter3 の下に置いたうえで、Main.javaは以下のようにします。 WebApplication app = WebApplication.createInstance("makeTcpServer"); app.addServlet("/ShowBBS", "chapter3.ShowBBS"); app.addServlet("/PostBBS", "chapter3.PostBBS"); そのうえで、 http://localhost:8001/makeTcpServer/ShowBBS を叩けば表示できると思います。 前回書いたとおり、addServletの 第1引数の"/ShowBBS"がパス、つまり以下のURLの最後の部分、 http://localhost:8001/makeTcpServer/ShowBBS を指すので、第1引数を変えなければ、叩くURLはこのままで構いません。 第2引数がクラス名です。パッケージを使っているならパッケージ名が要ります。 つまり完全限定クラス名「chapter3.ShowBBS」にする必要があります。 >>④長くなっても構いませんので、修正したクラスのソースを丸ごとここに貼ってください。 あ、すみません。ここは、修正した掲示板のソースコード(ShowBBS.javaとかPostBBS.javaとか) のつもりでした。これで動くと思いますが、まだ動かないようであれば貼ってください。 なお、当然ですが、ShowBBS.javaの中の out.println("<form action='/testbbs/PostBBS' method='post'>"); とか、PostBBS.javaの中の response.sendRedirect("/testbbs/ShowBBS"); とかは、それぞれmakeTcpServerに直す必要があります。念のため。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2239] Re:eclipseでHenacatを作成したい
投稿者:こー
2020/08/18 11:06:21

解決しました。 ご教授いただきありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]