- PR -

JSPからBeanが読み込めません

投稿者投稿内容
でん
会議室デビュー日: 2002/07/24
投稿数: 6
投稿日時: 2002-07-24 15:20
はじめまして 最近、JAVAを始めた初心者ですが早速、行き詰まってしまったので質問させてください。
現在、下記の環境でJAVAを勉強しています。
OS:Windows2000
Apache:1.3.26
TOMCAT:3.2.4

JAVABEAN(($TOMCAT_HOME/webapps/examples/WEB-INF/classes/Cart)をJSP(cart.jsp)を以下のように呼んでいます。
"<jsp:useBean id="cart" class="Cart" scope="page" />"

ブラウザからtest.jspを呼ぶと以下のエラーが出ます。
"org.apache.jasper.JasperException: Unable to compile class for JSPC:\jakarta-tomcat-3.2.4\work\localhost_8080%2Fjsp10\_0002fday_00030_00039_0002d_00033_0002fcart_0002ejspcart_jsp_0.java:63: クラス day_00030_00039_0002d_00033.Cart が見つかりません。
Cart cart = null;"

ただ、JAVABEANをパッケージ化($TOMCAT_HOME/webapps/examples/WEB-INF/classes/Beantest/Cart)して以下のように呼ぶとちゃんと表示されます。
"<jsp:useBean id="cart" class="Beantest.Cart" scope="page" />"

なぜパッケージ化したときはOKでパッケージ化しない時は表示されないのかが解りません。ご存知の方がいらっしゃいましたらご教授お願いいたします。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-07-24 17:59
>なぜパッケージ化したときはOKでパッケージ化しない時は表示されないのかが解りません。

JSPからCartにアクセスできないからです。

JSPはサーバ内部で実行時にServletに変換されます。
変換とはJSPからServletのソースコードを生成し、それをコンパイルして実行可能なクラスにするということです(変換は最初の一回だけ)。このときJSPが参照しているクラスが見つからないとエラーになります。このケースのエラーの原因は変換時にクラスCartにアクセスできないためにServletのソースのコンパイルに失敗したということです。

サーバはこのWebアプリケーションexamples内のJSPをコンパイルするときや、アプリケーションを実行するときにWEB-INF/classesの下からクラスを検索してくれます(jarの場合はWEB-INF/libです)。WEB-INF/web.xmlやWEB-INF/classesを含むWebアプリケーションの構成はServlet仕様書の"Web Applications"という章で規定されています。ですから、WEB-INFというディレクトリは飾りではなく特別な意味を持った特殊なディレクトリです。

JSPが参照するクラスがBeantest.Cartならば、当然WEB-INF/classes/Beantest/Cartのようにパッケージ階層を合わせなければなりません。階層があっていなければ、クラスの検索に失敗します。クラスパスとして指定されたディレクトリにおいて、パッケージ階層を合わせなければならないということは、Javaの基本です。
moken
会議室デビュー日: 2002/07/22
投稿数: 6
お住まい・勤務地: 東京都三鷹市
投稿日時: 2002-07-25 11:44
どうもmoken@srです。

全部のサーブレットやJSPから使用したいBeanだったら、
$TOMCAT_HOME/Common/の下のClassesにパッケージのフォルダ構造を守って
入れておいても、動きますよ。

私は、Commonに入れる方法しか知りませんでした。
mikiさん、ありがとうございました。
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-07-25 12:15
>$TOMCAT_HOME/Common/の下のClassesにパッケージのフォルダ構造を守って
>入れておいても、動きますよ。

Tomcatでは動くかもしれませんが、他のサーバではおなじ方法では動かないかもしれませんね。Servlet仕様書に従ったWebアプリケーションはポータブルです。

それから、Webアプリケーションはwar(Web Application Archive)形式という単一のjarファイルにまとめることができます。今回の例ではwebapps/examplesというディレクトリですから、examples.warというファイルになります。

このwarファイルはwebappsディレクトリの下においておくだけでWebアプリケーションをインストール(配備)することができます。webappsの下に、examples.warを置くと、サーバが実行時にディレクトリに展開してくれます。たった一個のファイルなのでサーバへの配備もとても楽です。

Tomcatでもwarファイルによる配備をサポートしていますから、できるだけwarを作るようにした方がポータブルなWebアプリケーションを作る練習になると思います。
でん
会議室デビュー日: 2002/07/24
投稿数: 6
投稿日時: 2002-07-25 15:23
ご教授有難うございます。
当方の知識不足でまだ理解できないというのが正直な感想です。

そこで確認させていただきたく以下のディレクトリ構成で新たにテストしました。
@C:\jakarta-tomcat-3.2.4\webapps\jsp\WEB-INF\classes
の配下にCart.javaを配置。
そして
AC:\jakarta-tomcat-3.2.4\webapps\jspと
BC:\jakarta-tomcat-3.2.4\webapps\jsp\den
の配下に全く同じcart.jsp(<jsp:useBean id="cart" class="Cart" scope="session" />を記述)を配置。

ブラウザから表示するとAはCart.javaを読み込んで正しく表示されるのですが
Bは最初の質問に記述したエラー(Cartが見つかりません)がでます。
Bのjspが見てるクラスが@ではないということなのでしょうか?
再度、ご教授いただけると助かります。

PS)クラスパスはC:\jakarta-tomcat-3.2.4\webapps\jsp\WEB-INF\classesに通しています
miki
大ベテラン
会議室デビュー日: 2001/09/21
投稿数: 174
お住まい・勤務地: 東京都八王子市
投稿日時: 2002-07-25 16:37
>ブラウザから表示するとAはCart.javaを読み込んで正しく表示されるのですが
>Bは最初の質問に記述したエラー(Cartが見つかりません)がでます。
>Bのjspが見てるクラスが@ではないということなのでしょうか?

わかりません。

誰がCartやJSPのプログラムを作ったか知りませんが、もし正しく動くものがあるならそれをベースにしてひとつひとつ確実に理解していったほうが良いとおもいます。

Webアプリケーションのディレクトリ構成にどういう意味があるのか、何が起こっているのか理解しないまま、むやみに構成を変更して正しく動くはずがないじゃないですか。

> PS)クラスパスはC:jakarta-tomcat-3.2.4\\webapps\\jsp\\WEB-INF\\classesに通しています

ここにクラスパスを通す必要はありません。
サーバがWEB-INF\\classes以下を見てくれます。
でん
会議室デビュー日: 2002/07/24
投稿数: 6
投稿日時: 2002-07-25 17:22
mikiさん有難うございます。

調べたところ
$TOMCAT_HOME/workのjavaファイルの先頭に、"package jsp;"が定義されていました。
どうやら勝手にパッケージを作成してjsp.Cartを見に行っているみたいです。
見当違いかもしれませんが、もう少し調べてみたいと思います。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-07-25 21:52
でんさんのされていることは本末転倒のような気がします。

まず、枝葉末節に拘らず基本を抑えましょう!

基本を理解していない状態で枝葉末節に拘るのは無意味です。

スキルアップ/キャリアアップ(JOB@IT)