※ ChatGPTを利用し、要約された質問です(原文:SAStrutsでActionからJSPに値を渡す)
SAStrutsでActionからJSPに値を渡す
このQ&Aのポイント
勉強して一ヶ月ほどでJSPサーブレットを使った簡単なスケジュールを表示するプログラムを作りました。
スケジュール表示で日付で参照し、データベースから取得したスケジュールの日付と合致する場合にリンクを表示するプログラムです。
しかし、スクリプトレットで変数として値を受け取る必要があり、現在はその処理がうまくいっていません。
SAStrutsでActionからJSPに値を渡す
はじめまして、当方駆け出しのプログラマです。
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でも試しましたがやはり同じ症状になってしまいます。
この部分が解決されるだけでかなりの進捗が期待されるのでどうかよろしくお願い致します。
長文失礼しました。よろしくお願い致します。
お礼
返答が遅れ大変申し訳ありません。 アドバイスありがとうございます。 scheduleitems自体はrequest持ってますしpublicに設定してあります。 タグによる呼び出し<c:~等で呼び出しが出来るのですがattribute自体にセットできないので苦労していました。 >>とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが 結局items[32]の配列にsqlで持ってきた情報をつめることによって解決させました。 やはりAction変数を詰め込めるだけ詰め込んで渡すのがスマートなのでしょうかね・・・