- ベストアンサー
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)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です。サーブレットからでしたね、どうもすみません。 一応、原因も分かり、ちゃんとサーブレットで生成したBeanをJSP側で受け取り、表示することにも成功したのですが、その前に#3で記述したソースの補足をしておきます。 まず初めにSample6.jspに関してですが、追加したコードである<jsp:setProperty>アクションは、今回ではサーブレット側にて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内にて、<jsp:useBean>アクション内の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刷)」
その他の回答 (3)
- choconamacream
- ベストアンサー率44% (152/338)
質問者さんの使用されているOSは、Windowsですか?ちなみに、私の方は、Linuxなんですが、そのようなエラーは表示されずに、正常にjspページが表示されましたが…。ただ、真ん中の方に「のお買い上げありがとうございました。」と表示されるだけで、実際には私の方でもプロパティの値が正しく表示されません。 それで、ソースプログラムを2つともちょこちょこっと修正したら、ちゃんとプロパティの値も表示されるようになりました。ポイントは、以下の2点です。 ・各プロパティのアクセッサメソッドは、getXxxとsetXxxの両方とも、Java Beanのクラス内に、きちんと定義しておくこと。 ・jsp側では、setPropertyアクションの方も忘れずに記述すること。 ちなみに、jsp側に追加したアクションの説明は、以下のようになると思います。 「CarBeanクラスのインスタンスcbにおいて、CarBeanクラス内のプロパティcardataに、リクエストから送信されたパラメータ名cardataの値を設定する」 以下に、修正済みのコードを載せておきます。 <!-- <Sample6.jsp> --> <%@ page contentType="text/html; charset=Shift_JIS" %> <%@ page import="CarBean" %> <!-- → --> <jsp:useBean id="cb" class="CarBean" scope="request" /> <%-- 追加したコード↓↓↓ --%> <jsp:setProperty name="cb" property="cardata" param="cardata" /> <html> <head> <title>サンプル</title> </head> <body> <center> <h2>御礼</h2> <!-- → --> <jsp:getProperty name="cb" property="cardata" /> のお買い上げありがとうございました。<br /> </center> </body> </html> // <CarBean.java> import java.io.*; public class CarBean implements Serializable { private String carname; private String cardata; public CarBean() { carname = null; cardata = null; } public void setCarname(String cn) { carname = cn; } /* 追加したメソッドその1 */ public String getCarname() { return carname; } /* 追加したメソッドその2 */ public void setCardata(String cd) { cardata = cd; } public String getCardata() { return cardata; } public void makeCardata() { cardata = "車種:" + carname; } }
補足
回答、ありがとうございました。 早速、修正してみたのですが やはり同じエラーが出て、 何も表示されません。 OSは、WindowsXPです。 サーブレットを書きます。 よろしくお願いします。 import javax.servlet.*; import javax.servlet.http.*; public class Sample76 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { try{ //フォームデータの取得 String tmp = request.getParameter("cars"); String carname = new String(tmp.getBytes("8859_1"), "JISAutoDetect"); //Beanの作成 CarBean cb = new CarBean(); cb.setCarname(carname); cb.makeCardata(); //リクエストに設定 request.setAttribute("cb", cb); //サーブレットコンテキストの取得 ServletContext sc = getServletContext(); //リクエストの転送 if(carname.length() != 0){ sc.getRequestDispatcher("/07/Sample6.jsp") .forward(request, response); } else{ sc.getRequestDispatcher("/07/error.html") .forward(request, response); } } catch(Exception e){ e.printStackTrace(); } } }
- pcbeginner
- ベストアンサー率46% (261/560)
><%@ page import="CarBean" %> という一行を >加えてみましたが、やはり同じエラーが出ます。 JSPの2行目と11行目はどうなっていますか? それかサーブレットからセットしたBeanが取れていないとか… 少なくとも現時点ではこのくらいしか…。 可能ならjspとサーブレットのソースを載せましょう。 載せられない部分があれば適当に伏字にするなどして。
補足
回答ありがとうございます。 矢印の部分が、エラー行です。よろしくお願いします。 <Sample6.jsp> <%@ page contentType="text/html; charset=Shift_JIS" %> <%@ page import="CarBean" %> → <jsp:useBean id="cb" class="CarBean" scope="request" /> <html> <head> <title>サンプル</title> </head> <body> <center> <h2>御礼</h2> → <jsp:getProperty name="cb" property="cardata" /> のお買い上げありがとうございました。<br /> </center> </body> </html> <CarBean.java> import java.io.*; public class CarBean implements Serializable { private String carname; private String cardata; public CarBean() { carname = null; cardata = null; } public void setCarname(String cn) { carname = cn; } public String getCardata() { return cardata; } public void makeCardata() { cardata = "車種:" + carname; } }
- pcbeginner
- ベストアンサー率46% (261/560)
>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 ↑に原因が書いてありますよ。 「CarBean cannot be resolved or is not a type」 に関してはCarBeanをインポートしてないか何かでしょう。
補足
Sample6.jsp に <%@ page import="CarBean" %> という一行を 加えてみましたが、やはり同じエラーが出ます。 サーブレットも正常にコンパイルされているようです。 よろしくお願いします。
お礼
ありがとうございました。 無事、解決しました。 実は、この方法を他のHPで 見つけて試してことがありまして。 その時は、だめでした。 今回、再度試したところ 上手くできました。 もう少し、がんばってみます。