- PR -

Servlet/jspでのエラー

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2004-08-18 17:37
★お世話になります。
 Servlet/jspを作成しましたが、エラーの対処方法がわかりません。
 以下のような状況です。宜しく御願いします。
 (長々と書いてすいません)

■処理の流れは、Shain.jsp ⇒ Controller.java ⇒ ShainResult.jsp です。
 この処理で、ShainResult.jspを表示したとき、以下のエラーが出力されます。

JSPファイル: /ShainResult.jsp の中の行: 1でエラーが発生しました

生成されたサーブレットのエラーです:
[javac] Compiling 1 source file

C:\app\eclipse\workspace\question\work\org\apache\jsp\ShainResult_jsp.java:42: シンボルを解決できません。
シンボル: クラス ShainEty
場所 : org.apache.jsp.ShainResult_jsp の クラス
ShainEty shainEty = null;
^
JSPファイル: /ShainResult.jsp の中の行: 1でエラーが発生しました

生成されたサーブレットのエラーです:
C:\app\eclipse\workspace\question\work\org\apache\jsp\ShainResult_jsp.java:44: シンボルを解決できません。
シンボル: クラス ShainEty
場所 : org.apache.jsp.ShainResult_jsp の クラス
shainEty = (ShainEty) pageContext.getAttribute("shainEty", PageContext.SESSION_SCOPE);
^
JSPファイル: /ShainResult.jsp の中の行: 1でエラーが発生しました

生成されたサーブレットのエラーです:
C:\app\eclipse\workspace\question\work\org\apache\jsp\ShainResult_jsp.java:47: シンボルを解決できません。
シンボル: クラス ShainEty
場所 : org.apache.jsp.ShainResult_jsp の クラス
shainEty = (ShainEty) java.beans.Beans.instantiate(this.getClass().getClassLoader(), "ShainEty");

■ShainResult.jspの以下の3行を削除すると画面は表示されます。
 <jsp:useBean id="shainEty" class="ShainEty" scope="session"/>
 社員名:<%=shainEty.getName()%>
 年 齢:<%=shainEty.setAge()%>

■Controller.javaの社員エンティティオブジェクトの作成
 (ShainEty shainEty = new ShainEty();)では、shainEtyオブジェクト
 が正しく作成されていることは確認しています。

=====================
===== Shain.jsp =====
=====================
<%@ page language="java" pageEncoding="UTF-8" %>

<html>
<head><title>社員</title></head>

<body>
社員<br>
<form method="post" action="/question/controller">

<input type="submit" value=" 次へ " name="submit" onClick="this.form.COMMAND_ID.value='next';">

</form>
</body>
</html>

===========================
===== ShainResult.jsp =====
===========================
<%@ page language="java" pageEncoding="UTF-8" %>
<jsp:useBean id="shainEty" class="ShainEty" scope="session"/>

<html>
<head><title>結果</title></head>

<body>
社員名:<%=shainEty.getName()%>
年 齢:<%=shainEty.setAge()%>
</body>
</html>

===========================
===== Controller.java =====
===========================
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Controller extends HttpServlet
{
public void doPost( HttpServletRequest req,
HttpServletResponse res ) throws IOException
{
// セッション
HttpSession session = req.getSession(true);

// 社員エンティティ
ShainEty shainEty = new ShainEty();

// セッションの設定
session.setAttribute( "shainEty", shainEty );

// 画面の移動
try
{
getServletContext().getRequestDispatcher( "/ShainResult.jsp" ).forward( req, res );
}
catch (ServletException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}

=========================
===== ShainEty.java =====
=========================
public class ShainEty
{
// 変数
private String name;
private int age;

// コンストラクタ
public ShainEty()
{
this.name = "nomura";
this.age = 21;
}

// getter/setter
public int getAge()
{
return age;
}
public String getName()
{
return name;
}
public void setAge(int i)
{
age = i;
}
public void setName(String string)
{
name = string;
}
}

===================
===== web.xml =====
===================
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<servlet>
<servlet-name>controller</servlet-name>
<servlet-class>Controller</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>/controller</url-pattern>
</servlet-mapping>

</web-app>

あいつー
ベテラン
会議室デビュー日: 2004/05/20
投稿数: 89
投稿日時: 2004-08-18 17:56
あいつーです。

useBeanを使用する場合はパッケージを指定していないとエラーになる、という旨の
過去ログが有りましたのでそちらを参照してみてください。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=2444
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-08-18 18:01
引用:

未記入さんの書き込み (2004-08-18 17:37) より:

===========================
===== ShainResult.jsp =====
===========================
<%@ page language="java" pageEncoding="UTF-8" %>
<jsp:useBean id="shainEty" class="ShainEty" scope="session"/>

<html>
<head><title>結果</title></head>

<body>
社員名:<%=shainEty.getName()%>
年 齢:<%=shainEty.setAge()%>
</body>
</html>



JSPコンパイラが指摘しているのは,"ShainEty"クラスが見つからないというエラーです。
"ShainEty"クラスファイルが,WEB-INF/classes以下に配備されていますか?

また,Javaのバージョンは示されていませんが,無名パッケージ(Package宣言のないクラスを定義すること)をimportするのはやめましょう(Java 1.4より違反となっています)。
上記のJSPコードと直接は関係しませんが,Java初心者がよく陥る落とし穴です。

# 後,クラス名についてですが,"Shain"ではなく,せめて"Member"と命名しましょうよ!
# "しゃいん"ではなく"しぇいん"と発音しそう → 別に強制ではありません。(^ ^)

※ 無名パッケージの箇所の記述を修正しました... (- -;

_________________
日本プロ野球・1リーグ制,断固反対!
K.Ogawa ( super-creek@jcom.home.ne.jp )

[ メッセージ編集済み 編集者: SuperCreek 編集日時 2004-08-18 18:54 ]

[ メッセージ編集済み 編集者: SuperCreek 編集日時 2004-08-18 18:57 ]
佐々木
大ベテラン
会議室デビュー日: 2003/03/30
投稿数: 121
投稿日時: 2004-08-18 18:34
引用:

Javaのバージョンは示されていませんが,無名パッケージ(Package宣言のないクラスを定義すること)を使うのはやめましょう(Java 1.4より違反となっています)。



ちょっと待った!

無名パッケージ自体は禁止されていません。できなくなったのは、
「無名パッケージのクラスをimportすること。」
です。

コード:
public class T{}



があったとして、

コード:
package p;
import T;
public class P{}



というコードの "import T;" がコンパイルエラーになります。
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-08-18 18:50
あっそうでした,すみませんです・・・ m(_ _)m
未記入
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 81
投稿日時: 2004-08-18 20:16
書き込んでくださった皆様ありがとうございます。
エラーはimport宣言でうまくいきました。
実は、あと2つ質問があります。ずうずうしくてすいません。
(本当はこの質問をお聞きしたかったのですが。。。)

■質問1

新規作成したセッションに対し、メンバー単位でのセット
はできないでしょうか?
イメージで言うと、
// セッションの新規作成
session.setAttribute( "shainEty", shainEty );

// 作成されたセッションに対し、メンバーのageのみ値を変える。
// nameメンバーは、そのまま。
session.setAttribute( "shainEty", shainEty.setAge( 34 ) );

■質問2

static変数をjspで使うことはできませんか?

// サーブレット
public class Controller extends HttpServlet
{
static int i = 1; // この変数をJSPで使うには、JSP側でどのようにコーディングすればいいでしょうか?
       :

Santa
会議室デビュー日: 2003/05/28
投稿数: 8
投稿日時: 2004-08-22 11:30
■質問1 への回答
HttpSession#setAttribute(Object, Object) ですので、
ShainEty#setAge(int) の戻り値として、その社員オブジェクト自体を返すようなメソッドにすれば、お望みの結果を得られると思います。

 public ShainEty setAge(int age) {
this.age = age;
return this;
}

setter は戻り値なし(void)が慣習のような気がしますし、
HttpSessionオブジェクトは shainEty への参照を保持しているので
setAge(32) だけすれば、該当のオブジェクトのプロパティは変更されるように思います。

■質問2 への回答
jsp では <%! 〜 %> で宣言できます。
クラス変数、インスタンス変数、クラスメソッド、インスタンスメソッド など
jsp は初回実行時に Servlet ソースに変換&コンパイルされて実行されます。
お使いの Web コンテナがわかりませんが、
大概、どこかに変換済みソースがあると思うので、探して見てみるとイメージがつかめると思います。
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-08-22 13:36
Javaは基本的に参照渡しなので、下記コードでいいと思いますが?

コード:
session.setAttribute( "shainEty", shainEty );
shainEty.setAge( 34 );



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