プロが教える店舗&オフィスのセキュリティ対策術

はじめまして、当方駆け出しのプログラマです。
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でも試しましたがやはり同じ症状になってしまいます。

この部分が解決されるだけでかなりの進捗が期待されるのでどうかよろしくお願い致します。


長文失礼しました。よろしくお願い致します。

A 回答 (2件)

scheduleitemsはrequestスコープにセットされていますか?


(Actionクラスのpublicなフィールドとして定義してあるか、そうでなければ明示的なセットを行っていますか?)


ところで
>しかし、私が作ったものは、スケジュール表示で日付で参照し、そこからデータベースからとったスケジュールの日付と合致するものがある場合リンクを表示するというものでした。
>このためタグライブラリのC:each等の繰り返しは使えないため、スクリプトレットで変数として値を持ってこないと動作しない状態です。
とありますが、jstl:if等の条件式で判断は出来ませんか?
(とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが)

#ScheduleMain自体に@Transientなワーク変数で「リンクか否か」のフラグを持たせる等すれば分離しやすくなりますね。
    • good
    • 1
この回答へのお礼

返答が遅れ大変申し訳ありません。

アドバイスありがとうございます。

scheduleitems自体はrequest持ってますしpublicに設定してあります。
タグによる呼び出し<c:~等で呼び出しが出来るのですがattribute自体にセットできないので苦労していました。

>>とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが

結局items[32]の配列にsqlで持ってきた情報をつめることによって解決させました。

やはりAction変数を詰め込めるだけ詰め込んで渡すのがスマートなのでしょうかね・・・

お礼日時:2011/05/17 10:20

どこでも


request.setAttribute("Scheduleitems", Scheduleitemsクラスのインスタンス);
をしていませんが、それは記載していないだけでしょうか?

ただ、SAStrutsならsetAttribute、getAttributeで受け渡すこと自体が正しくない気がしますね。
http://sastruts.seasar.org/featureReference.html …
こちらは参考になりませんか?
    • good
    • 0
この回答へのお礼

返答が遅れ大変申し訳ありません。

アドバイスありがとうございます。

やはりELやタグを使うのが一般的のようですね。結局Actionに配列としてその月の情報を詰め込むことで解決しました。

出来ればJSPで作ったとおりに再現したかったので(この時点で横着なのかもしれませんが)残念です。

勉強になりました、ありがとうございました。

お礼日時:2011/05/17 10:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!