マンガでよめる痔のこと・薬のこと

初歩的な質問ですみません。
下記の環境で、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)

このQ&Aに関連する最新のQ&A

A 回答 (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刷)」
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事、解決しました。
実は、この方法を他のHPで
見つけて試してことがありまして。
その時は、だめでした。
今回、再度試したところ
上手くできました。

もう少し、がんばってみます。

お礼日時:2005/07/20 14:17

質問者さんの使用されている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();
}
}
}

補足日時:2005/07/11 13:07
    • good
    • 0

><%@ 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;
}
}

補足日時:2005/07/07 10:57
    • good
    • 0

>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" %> という一行を
加えてみましたが、やはり同じエラーが出ます。

サーブレットも正常にコンパイルされているようです。
よろしくお願いします。

補足日時:2005/07/06 15:58
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング