- - PR -
Servlet/jspでのエラー
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-08-18 17:56
あいつーです。
useBeanを使用する場合はパッケージを指定していないとエラーになる、という旨の 過去ログが有りましたのでそちらを参照してみてください。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=2444 | ||||||||||||
|
投稿日時: 2004-08-18 18:01
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 ] | ||||||||||||
|
投稿日時: 2004-08-18 18:34
ちょっと待った! 無名パッケージ自体は禁止されていません。できなくなったのは、 「無名パッケージのクラスをimportすること。」 です。
があったとして、
というコードの "import T;" がコンパイルエラーになります。 | ||||||||||||
|
投稿日時: 2004-08-18 18:50
あっそうでした,すみませんです・・・ m(_ _)m
| ||||||||||||
|
投稿日時: 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側でどのようにコーディングすればいいでしょうか? : | ||||||||||||
|
投稿日時: 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-22 13:36
Javaは基本的に参照渡しなので、下記コードでいいと思いますが?
| ||||||||||||
