- PR -

Beansを利用するJSPと連携させるサーブレットのエラー

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 80
投稿日時: 2006-01-21 22:53
データベースに存在する名前を入力するとその人の詳細を表示するというものをつくろうとしています。
HTMLとJSP、サーブレット、Beansを利用しようとしています。

HTML画面に名前を入力して「検索」を押すと、以下のようなエラーが出ます。
解決策をご存知のかたがいらっしゃったら、ご教授お願いします。

環境は、
WinXP
Tomcat 5.0
java j2sdk1.4.2_05
mysql
です。


-------------エラー---------------------------------------
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 2 in the jsp file: /jsp/name_test.jsp
Generated servlet error:
C:/Program Files/Apache Software Foundation/Tomcat5.0/work/Catalina/localhost/n_search/org/apache/jsp/jsp/name_005ftest_jsp.java:44: cannot resolve

symbol
symbol : class n_bean_db2
location: class org.apache.jsp.jsp.name_005ftest_jsp
n_bean_db2 n_search = null;
^


An error occurred at line: 2 in the jsp file: /jsp/name_test.jsp
Generated servlet error:
C:/Program Files/Apache Software Foundation/Tomcat 5.0/work/Catalina/localhost/n_search/org/apache/jsp/jsp/name_005ftest_jsp.java:46: cannot resolve

symbol
symbol : class n_bean_db2
location: class org.apache.jsp.jsp.name_005ftest_jsp
n_search = (n_bean_db2) _jspx_page_context.getAttribute("n_search",

PageContext.REQUEST_SCOPE);
^


An error occurred at line: 2 in the jsp file: /jsp/name_test.jsp
Generated servlet error:
C:/Program Files/Apache Software Foundation/Tomcat 5.0/work/Catalina/localhost/n_search/org/apache/jsp/jsp/name_005ftest_jsp.java:48: cannot resolve

symbol
symbol : class n_bean_db2
location: class org.apache.jsp.jsp.name_005ftest_jsp
n_search = new n_bean_db2();
^
3 errors
----------------------------------------------------------------------------


--------name_test.jspの内容-----------------------------------------
<%@ page contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="n_search" class="n_bean_db2" scope="request" />
<html>
<head>
<title>名前の検索</title>
</head>
<body>
<h1 style="background:#cccccc">データの表示</h1>
<table border="0">
<tr bgcolor="#CCCCCC">
<td>登録番号</td>
<td>名前</td>
<td>好きな絵</td>
<td>好きな動物</td>
</tr>
<% for(int i=0;i<n_search.getResultCount();i++){ %>
<tr style="background:#ffffcc">
<td><%=n_search.getNo(i)%></td>
<td><%=n_search.getName(i)%></td>
<td><%=n_search.getIllust(i)%></td>
<td><%=n_search.getP(i)%></td>
</tr>
<% } %>
</body>
</html>

-----------------------------------------------------------------
ミソジマエ
常連さん
会議室デビュー日: 2005/09/25
投稿数: 43
投稿日時: 2006-01-22 01:32
引用:

<jsp:useBean id="n_search" class="n_bean_db2" scope="request" />


のところでエラーだと言ってますね。
n_bean_db2が何なのかわからないと言われてるっぽいですね。

n_bean_db2にpackage指定はされているのでしょうか?
package指定をされているのであれば正しく記述してください。
あとはn_bean_db2の配置はweb-inf配下に正しく置かれていますか?

ざっと思いつくのはこの辺でしょうか。

あと参考サイトです。
Servlet、JSP、JavaBeansの連携
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 80
投稿日時: 2006-01-22 12:33
返信ありがとうございます。

package指定はしていません。
以前、jspとBeansで作成したときは、package指定をしていたのですが、サーブレットを作成して、コンパイルした際に、Beans部分にエラーが出て、コンパイルができなかったため、package指定をしないで試みています。
n_bean_db2の配置はWEB-INF/classesにおいてあります。
サーブレットもそこにおいてあります。

package指定のことですが、参考にしている本を見るとBeansとサーブレットは同じ名前のフォルダ(packageで指定しているフォルダ)にあるように見えるのですが、Beansとサーブレットを同じフォルダに入れると、サーブレットをコンパイルする前に、package部分にエラーが出て、Beansを設定しているところにも、エラーがでてしまいます。
サーブレットを使用する前に、server.xmlに登録したフォルダの配下に、jsp、Beans、サーブレットを置いているのですが、package指定をする場合も、そのフォルダをserver.xmlに登録しないといけないのでしょうか?
package指定のフォルダはserver.xmlに登録した中に入っています。

ご教授お願いします。
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 80
投稿日時: 2006-01-22 12:56
ちゃんと動いているかどうかの確認でいろいろなところに、表示する部分が入っています。
その中で表示されるのは、Hello World ServletとHTML画面に何もいれないで「検索」を押した場合の、未入力の項目があります.ブラウザのバックボタンで戻り,入力内容を確認してください.という文字だけです。
if文に問題があるのでは?と思って、いろいろなところに表示指示をおいてみたのですが、表示されません。
if文に問題があるのでしょうか?
サーブレットは以下の内容です。

--------------サーブレット(name1_test.java)------------------------------

------------
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class name1_test extends HttpServlet {

public void init(ServletConfig config) throws ServletException {
super.init(config); //サーブレットの初期化
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request, response); //Postで渡されたがdoGetで処理をさせる

}

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ContentTypeを設定
response.setContentType("text/html;charset=Shift_JIS");

// 出力用PrintWriterを取得
PrintWriter pw = response.getWriter();
// 出力
pw.println("<html>");
pw.println("<head>");
pw.println("<title>Hello World Servlet</title>");
pw.println("</head>");
pw.println("<body>");
pw.println("Hello World");
pw.println("</body>");
pw.println("</html>");

request.setCharacterEncoding("Shift_JIS");

/*入力処理*/
String no = request.getParameter("no"); //登録番号
String name = request.getParameter("name"); //作者
/* フォームから取得した、検索する登録番号(no)、名前(name)を変数に格納します

。*/


n_bean_db2 n_search = new n_bean_db2();

if (no.equals("") && name.equals("")) {
pw.println("未入力の項目があります.ブラウザのバックボタンで戻り,入力内容を確認

してください.");
}
else {
pw.println("1:表示されるかな?");
if (! (no.equals(""))) {
n_search.executeT(no);//登録番号で検索させる
pw.println("2");
}
else {
n_search.execute();
pw.println("3");
}
request.setAttribute("n_search", n_search);
getServletConfig().getServletContext().getRequestDispatcher

("/jsp/name_test.jsp").forward(request, response);
}// doGetメソッドの終了
}
}
------------------------------------------------------------------
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-22 13:07
JDK1.4以降を使っている場合、パッケージに属しているクラスからデフォルトパッケージのクラスを呼び出すことは出来なかった気がします。
そのせいかどうかはわかりませんが、まず n_bean_db2 をパッケージに配置させることをおすすめします。

>以前、jspとBeansで作成したときは、package指定をしていたのですが、サーブレットを作成して、コンパイ
>ルした際に、Beans部分にエラーが出て、コンパイルができなかったため、package指定をしないで試みてい
>ます。
サーブレット内で import が書いていなかったとか?
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 80
投稿日時: 2006-01-22 14:12
返信ありがとうございます。

サイトを参考にしながら、Beansをpackage指定して、指定したフォルダの中に、Beansを
いて、サーブレットをその一つ上のフォルダにおいて、コンパイルしてエラーが出なかったので、表示させようと試みてみました。
そしたら、以前よりエラーが減りました。
name1_test.doGet(name1_test.java:60)とname1_test.doPost(name1_test.java:15)の部分以外、どこのエラーなのかわからないので、わかるところから解決していきたいと思います。お気づきの点がありましたら、ご教授お願いします。

----------------エラー------------------------------------------
exception

org.apache.jasper.JasperException
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
name1_test.doGet(name1_test.java:60)
name1_test.doPost(name1_test.java:15)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause

java.lang.ClassCastException
org.apache.jsp.jsp.name_005ftest_jsp._jspService(name_005ftest_jsp.java:46)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service

(JspServletWrapper.java:324)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
name1_test.doGet(name1_test.java:60)
name1_test.doPost(name1_test.java:15)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

--------------------------------------------------------------------
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2006-01-22 14:50
ひとまずJSPはコンパイルできりょうになったみたいですね。
パッケージなしのクラスをパッケージありのクラスでキャストしてるか、その逆とかで ClassCastException になっているのではないでしょうか。
サーブレットがパッケージに属していないようなので、パッケージなしのクラスのインスタンスがセットされているのではないでしょうか。
サーブレットもパッケージ内に配置しましょう。

[ メッセージ編集済み 編集者: インギ 編集日時 2006-01-22 14:56 ]
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 80
投稿日時: 2006-01-22 15:28
返信ありがとうございます。

name1_test.doGet(name1_test.java:60)とname1_test.doPost(name1_test.java:15)の部分を本を参考にして、見直してみました。
本と同じようにしてみましたが、解決できませんでした。


>サーブレットもパッケージ内に配置しましょう。

というご教授を受けて、
サーブレットをBeansと同じ場所において、サイトを参考にしながら、サーブレットをコンパイルしました。

2つの方法を試みてみました。

 1:参考サイトのサーブレットのように、Beansはパッケージ化して、サーブレットはパッケージ化しませんでした。そして、サーブレットをBeansがあるパッケージのフォルダ内でコンパイルしたところ、Beansにアクセスできませんでした。
 2:Beansとサーブレットをパッケージ化しました。そして、サーブレットをBeansがあるパッケージのフォルダ内でコンパイルしたところ、「シンボルを解決できません」
というエラーがでました。

「パッケージ内に配置する。」というのは、classファイルだけを配置するということなのでしょうか?
Beansとサーブレットのjavaファイルをパッケージのフォルダ内でコンパイルをしているのですが、それは、いけないのでしょうか?
本を見ると、Beansを利用しないで、サーブレットだけを利用するのには、classファイルをweb-infの下に置くという文を見つけたのですが、Beansをパッケージ指定して利用する場合も、サーブレットは別の場所でコンパイルして、classファイルだけをBeansと同じ場所に移動するのでしょうか?

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