質問: javabeanが正しく表示されません。 初歩的な質問ですみません。 下記の環境で、javaを勉強しています。 教材 :やさしいjava 活用編 lesson7 sample6 実行環境:j2sdk1.4.2_06 (教材では、j2sdk-1_4_0) tomcat 5.5(教材では、tomcat-3.2.3) ie6.0 サーブレットからjavabeanにデータを渡し、その後 jsp に表示するという流れです。 htmlページにデータ入力後、[送信]ボタンを押すとjspページには何も表示されません。 ログファイルには下記のようなエラーが 記述されています。 勘違いか、何らかの初歩的なミスだと思いますが、解決方法が 見つかりません。解決方法をご存知の方教えて下さい。よろしくお願いします。 org.apache.jasper.jasperexception: jspのクラスをコンパイルできません jspファイル: /07/sample6.jsp の中の2行目でエラーが発生しました 生成されたサーブレットのエラーです: carbean cannot be resolved or is not a type jspファイル: /07/sample6.jsp の中の11行目でエラーが発生しました 生成されたサーブレットのエラーです: carbean cannot be resolved or is not a type at org.apache.jasper.compiler.defaulterror handler.javacerror(defaulterrorhandler.java:84) at org.apache.jasper.compiler.errordispatcher .javacerror(errordispatcher.java:328) ・・・・<中略> thread.runit(leaderfollowerworkerthread.java:80) at org.apache.tomcat.util.threads.threadpool$ controlrunnable.run(threadpool.java:684) at java.lang.thread.run(unknown source)
回答: #3です。サーブレットからでしたね、どうもすみません。 一応、原因も分かり、ちゃんとサーブレットで生成したbeanをjsp側で受け取り、表示することにも成功したのですが、その前に#3で記述したソースの補足をしておきます。 まず初めにsample6.jspに関してですが、追加したコードであるアクションは、今回ではサーブレット側にてbeanを生成するため、不必要と思われるので削除しておいてください。 それと、上の方に記述していたpageディレクティブ内のimport文に関しても、これがなくても正常に動作したので、いらないと思われます。 それから、carbean.javaの方については、getcarnameメソッドとsetcardataメソッドの二つとも、必ずしも必要というわけではないようです。(これも、先程と同じように、なくてもちゃんと動きました。)これらのプロパティの値を取得したり、もしくは設定する必要がないのであれば、削除しておいても問題はないと思います。setterメソッドやgetterメソッドに関しては、あくまでも必要なもののみ、といった感じですね。 そうすると、ソースプログラムに関しては、またふりだしに戻りますが、バグはこれらとは全然違う所にありました。それは、javabeansのクラス内にて、package文の宣言をしていなかったことによります。このことに関して、インターネット上のサイトをいろいろと調べてはみたのですが、残念ながら一番マッチするものが見付かりませんでした。なので、今、僕が愛用しているservlet本「ゼロからはじめるjsp/サーブレット (株式会社四次元データ 畠中晃弘/延原章平 著、アスキームック、2003年12月4日 初版発行)」の第3章-6(101ページの下の方)に書かれてある記述を、ここにそのまま転記しておきます。 「無名パッケージのクラスは、jspからアクセスすることができません。これは、jspページから変換されてできるサーブレットプログラムにパッケージが指定されるためです。...(中略)...jspページから利用するクラスは、必ずパッケージ名を指定するようにしてください。」 要するに、これがjasperexceptionの正体だったということですね。 デバッグの手順としては以下のようになると思います。 ・web-infの中のclassesディレクトリ内に、適当な名前(例えば、hoge)のディレクトリを新規に一つ作成する。 ・carbean.java内にて、import文の更に上の方に、「package hoge;」を追加。 ・sample76.java内にて、上の方に「import hoge.*;」を追加。 ・コンパイル後、carbean.classを、先程作成したhogeディレクトリ内に移動する。 ・sample6.jsp内にて、アクション内のclass属性を「hoge.carbean」に変更する。 一応、この[教えて!goo]内でも、似たような質問がありましたので、以下に載せておきます。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=619924 それと、質問者さんの方では、サーブレットはきちんとコンパイルされていたとのことですが、年のため、classpathの設定に関する質問についても、以下に載せておきます。 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=592118 http://oshiete1.goo.ne.jp/kotaeru.php3?qid=382238 それから、beanの利用についてですが、基本的には、今回のようにclassファイルでの使用よりも、jarファイルにパッケージされたものとして使われることもあるらしいです。具体的には、以下の書籍のtips229の所に、jarコマンドの使用方法などと共に、詳しく載っていますので、そちらの方も参考にされたらと思います。 「サーブレット&jsp 逆引き大全 500の極意 (著者 川崎 克己、株式会社秀和システム、2003年10月21日 第1版第1刷)」