竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
WEB-INF/classes のクラス
by パブリック[yasuhara]
竹形様

「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);

エラー内容の意味を教えてください。

ちなみに、サンプルソースファイルは、全て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ディレクトリを作ってみてください。それでもエラーが出るようであれば、また聞いてください。
投稿:竹形 誠司[takegata]/2010年 07月 06日 02時 24分 /更新:2010年 07月 06日 02時 24分
RE:WEB-INF/classes のクラス
by パブリック[yasuhara]
竹形様

ご回答ありがとうございます。

ご指摘の件について、お聞きしたいのですが。
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"/>

ブラウザから、http://localhost:8080/jamytoTest/
で、アクセスしましたが、
404エラーでした。
type ステータスレポート

メッセージ /jamytoTest/

説明 The requested resource (/jamytoTest/) is not available.
ちなみに、Tomcat5.5を起動するときに下記のメッセージが出ます。
# 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分
RE:WEB-INF/classes のクラス
by 竹形 誠司[takegata]
この場合、CLASSPATHはあまり関係なさそうですね。TomcatがjamtyoTest.xmlを正しく処理していないので、WEB-INF以下の情報が正しく読み込まれていない感じです。

アプリケーションをwebappsの下に置くと、xmlファイルが正しく処理されていなくてもJSPのページが見えてしまうので、エラーの原因が分かりにくいんですよね。

<?xml version='1.0' encording='utf-8'?>
<Context docBase="../jamytoTest/JSP/" path="/jamytoTest"/>

<?xml version='1.0' encording='utf-8'?>
<Context docBase="/usr/local/tomcat/jamytoTest/JSP/" path="/jamytoTest"/>
にしてみてはどうでしょう。

相対パスを指定する場合、どのディレクトリがカレントとなるかはプロセス(この場合はTomcat)の状態によります。必ずしも相対パス指定を書いたファイル(この場合はjamytoTest.xml)が相対パスの基準になるとは限りません。
投稿:竹形 誠司[takegata]/2010年 07月 08日 05時 31分 /更新:2010年 07月 08日 06時 46分
RE:WEB-INF/classes のクラス
by パブリック[yasuhara]
竹形様

<?xml version='1.0' encording='utf-8'?>
<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エラー表示
type ステータスレポート

メッセージ /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分
RE:WEB-INF/classes のクラス
by 竹形 誠司[takegata]
><?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のままです。
投稿:竹形 誠司[takegata]/2010年 07月 09日 05時 10分 /更新:2010年 07月 09日 08時 33分
RE:WEB-INF/classes のクラス
by パブリック[yasuhara]
竹形様

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
.....
他の原因は何かありますでしょうか?
投稿:パブリック[yasuhara]/2010年 07月 10日 12時 51分 /更新:2010年 07月 10日 13時 08分
RE:WEB-INF/classes のクラス
by 竹形 誠司[takegata]
でログインフォームが表示できるのであれば、アプリケーションのディレクトリは
/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分
RE:WEB-INF/classes のクラス
by パブリック[yasuhara]
竹形様

アドバイスどおり、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分
RE:WEB-INF/classes のクラス
by 竹形 誠司[takegata]
問題が解決されてなによりです。

ちなみに、javac の -d オプションはclassファイルをどこに書き出すかを指定しているだけなので、このオプションを使わずにコンパイルしてclassファイルを所定の位置に移動するという手順でも構いません。私は普段は WEB-INF/classes ディレクトリに.javaファイルを置いて、 -d オプションに"."(ドット)を指定してコンパイルしています(拙著では内容の少しずつ異なる複数の.javaファイルを使って説明しているので、少し違うディレクトリ構成にしていますが)。

拙著の説明も少し足りなかったかも知れません。今後の著書に反映したいと思います。
投稿:竹形 誠司[takegata]/2010年 07月 11日 05時 09分 /更新:2010年 07月 11日 05時 10分