はじめまして、当方駆け出しのプログラマです。
JAVA歴2ヶ月で勉強(研修)させてもらっています。
初歩的な質問かもしれませんが、ご返答いただけると幸いです。
勉強して一ヶ月ほどでJSPサーブレットを使った簡単なスケジュールを表示するプログラムを作りました。環境はEclipse(pleiades3.5)+tomcat6.0+jre1.6+mysql5.5.10です。
これをフレームワークに準拠したつくりに移行してくれと上司の方に言われました。
しかし、私が作ったものは、スケジュール表示で日付で参照し、そこからデータベースからとったスケジュールの日付と合致するものがある場合リンクを表示するというものでした。
このためタグライブラリのC:each等の繰り返しは使えないため、スクリプトレットで変数として値を持ってこないと動作しない状態です。
Stringやint型はrequest.getAttributeでもってこれるのはわかったのですがentityに入っている値を持ってくることが出来ずNullになってしまいます。
ソースはこちらになります。
書き出しで説明すると。
DB接続→値を持ってきてentityにセットする→これらをarrayListに格納→arrayListの中身を日付順にソート→entityの配列に収納する→jspに受け渡し→表示できない。
という状況です。
ScheduleMainはentityでSchedule_mainはDBのテーブルです。arrayの部分で日付順になるようにソートをかけてあります。これは理由があってsql内でソートしていません。
scheduleitemsはScheduleItemsというentityで複数個スケジュールを保管できるように配列をゲッターセッター設置してあります。
Action.java
for(int i=0 ; i<schedulemain.size();i++){
ScheduleMain schemain = schedulemain.get(i);
int ID = schemain.getId();
String place = schemain.getPlace();
String schedule = schemain.getSchedule();
int empId = schemain.getEmpId();
int category = schemain.getCategory();
int scheCategory = schemain.getScheCategory();
Date scheduleDay = schemain.getScheduleDay();
Time endtime = schemain.getEndtime();
Time starttime = schemain.getStarttime();
schedule_main.setCategory(category);
schedule_main.setEmpId(empId);
schedule_main.setEndtime(endtime);
schedule_main.setId(ID);
schedule_main.setPlace(place);
schedule_main.setScheCategory(scheCategory);
schedule_main.setSchedule(schedule);
schedule_main.setScheduleDay(scheduleDay);
schedule_main.setStarttime(starttime);
array.add(schedule_main);
}
ScheduleMain[] itembean = (ScheduleMain[])array.toArray(new ScheduleMain[array.size()]);
Comparator asc = new Comparator() {
public int compare(Object obj0, Object obj1) {
String nameKana0 = ((ScheduleMain) obj0).getScheduleDay().toString();
String nameKana1 = ((ScheduleMain) obj1).getScheduleDay().toString();
int ret = 0; // カナの昇順
if ((ret = nameKana0.compareTo(nameKana1)) == 0) {
// カナが同じ場合はIDの昇順
String id0 = ((ScheduleMain) obj0).getStarttime().toString().substring(0,5);
String id1 = ((ScheduleMain) obj1).getStarttime().toString().substring(0,5);
ret = id0.compareTo(id1);
}
return ret;
}
};
scheduleitems.setItembean(itembean);
jsp側ですが。
ScheduleItems scheduleitems = (ScheduleItems)request.getAttribute("Scheduleitems");
で宣言をし、out.printやlengthをとってもnullExeprionになってしまいます。
enteity部分
ScheduleItems.java
package schedule.entity;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="schedule_main")
public class ScheduleItems {
public ScheduleMain[] itembean = null;
public ScheduleItems(){
}
public ScheduleMain[] getItembean() {
return itembean;
}
public void setItembean(ScheduleMain[] itembean) {
this.itembean = itembean;
}
}
ScheduleMainは自動生成されるDoltengでDBから生成しました。
entityではだめなのかと思いDtoでも試しましたがやはり同じ症状になってしまいます。
この部分が解決されるだけでかなりの進捗が期待されるのでどうかよろしくお願い致します。
長文失礼しました。よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
scheduleitemsはrequestスコープにセットされていますか?
(Actionクラスのpublicなフィールドとして定義してあるか、そうでなければ明示的なセットを行っていますか?)
ところで
>しかし、私が作ったものは、スケジュール表示で日付で参照し、そこからデータベースからとったスケジュールの日付と合致するものがある場合リンクを表示するというものでした。
>このためタグライブラリのC:each等の繰り返しは使えないため、スクリプトレットで変数として値を持ってこないと動作しない状態です。
とありますが、jstl:if等の条件式で判断は出来ませんか?
(とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが)
#ScheduleMain自体に@Transientなワーク変数で「リンクか否か」のフラグを持たせる等すれば分離しやすくなりますね。
返答が遅れ大変申し訳ありません。
アドバイスありがとうございます。
scheduleitems自体はrequest持ってますしpublicに設定してあります。
タグによる呼び出し<c:~等で呼び出しが出来るのですがattribute自体にセットできないので苦労していました。
>>とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが
結局items[32]の配列にsqlで持ってきた情報をつめることによって解決させました。
やはりAction変数を詰め込めるだけ詰め込んで渡すのがスマートなのでしょうかね・・・
No.1
- 回答日時:
どこでも
request.setAttribute("Scheduleitems", Scheduleitemsクラスのインスタンス);
をしていませんが、それは記載していないだけでしょうか?
ただ、SAStrutsならsetAttribute、getAttributeで受け渡すこと自体が正しくない気がしますね。
http://sastruts.seasar.org/featureReference.html …
こちらは参考になりませんか?
返答が遅れ大変申し訳ありません。
アドバイスありがとうございます。
やはりELやタグを使うのが一般的のようですね。結局Actionに配列としてその月の情報を詰め込むことで解決しました。
出来ればJSPで作ったとおりに再現したかったので(この時点で横着なのかもしれませんが)残念です。
勉強になりました、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「配列定数は、イニシャライザ...
-
式の型は配列型で int に解決済...
-
javaのエラーの意味がわかりま...
-
Javaで素数の表を表示させたい...
-
java spring でエラーが出て困...
-
ある年月の月間日数を取得する...
-
分を表す数字(int型)を時間形...
-
Java3Dで円錐台を描く方法を教...
-
行の途中から読み込む方法
-
javaでカレンダー作成
-
javaでcsvファイル読込時の改行...
-
初心者ですが、今javaで簡単な...
-
(Swing)JTextFieldを半角のみ入...
-
C#で、デリゲートからその関数...
-
Javaでポインタ的なことはでき...
-
Javaのファイル名チェックについて
-
javaの課題・・
-
偶数奇数の判定
-
C#で「型または名前空間名 'int...
-
javaのRandomで『a~z』までの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
javaでカレンダー作成
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
C#で実行時にメソッドの返り値...
-
(Swing)JTextFieldを半角のみ入...
-
c# デリゲート関連の命名について
-
Javaでポインタ的なことはでき...
-
複数のボタンを配置し、それぞ...
-
JUnit4のアノテーションについて
-
javaのエラーの意味がわかりま...
-
intが負の時に投げる例外はあり...
-
sin曲線とcos曲線を描くプログ...
-
C++からC#のdllを参照する際、...
-
Java 初心者 int型の取り扱い方
おすすめ情報