竹形様
「Java+MySQL+Tomcatで始めるWebアプリケーション」のP379
コンパイルに関して質問があります。
私はOS: Debian(lenny)で、Tomcat5.5のインストールディレクトリは/usr/local/tomcat/ です。
アプリケーションの配置は
になります。
そして下記のように、コンパイルしました。
( カレントディレクトリは webaaps/jamyto/JSP/Login )
# javac -d ../../WEB-INF/classes User.java
WEB-INF/classes/jamyto/User.class が生成されまた。
( このこと自体が正しい動きなのかを知りません )
ブラウザにて、BeanLoginform.jsp からsubmit、BeanLoginProcess.jsp へ移ったとき、
エラーは起こりました。
エラー内容は、
ちなみに、サンプルソースファイルは、全てUTF-8に切換えて、
.jspファイル名を、'BeanLoginForm.utf8.jsp'としています。
( 自分が管理しやすいため。プログラムの実行には影響ないと思いました )
ですから、実際ブラウザでのurlのアクセスでは、'BeanLoginForm.utf8.jsp'としています。
エラーの解決のヒントを頂けないでしょうか。
「Java+MySQL+Tomcatで始めるWebアプリケーション」のP379
コンパイルに関して質問があります。
私はOS: Debian(lenny)で、Tomcat5.5のインストールディレクトリは/usr/local/tomcat/ です。
アプリケーションの配置は
webaaps/ | jamyto/ | WEB-INF/ | classes/ | |
JSP/ | Login/ | User.java |
になります。
そして下記のように、コンパイルしました。
( カレントディレクトリは webaaps/jamyto/JSP/Login )
# javac -d ../../WEB-INF/classes User.java
WEB-INF/classes/jamyto/User.class が生成されまた。
( このこと自体が正しい動きなのかを知りません )
ブラウザにて、BeanLoginform.jsp からsubmit、BeanLoginProcess.jsp へ移ったとき、
エラーは起こりました。
エラー内容は、
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:
JSPファイル: /JSP/Login/BeanLoginProcess.utf8.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
4: String strUser = request.getParameter("user");
5: String strPassword = request.getParameter("password");
6: String strUserFile = application.getRealPath("/WEB-INF/user.txt");
7: jamyto.User user = new jamyto.User();
8: boolean blResult = user.login(strUser,strPassword,strUserFile);
9: if(blResult){
10: session.setAttribute("user",user);
JSPファイル: /JSP/Login/BeanLoginProcess.utf8.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
4: String strUser = request.getParameter("user");
5: String strPassword = request.getParameter("password");
6: String strUserFile = application.getRealPath("/WEB-INF/user.txt");
7: jamyto.User user = new jamyto.User();
8: boolean blResult = user.login(strUser,strPassword,strUserFile);
9: if(blResult){
10: session.setAttribute("user",user);
エラー内容の意味を教えてください。メッセージ
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:
JSPファイル: /JSP/Login/BeanLoginProcess.utf8.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
4: String strUser = request.getParameter("user");
5: String strPassword = request.getParameter("password");
6: String strUserFile = application.getRealPath("/WEB-INF/user.txt");
7: jamyto.User user = new jamyto.User();
8: boolean blResult = user.login(strUser,strPassword,strUserFile);
9: if(blResult){
10: session.setAttribute("user",user);
JSPファイル: /JSP/Login/BeanLoginProcess.utf8.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
4: String strUser = request.getParameter("user");
5: String strPassword = request.getParameter("password");
6: String strUserFile = application.getRealPath("/WEB-INF/user.txt");
7: jamyto.User user = new jamyto.User();
8: boolean blResult = user.login(strUser,strPassword,strUserFile);
9: if(blResult){
10: session.setAttribute("user",user);
ちなみに、サンプルソースファイルは、全てUTF-8に切換えて、
.jspファイル名を、'BeanLoginForm.utf8.jsp'としています。
( 自分が管理しやすいため。プログラムの実行には影響ないと思いました )
ですから、実際ブラウザでのurlのアクセスでは、'BeanLoginForm.utf8.jsp'としています。
エラーの解決のヒントを頂けないでしょうか。
投稿:パブリック[yasuhara]/2010年 07月 06日 00時 54分
/更新:2010年 07月 07日 23時 14分
RE:WEB-INF/classes のクラス
by 竹形 誠司[takegata]
竹形です。こんばんは。
これは、おそらく webappsの下にjamytoディレクトリを置いているためではないかと思います。P341を参考に、webappsの外にjamytoディレクトリを作ってみてください。それでもエラーが出るようであれば、また聞いてください。
これは、おそらく webappsの下にjamytoディレクトリを置いているためではないかと思います。P341を参考に、webappsの外にjamytoディレクトリを作ってみてください。それでもエラーが出るようであれば、また聞いてください。
投稿:竹形 誠司[takegata]/2010年 07月 06日 02時 24分
/更新:2010年 07月 06日 02時 24分
竹形様
ご回答ありがとうございます。
ご指摘の件について、お聞きしたいのですが。
webapps/の下にjamytoディレクトリを作って、本書を先に進める前に、
/usr/local/tomcat/の下にjamytoTestディレクトリを作り、
そのjamytoTest/JSP/の下に、テスト用サンプルindex.html を置き、
/usr/local/tomcat/conf/Catalina/localhost/の下に、jamytoTest.xml を置いて、
Tomcat5.5を再起動して、試してみたのです。
[jamytoTest.xml]
ブラウザから、http://localhost:8080/jamytoTest/
で、アクセスしましたが、
404エラーでした。
# bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/lib/jvm/java-6-sun
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar
CLASSPATH などは関係ありますか?
ご教示の程、お願いします。
ご回答ありがとうございます。
ご指摘の件について、お聞きしたいのですが。
webapps/の下にjamytoディレクトリを作って、本書を先に進める前に、
/usr/local/tomcat/の下にjamytoTestディレクトリを作り、
そのjamytoTest/JSP/の下に、テスト用サンプルindex.html を置き、
/usr/local/tomcat/conf/Catalina/localhost/の下に、jamytoTest.xml を置いて、
Tomcat5.5を再起動して、試してみたのです。
[jamytoTest.xml]
<?xml version='1.0' encording='utf-8'?>
<Context docBase="../jamytoTest/JSP/" path="/jamytoTest"/>
<Context docBase="../jamytoTest/JSP/" path="/jamytoTest"/>
ブラウザから、http://localhost:8080/jamytoTest/
で、アクセスしましたが、
404エラーでした。
type ステータスレポート
メッセージ /jamytoTest/
説明 The requested resource (/jamytoTest/) is not available.
ちなみに、Tomcat5.5を起動するときに下記のメッセージが出ます。メッセージ /jamytoTest/
説明 The requested resource (/jamytoTest/) is not available.
# bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/lib/jvm/java-6-sun
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar
CLASSPATH などは関係ありますか?
ご教示の程、お願いします。
投稿:パブリック[yasuhara]/2010年 07月 07日 23時 28分
/更新:2010年 07月 07日 23時 38分
この場合、CLASSPATHはあまり関係なさそうですね。TomcatがjamtyoTest.xmlを正しく処理していないので、WEB-INF以下の情報が正しく読み込まれていない感じです。
アプリケーションをwebappsの下に置くと、xmlファイルが正しく処理されていなくてもJSPのページが見えてしまうので、エラーの原因が分かりにくいんですよね。
相対パスを指定する場合、どのディレクトリがカレントとなるかはプロセス(この場合はTomcat)の状態によります。必ずしも相対パス指定を書いたファイル(この場合はjamytoTest.xml)が相対パスの基準になるとは限りません。
アプリケーションをwebappsの下に置くと、xmlファイルが正しく処理されていなくてもJSPのページが見えてしまうので、エラーの原因が分かりにくいんですよね。
<?xml version='1.0' encording='utf-8'?>
<Context docBase="../jamytoTest/JSP/" path="/jamytoTest"/>
を<Context docBase="../jamytoTest/JSP/" path="/jamytoTest"/>
<?xml version='1.0' encording='utf-8'?>
<Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
にしてみてはどうでしょう。<Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
相対パスを指定する場合、どのディレクトリがカレントとなるかはプロセス(この場合はTomcat)の状態によります。必ずしも相対パス指定を書いたファイル(この場合はjamytoTest.xml)が相対パスの基準になるとは限りません。
投稿:竹形 誠司[takegata]/2010年 07月 08日 05時 31分
/更新:2010年 07月 08日 06時 46分
竹形様
http://localhost:8080/jamytoTest/
エラー内容は同じでした。
>TomcatがjamtyoTest.xmlを正しく処理していないので、
>WEB-INF以下の情報が正しく読み込まれていない感じです。
/usr/local/tomcat/jamytoTest/WEB-INF/の下には、classesのみしか置いていませんでした。
よって、jamytoTest/WEB-INF/の下に、web.xmlを置いて試してみましたが、
[web.xml]
また、気になった情報がありましたので、質問させてください。
:/usr/local/tomcat# ls -l | grep jamytoTest
drwxr-sr-x 4 root staff 4096 2010-07-07 08:42 jamytoTest
この所有グループが、staff になっていること、
このグループの実行権が x でなく s になっていると言うことは、
jamytoTest以下のファイルが グループの権限で動作することになる。
です。
参考URL http://www.mukuan.org/basic/permission.html
私は、普通に mkdir jamytoTest をしただけでしたが、
面倒なことになるのですね。
これを解決するには、
jamytoTest以下のディレクトリを手で、# chown root.root にすれば良いことになるのですか?
<?xml version='1.0' encording='utf-8'?>
<Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
で、再起動、試みましたが、<Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
http://localhost:8080/jamytoTest/
エラー内容は同じでした。
>TomcatがjamtyoTest.xmlを正しく処理していないので、
>WEB-INF以下の情報が正しく読み込まれていない感じです。
/usr/local/tomcat/jamytoTest/WEB-INF/の下には、classesのみしか置いていませんでした。
よって、jamytoTest/WEB-INF/の下に、web.xmlを置いて試してみましたが、
[web.xml]
<?xml version="1.0" encoding="Windows-31J"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<error-page>
<error-code>404</error-code>
<location>/JSP/Error/404.html</location>
</error-page>
<!--
<error-page>
<error-code>500</error-code>
<location>/JSP/Error/500.html</location>
</error-page>
-->
</web-app>
結果は、変わらず 404エラー表示<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<error-page>
<error-code>404</error-code>
<location>/JSP/Error/404.html</location>
</error-page>
<!--
<error-page>
<error-code>500</error-code>
<location>/JSP/Error/500.html</location>
</error-page>
-->
</web-app>
type ステータスレポート
メッセージ /jamytoTest/
説明 The requested resource (/jamytoTest/) is not available.
でした。メッセージ /jamytoTest/
説明 The requested resource (/jamytoTest/) is not available.
また、気になった情報がありましたので、質問させてください。
:/usr/local/tomcat# ls -l | grep jamytoTest
drwxr-sr-x 4 root staff 4096 2010-07-07 08:42 jamytoTest
この所有グループが、staff になっていること、
このグループの実行権が x でなく s になっていると言うことは、
jamytoTest以下のファイルが グループの権限で動作することになる。
です。
参考URL http://www.mukuan.org/basic/permission.html
私は、普通に mkdir jamytoTest をしただけでしたが、
面倒なことになるのですね。
これを解決するには、
jamytoTest以下のディレクトリを手で、# chown root.root にすれば良いことになるのですか?
投稿:パブリック[yasuhara]/2010年 07月 08日 23時 33分
/更新:2010年 07月 09日 01時 23分
><?xml version='1.0' encording='utf-8'?>
><Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
>で、再起動、試みましたが、
>http://localhost:8080/jamytoTest/
>エラー内容は同じでした。
あぁ、そうですか。
logディレクトリに何か手がかりになりそうなメッセージが出ていないか見てみてください。ファイルがたくさんあって、どれをみていいか分からない場合は、ログファイルを一度全部消して再起動するといいと思います。
web.xmlファイルは無くても大丈夫です。特に、404エラーのエラーページを設定すると、エラーページが見つからない場合も404エラーになってしまうので、問題が解決してから設定した方がいいように思います。
ファイルの実行権については、あまり気にしたことがなかったのですが、classファイルやJSPファイルに実行権を付与する必要はないと思います。少なくとも、このサイトをホストしているMacOSや、別件で使っているSolarisではそうです。アプリケーションフォルダを自分のユーザディレクトリ内に作り、所有者はtakegata、パーミッションは644のままです。
><Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
>で、再起動、試みましたが、
>http://localhost:8080/jamytoTest/
>エラー内容は同じでした。
あぁ、そうですか。
logディレクトリに何か手がかりになりそうなメッセージが出ていないか見てみてください。ファイルがたくさんあって、どれをみていいか分からない場合は、ログファイルを一度全部消して再起動するといいと思います。
web.xmlファイルは無くても大丈夫です。特に、404エラーのエラーページを設定すると、エラーページが見つからない場合も404エラーになってしまうので、問題が解決してから設定した方がいいように思います。
ファイルの実行権については、あまり気にしたことがなかったのですが、classファイルやJSPファイルに実行権を付与する必要はないと思います。少なくとも、このサイトをホストしているMacOSや、別件で使っているSolarisではそうです。アプリケーションフォルダを自分のユーザディレクトリ内に作り、所有者はtakegata、パーミッションは644のままです。
投稿:竹形 誠司[takegata]/2010年 07月 09日 05時 10分
/更新:2010年 07月 09日 08時 33分
竹形様
conf/Catalina/localhost/jamytoTest.xmlの件は解決しました。
los/catalina.2010-07-10 を見て、
jamytoTest.xmlでのスペルミスと言うことが分かりました。
アドバイスありがとうございました。
さて、質問の本題ですが、jamytoディレクトリを/home/yasuhara/test/jamyto として作成し、
jamyto.xmlを conf/Catalina/localhost/ に、
index.htmlを/home/yasuhara/test/jamyto/に置いて、
ブラウザから http://localhost:8080/jamyto/ で index.htmlにアクセスできることを確認しました。
そこで、本書P379の User.java を
/home/yasuhara/test/jamyto/JSP/Login/に置き、
ブラウザ localhost:8080/jamyto/Login/BeanLoginForm.jsp ページから
user ,passwordを入力後、submitすると、
当質問の初回に書きましたものと同じエラーが表示されました。
conf/Catalina/localhost/jamytoTest.xmlの件は解決しました。
los/catalina.2010-07-10 を見て、
jamytoTest.xmlでのスペルミスと言うことが分かりました。
encording | ⇒ | encoding |
アドバイスありがとうございました。
さて、質問の本題ですが、jamytoディレクトリを/home/yasuhara/test/jamyto として作成し、
jamyto.xmlを conf/Catalina/localhost/ に、
index.htmlを/home/yasuhara/test/jamyto/に置いて、
ブラウザから http://localhost:8080/jamyto/ で index.htmlにアクセスできることを確認しました。
そこで、本書P379の User.java を
/home/yasuhara/test/jamyto/JSP/Login/に置き、
javac -d ../../WEB-INF/classes User.java
で、/home/yasuhara/test/jamyto/WEB-INF/classes/jamyto/User.class が生成されました。home | yasuhara | test | jamyto | JSP | Login index.html | BeanLoginProcess.jsp ,BeanLoginForm.jsp ,User.java | |
WEB-INF | user.txt classes | jamyto | User.class |
ブラウザ localhost:8080/jamyto/Login/BeanLoginForm.jsp ページから
user ,passwordを入力後、submitすると、
当質問の初回に書きましたものと同じエラーが表示されました。
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:
JSPファイル: /JSP/Login/BeanLoginProcess.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
.....
他の原因は何かありますでしょうか?例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:
JSPファイル: /JSP/Login/BeanLoginProcess.jsp の中の7行目でエラーが発生しました
jamyto.User cannot be resolved to a type
.....
投稿:パブリック[yasuhara]/2010年 07月 10日 12時 51分
/更新:2010年 07月 10日 13時 08分
でログインフォームが表示できるのであれば、アプリケーションのディレクトリは
このあたりを確認してみてください。
/home/yasuhara/test/jamyto/JSP
になっているはずです。WEB-INFディレクトリは/home/yasuhara/test/jamyto/JSP/WEB-INF
の位置になければなりません。このあたりを確認してみてください。
投稿:竹形 誠司[takegata]/2010年 07月 10日 15時 18分
/更新:2010年 07月 10日 15時 19分
竹形様
アドバイスどおり、JSP/WEB-INF/の下にクラスファイルを生成させ、
BeanLoginForm.jsp から、BeanLoginProcess.jspへプログラムが実行できました。
何度もご対応頂きまして本当にありがとうございました。
また質問させて頂くことがあると思いますが、
そのときはよろしくお願いいたします。
アドバイスどおり、JSP/WEB-INF/の下にクラスファイルを生成させ、
$ javac -d WEB-INF/classes User.java
( -d ../WEB-INF/classes ではないのですね)BeanLoginForm.jsp から、BeanLoginProcess.jspへプログラムが実行できました。
何度もご対応頂きまして本当にありがとうございました。
また質問させて頂くことがあると思いますが、
そのときはよろしくお願いいたします。
投稿:パブリック[yasuhara]/2010年 07月 11日 00時 51分
/更新:2010年 07月 11日 01時 00分
問題が解決されてなによりです。
ちなみに、javac の -d オプションはclassファイルをどこに書き出すかを指定しているだけなので、このオプションを使わずにコンパイルしてclassファイルを所定の位置に移動するという手順でも構いません。私は普段は WEB-INF/classes ディレクトリに.javaファイルを置いて、 -d オプションに"."(ドット)を指定してコンパイルしています(拙著では内容の少しずつ異なる複数の.javaファイルを使って説明しているので、少し違うディレクトリ構成にしていますが)。
拙著の説明も少し足りなかったかも知れません。今後の著書に反映したいと思います。
ちなみに、javac の -d オプションはclassファイルをどこに書き出すかを指定しているだけなので、このオプションを使わずにコンパイルしてclassファイルを所定の位置に移動するという手順でも構いません。私は普段は WEB-INF/classes ディレクトリに.javaファイルを置いて、 -d オプションに"."(ドット)を指定してコンパイルしています(拙著では内容の少しずつ異なる複数の.javaファイルを使って説明しているので、少し違うディレクトリ構成にしていますが)。
拙著の説明も少し足りなかったかも知れません。今後の著書に反映したいと思います。
投稿:竹形 誠司[takegata]/2010年 07月 11日 05時 09分
/更新:2010年 07月 11日 05時 10分