- ベストアンサー
セッションを使ったint型の値の保持
こんにちは。 少し文が長いですがよろしくお願いします。 AccessのDBから取得したint型の値を、セッションを使って保持したいのですが while(rs.next()){ String name = rs.getString("NAME"); int value = rs.getInt("VALUE"); HttpSession session1 = req.getSession(true); HttpSession session2 = req.getSession(true); session1.setAttribute("Name", name); session2.setAttribute("Value", value); dispatcher2.include(req, res); } のコードの session2.setAttribute("Value", value); でコンパイルエラー DBAccess.java [37:1] javax.servlet.ServletRequest の setAttribute(java.lang.String,java.lang.Object) は (java.lang.String,int) に適用できません。 がでてうまくいきません。 セッションを使ってint型の値の保持を行うにはどうすればよいのでしょうか?
- amuro1980
- お礼率52% (23/44)
- Java
- 回答数6
- ありがとう数3
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>java.lang.NullPointerException と言っていると言う事は、この場合、session.getAttribute("Value") で正しい 値が取得出来ていないと言う可能性があります。nullが返って来ているとか。。。 と、言う事は、setAttribute でちゃんと値をセット出来ていないか、セッションが切れちゃってるとか。。。 あ、それより、代入先の配列の宣言に問題があるとかは無いでしょうか? 配列は、ちゃんと、確保されていますか? 最初の補足欄では、配列の要素数を指定していませんでしたが。。。 可能性は、いろいろと考えられるので、ここでは、「これ!」と言う事は出来ません。 いろいろと調べてみて下さい。 原始的ですが、一行ごとに変数の値を表示する等してみれば、案外すぐにどれが問題なのかが 分かる場合が多いです。 >getValue()/putValue()は非推奨メソッドになりました。今のJ2EEでは通りません。 そうなんですか。。。 非推奨になっているんですか。。でも、非推奨だったら、通らないことは無いんじゃないですか? 推奨しないだけでは。。。? でも、使わないに越したことは無いって言うことですね。 訂正ありがとうございました。
その他の回答 (5)
getValue()/putValue()は非推奨メソッドになりました。今のJ2EEでは通りません。
- mrt136
- ベストアンサー率35% (33/92)
すみません。。。適当なもので。。。 <% pa[count] = ((java.lang.Integer)(session.getAttribute("Value"))).intValue(); %> これでどうでしょう? 括弧が少なすぎました。。。 試してみて頂けますか?
補足
試してみたところ Apache Tomcat/4.0.3 - HTTP Status 500 - Internal Server Error type Exception report message Internal Server Error description The server encountered an internal error (Internal Server Error) that prevented it from fulfilling this request. exception java.lang.NullPointerException 内部サーバーエラーなるものがでてきました。 これはどういったエラーなのでしょうか。 プログラムの組み方によってよくでてくるのですが。
- mrt136
- ベストアンサー率35% (33/92)
1行でするなら、 <% pa[count] = (java.lang.Integer)(session.getAttribute("Value")).intValue(); %> かな。 putValue() じゃ駄目ですか。。。 以前、私も同じ事をした様な気がするんですけど。。。
補足
修正したら この型は = には不適合です。 java.lang.Integer から int には変換できません。 pa[count] = (java.lang.Integer)(session.getAttribute("Value")).intValue(); メソッド intValue() は class java.lang.Object で見つかりません。 pa[count] = (java.lang.Integer)(session.getAttribute("Value")).intValue(); のサーバーエラーがでてきました。 なかなか難しいです。
- mrt136
- ベストアンサー率35% (33/92)
setAttribute() じゃなくて、 session2.putValue("Value", value); とすれば出来るかも。。。 適当に回答しているので、間違っていたらすみません。
お礼
回答ありがとうございます。 試してみましたが残念ながら同じエラーがでてました。 やはりInteger型を引数としなければいけないみたいですね。
- ranx
- ベストアンサー率24% (357/1463)
第2引数がObjectということは、参照型の引数を取るということなので、 intをInteger型に変換したら良いと思うのですが、不都合ですか?
補足
session.setAttribute("Value", new Integer(value)); に変更したらコンパイルは通りました。 その後JSPでその値をint型の配列に格納していきたいのですが <%! int pa[]; %> <%! int count = 0; %> <%= session.getAttribute("Name") %> <% pa[count] = session.getAttribute("Value"); %> <%= pa[count] %> <% ++count; %> のgetAttributeのところでサーバーエラー この型は = には不適合です。java.lang.Object から int には変換できません。 がでます。 Objectからintに変換する方法があったら教えてください。 お願いします。
関連するQ&A
- セッション管理
度々の質問で申し訳ないです…。 「セッション管理」がどうしてもよく分かりません。 書籍やWeb上でいろんな説明を読んで頭では理解したつもりなんですが 実際使う段になるとつまづいてしまいます。 そこで質問です。 html → Servlret1 → JSP1 → Servlet1 → JSP2 → JSP3 このような遷移の中でセッション管理を行いたいと思っています。 今、JSP2までは無事にセッションオブジェクトに保存されたデータを 参照することができていますが、JSP2からJSP3に移るときに nullが渡されてしまうのです。 一度、Servlet1 へ制御を戻さなければだめなのでしょうか? 具体的なコードを以下に掲載します。 よろしくお願いします。 ========= Servlet1 でセッション開始 //セッションを得る HttpSession thisSession = req.getSession(true); //セッションに保存 req.getSession(false).setAttribute("Login","true"); ========= JSP2 で受け取る /* ここではちゃんと"true"が返ってきます。 */ //セッションオブジェクトから取り出す String login = (String)request.getSession(false).getAttribute("Login"); ========= JSP3 で受け取る /* ここで null が帰ってきてしまいます。 String login = (String)request.getSession(false).getAttribute("Login");
- 締切済み
- Java
- Servlet-JSP のセッション管理
すいません。 セッションというものを使ってみたいなと思い、 本などを、見よう見真似で下のようなものを作ってみましたが、 まったく動きません。どこがいけませんか? ーーservlet-ー HttpSession session = req.getSession(); if (session.isNew()) { session.setAttribute("test","ssm3u"); } ーーforwardされるJSP-ー <% HttpSession session = request.getSession(); %> <%= (String)session.getAttribute("test"); %> "ssm3u"と出したいのですが、全然違うのでしょうか? 自分ではCookieを利用するセッション管理を作ったつもりです・・
- ベストアンサー
- Java
- セッション管理
失礼いたします。 セッション情報の受け渡しを勉強しています。 送り手側で HttpSession ses = request.getSession(); String login = (String)ses.getAttribute("login"); String name = (String)ses.getAttribute("name"); if( !("ttttt".equals( login )) ) { //(以下処理) 受けて側で String name = request.getParameter("user"); String pass = request.getParameter("pass"); HttpSession ses = request.getSession(); if ( name.equals("admin") && pass.equals("hoge")) { ses.setAttribute("login","ttttt"); ses.setAttribute("name",name); out.println("<h3>ログインしました。</h3>"); } とし、セッション管理を行っています。 しかし、今ひとつこの「セッション情報」と普通のパラメーターの受け渡しの違いが分かりません。どちらも文字として次ページへ送っていますので。セッションがずっと保持されるとはソースのどういう所から分かるのでしょうか?漠然とした質問ですが、よろしくお願いします。
- ベストアンサー
- Java
- セッションについて(サーバーサイドJava)
Ajaxフレームワーク(DWR)を使いJavaScriptからJavaのメソッドを 呼び出すプログラム(一部)でセッション管理についてです。 下記のプログラムの様にコンストラクタでセッションのオブジェクト を作成し、(クライアント)JavaScriptからJavaのaddMember()を実行してセッションの 設定を行なった場合、複数のクライアントからアクセスがあった時でも そのクライアント数に応じたセッションが作成されるでしょうか? それともコンストラクタでセッションのオブジェクトが一つしか作成 されていない為、クライアントがaddMember()を実行するたびに セッションの設定が上書きされるのでしょうか? もし上書きする場合で改善する場合はaddMember()の中で context = WebContextFactory.get(); session = context.getSession(); session.setAttribute("userName", name); session.setAttribute("loginId", id); の様にセッションオブジェクトを作成してから 設定した方がいいのでしょうか? 以下Java(サーバー)プログラムです。 @RemoteProxy(name="DataManager", scope=ScriptScope.APPLICATION) public class DataManager{ private WebContext context; private HttpSession session; public DataManager(){ memberList = new ArrayList<Data>(); context = WebContextFactory.get(); session = context.getSession(); }//コンストラクタ ///JavaScriptから呼び出すメソッド @RemoteMethod public String addMember(String nameStr){ String id = this.createId(); String name = this.strEscape(nameStr); /////このメソッドが実行されるたびにセッションが上書きされる? session.setAttribute("userName", name); session.setAttribute("loginId", id); ---------------------[途中まで]-----------------------------
- ベストアンサー
- Java
- Sessionについて
今、JSPを用いてログイン画面を作成しているのですが、Sessionの使い方がいまいちわかりません。 HttpSession ses = request.getSession(); ses.setAttribute("id",id); これでSessionに格納するのはわかりますが Sessionから値を取り出す方法がわかりません。 どなたか助けてください
- ベストアンサー
- Java
- httpセッション
失礼致します。 セッションについてお聞きします。 httpsessionの受け渡しについてなのですが、画面jspページから ログイン名とパスワードを取得し、サーブレットに渡しています。 サーブレットの書き出しは次のようになっています。 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { HttpSession session3 = req.getSession(true); ・・・ このあとsession3セッションにパスワードをセットし、 jspページでセッションチェックした後falseならログイン画面に リダイレクトします。ここまでは出来ました。 ところが、このログイン名を文字列操作したいと思い、 サーブレットからjspページにディスパッチする前に一旦 文字列操作用javaページで文字列操作をしようと思いました。 ところが、サーブレットでない純粋なjavaページではhttpsessionが使えないことが分かりました。 HttpSessionを型に解決できませんと言われます。 この問題は一度は直面したことのある方も多いのではないかと思い、質問させて頂きました。 このような場合、どのように対処されていますでしょうか?
- 締切済み
- Java
- インタフェースのメソッド
最近仕事でJAVAを使うことになり勉強し始めたのですが、分からないことがあります。 たとえばHTMLからPOST要求を受けるサーブレットでセッションを取得する際、 doPost(HttpServletRequest req , HttpServretResponse res){ HttpSession session = req.getSession(true) … } としますが、このgetSessionメソッドの中身はどこで実装されているのですか?reqインスタンスはHttpServletRequest型としか指定していませんが、HttpServletRequestはインタフェースなのでメソッドの実装をしていないと思うのですが・・・。 知らなくても「こうするものだ」と思っておけば問題はないのでしょうが、しっかり理解しておきたいのでよろしくお願いします。
- 締切済み
- Java
- セッションIDの付け替えについて
はじめまして。 Servlet でセッションIDの付け替えをしたいのですが、 HttpSession session = request.getSession(); out.println(session.getId()); session.invalidate(); HttpSession newSession = request.getSession(true); out.println(newSession.getId()); のように、 一度invalidate()してから、 新しいセッションを取得しても 同じセッションIDとなってしまいます。 違うセッションIDを振るにはどうしたらよいでしょうか。
- 締切済み
- Java
- セッションタイムアウトになった時
やりたいことは 1)セッション情報を取り出す 2)取り出した値を使ってDBに書き込みする 3)セッション情報を破棄する です。 http://oshiete1.watch.impress.co.jp/qa455453.html ほぼここの方と同じです。 ここの方はうまくいったようなのですが・・・ 初心者で悩んでいます。よろしくお願いいたします。 HttpSessionBindingListener セッションが切れた(valueUnbound)時 getAttribute("aaa")で "1111111"←ユーザーIDを取得したい。 req_.getSession().getAttribute("aaa");で取得できません。 よろしくお願いします。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** セッション開始終了処理のテストサーブレット **/ public class SessionServlet extends HttpServlet implements HttpSessionBindingListener { HttpServletRequest req_; HttpServletResponse res_; public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("valueBound"); } public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println(req_.getSession().getAttribute("aaa")); System.out.println("valueUnBound"); } public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req_=req; res_=res; HttpSession session1 = req.getSession(); res.setContentType("text/html; charset=Shift_JIS"); req.setCharacterEncoding("Shift_JIS"); PrintWriter out = res.getWriter(); // パラメータの取得 String act = req.getParameter("act"); // ログイン処理 if (act == null) { // セッション変数の作成、設定 SessionServlet data = new SessionServlet(); session1.setAttribute("aaa", "1111111"); session1.setAttribute("data", data); // セッション開始画面の表示 out.println("<html><body>"); out.println("<h1>セッション開始</h1>"); out.println("<form method=\"POST\" action=\"SessionServlet?act=lo\">"); out.println("<input type=\"submit\" value=\"logout\">"); out.println("</form>"); out.println("</body></html>"); out.close(); // ログアウト処理 } else { // セッション終了画面の表示 out.println("<html><body>"); out.println("<h1>セッション終了</h1>"); out.println("</body></html>"); out.close(); // セッションの無効化 session1.invalidate(); } } }
- 締切済み
- Java
- setAttribute(String, int)は適用できない
setAttribute(String, int)は適用できない 今、servletでセッションの勉強をしています。 ある本に載っているソースコードをそのままコピーしたんですが、 「HttpSessionのメソッド setAttribute(String, Object)は(String, int)に適用できません。」 …というエラーが出て動きません。 こういう場合、実行するにはどうしたら良いのでしょうか? アクセスした回数をカウントすることなんてよくあると思うんです。 intも(Stringなんかも)Objectの下に含まれてるんじゃないんですか? intでも良い気がするんですけど…。 一応、ソースコードを貼っておきます: ### Sample229TestServlet.java ### package com.tips; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class Sample228TestServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private int count = 0; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); HttpSession session = request.getSession(); session.setAttribute("param",count++); //問題の箇所 out.println("<html><head><title>Sample228</title></head><body>"); out.println("<h2>SessionAttributeListenerの例</h2>"); out.println("sessionの属性countが" + count + "に変化しました。"); out.println("</body></html>"); out.close(); } } ### Sample228.java ### package com.tips; import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionAttributeListener; import javax.servlet.http.HttpSessionBindingEvent; public class Sample228 implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent event) { } public void attributeRemoved(HttpSessionBindingEvent event) { } public void attributeReplaced(HttpSessionBindingEvent event) { ServletContext app = (event.getSession()).getServletContext(); app.log(">> Sample228 Listener detects attribute changed."); } } …必要であれば補足します。では、宜しくお願いします。
- ベストアンサー
- Java
お礼
ご指摘どおり配列の宣言に問題がありました。 配列の初期化をやっていなかったためうまくいかなかったみたいですね。 度重なる質問に回答をくださってありがとうございました。