• ベストアンサー

HashMapについて

【Java-Class】 JavaでDBの終了まで、日付・DB有無フラグを退避する。 【JSP】 DB有無フラグが存在する場合は"・"をカレンダーに表示する。 という処理を行いたいと思います。 HashMapを使用して put(),get()を使用したいと思いますが、get()を実行した際にNullPointerExceptionが表示されてしまいます。 エラーを見る限りではputの際に配列に設定していないのが原因なのではないかと思いますが、 修正方法がよくわかりません。 どうかよろしくお願いします。 ===DBSelect.java================================= CalenderHash hash = new CalenderHash(); /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString(YMD), "1"); } ===CalenderHash.java============================= public class CalenderHash { protected HashMap ht; public CalenderHash(){ } public void HashPut(Object YMD,Object Flg){ ht.put(YMD,Flg); } public Object get( Object key ) { return(ht.get(key)); } ==JSPの一部 ============================ for ( int i=1; i<=6; i++){ out.println("<TR ALIGN='right'>"); out.println("<TD>"); <省略> YearMD = year + month + Day; mark = ""; // 値の取得 if ( hash.get(YearMD).equals("1")){ mark = "・"; } %> <A HREF="/Schedule/jsp/memo.jsp?Ymd=<%= YearMD %> "><%= mark %><%= cntday %></A> &nbsp; <% } out.println("</TD>"); } out.println("</TR>"); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

JAVAとJSPとの受け渡しは、どのようになってますか? 多分そこがおかしいかと・・・。 普通に渡せていれば、JSP側で単純にgetするだけです。

-cinq-
質問者

補足

やはりそうですか。 現在は受け渡しを行ってないです。 PutしたデータをJSP側に渡すには 具体的にはどのように設定するのですか? ===== Servlet ====== <省略> request.setAttribute("year", year); request.setAttribute("month", month); String YMD = year + month + "01"; /* カレンダー処理 */ Dbconnect connect = new Dbconnect(); Calendar calen = Calendar.getInstance(); calen.set(Integer.parseInt(year),Integer.parseInt(month) - 1,1); maxday = Integer.toString(calen.getActualMaximum(Calendar.DATE)); maxday = year + month + maxday; connect.chkShedule(YMD,maxday); request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); } ===== Java ====== public void chkShedule(String YMD,String maxday){ /*HashMapクラスの生成 */ CalenderHash hash = new CalenderHash(); <省略> /* DB終了まで */ while(rs.next()){ // 値の格納 hash.HashPut(rs.getString("YMD"), "1"); } <省略> }

すると、全ての回答が全文表示されます。

その他の回答 (12)

回答No.13

>>型の不一致: String から CalenderHash には変換できません。 ん??? CalenderHash hash = (CalenderHash)request.getParameter("hash"); かな? CalenderHash hash = (CalenderHash)request.getAttribute("hash"); かも・・・。 ちゃんとソース見てないので、ちょっと自信ないです・・・。

-cinq-
質問者

お礼

ありがとうございますっ!! やっと表示できました。 キャッシュもしてみましたが、 キャッシュできませんのエラーが表示されました。 で、よく考えてみたところ jsp:useBeanで定義してうまくいきました。 本当に長い間ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.12

>型の不一致: String から CalenderHash には変換できません。 そのままでしょう。 コンパイルエラーなんだから行数出てますよね。 そこでStringをCalenderHashの変数に入れようとしていませんか? #っていうことより、1番言いたいのは #×CalenderHash #○CalendarHash #ってことです。 #勉強用なら構いませんが、仕事などで世に出すと…

すると、全ての回答が全文表示されます。
回答No.11

補足のメールがうまく届かないので、回答が遅れてしまった・・・。 >>(1)は戻り値が存在しませんが、request.setAttribute("キー名", hash);で値は渡せるのですか? #10で回答しましたので、参考にしてください。 >>また、JSP側の受け取りは・・・以下略 CalenderHashです。 ちなみに、 >>○○○○ hash = request.getParameter("hash"); ○○○○ hash = request.getParameter("キー名"); ですよ。

-cinq-
質問者

補足

ご回答ありがとうございます。 >>○○○○ hash = request.getParameter("キー名"); ですよ。 説明不足でごめんなさい。 キー名を"hash"とした時という説明が抜けておりました。 CalenderHashでコンパイルを行ってみたのですが 型の不一致: String から CalenderHash には変換できません。 のエラーが表示されてしまいます。 何度も申し訳ありません。

すると、全ての回答が全文表示されます。
回答No.10

あっ、そうそう・・・。 値が入ったCalenderHashのインスタンスが、 chkSheduleメソッドの中で生成されてるんですね・・・。 とりあえずこいつをreturnするか(voidをやめる)、引数で戻してこないと・・・。 クラス設計見直しかな?

すると、全ての回答が全文表示されます。
回答No.9

あれ? 値の入ったCalenderHashのインスタンス(ここではhash)はどこ行ったの??? request.setAttribute("キー名", hash); がない!!!

-cinq-
質問者

補足

当初の原因がここにあるようです。 遠回りをさせてしまいまして申し訳ありません。 まだいまだに明確に出来ていない点があるのですが よろしければご教授いただけませんでしょうか? JSP側に値を渡さないといけないのは、 わかるのですが。。。 Servletの中では以下の処理をしています。 (1)connect.chkShedule(YMD,maxday); (2)request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); (1)の中で、HashMapにPutしている。 (2)でJSPに処理を渡す。 (1)は戻り値が存在しませんが、request.setAttribute("キー名", hash);で値は渡せるのですか? また、JSP側の受け取りは  ○○○○ hash = request.getParameter("hash"); ○部分はどのようになるのでしょうか?

すると、全ての回答が全文表示されます。
回答No.8

>request.setAttribute("year", year); ↑と同じですよ。 >request.getRequestDispatcher("/jsp/calender.jsp").forward(request,response); ↑をやる前に、 >connect.chkShedule(YMD,maxday); ↑で使われた CalendarHashを同じように何か名前をつけてセットして、JSP側で同じ名前でgetしてあげればいいんです。

すると、全ての回答が全文表示されます。
  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.6

#5です だめですか。。。 じゃ、もう一点だけ気になる点。 DBから採ってきた値をそのままHashのキーにしてますが、それは取得するときに作成するキー YearMD = year + month + Day; と同じ文字列ですか? 入れるところ、出すところあたりでキー値を確認されてみてはいかがでしょう。 (あと、出力するあたりでHashのサイズも確認したほうが良いかな?)

すると、全ての回答が全文表示されます。
  • T0ngT0ng
  • ベストアンサー率40% (8/20)
回答No.5

NullPointerExceptionがでるのは以下の箇所ですよね? -- // 値の取得 if ( hash.get(YearMD).equals("1")){ -- Hashには、DBから取れた日付分だけputしてるのですから、当然該当しない("・"をつけない)日付ではhash.get(YearMD)はnullとなると思います。 equals("1")ではなく、null かどうかで判断されてはいかがですか?

-cinq-
質問者

補足

ご指摘ありがとうございます。 NullPointerExceptionはご指摘の通り DBに存在しない場合にNullになるので 以下のように修正しました。 // 値の取得 if (hash.get(YearMD) != null){  if ( hash.get(YearMD).equals("1")){     mark = "・";  } } putでは"1"しかセットしていないので入れ子のif文は 不要かとは思いますが。。。 しかしDBに入っている値もNullになっているのが 今の現状です。

すると、全ての回答が全文表示されます。
回答No.4

#1です。 hash.HashPut(rs.getString(YMD), "1"); このコンパイルで、YMDは解決済みなんですよね? じゃなければ、 hash.HashPut(rs.getString("YMD"), "1"); が正解。 YMDが定義済みなら・・・、 わかりません。 *がダメとも思えないし・・・。

-cinq-
質問者

補足

ありがとうございます。 ご指摘の通りでした。 混乱してきてしまったので、もう少しご教授頂けたらと 幸いです。 JavaからJSPにデータを渡す際は、 request.getRequestDispatcher等を使用しますが 私の記述では関連が取れてないような気がします。 その為、put後にgetができてJSP側では出来ないのかと。。。お門違いであればご指摘ください。 Servlet処理 ・DBConnectクラスへ(HashMapをPut) ・JSPへ(HashMapをGet)

すると、全ての回答が全文表示されます。
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

>その後、列名が無効ですと表示されています だったら、データベースのテーブルに列が無いのでしょう。 hash.HashPut(rs.getString(YMD), "1"); は、 hash.HashPut(rs.getString("YMD"), "1"); の間違いじゃないんですか?

-cinq-
質問者

補足

ありがとうございます。 ご指摘の通りです。 ご指摘分を修正し、試しにwhile文の中でgetしてみたら値がとれました。 しかし,JSP側でのget処理は取得時にnullになっているので もう少し調査をしてみます。

すると、全ての回答が全文表示されます。

関連するQ&A