“3.3.5 ビジネスクラスの生成”で、ビジネスクラスとして、BoardHandler.javaを生成しましたが、具体的にロジックを実装する作業に入ります。ソースコードは以下のとおりです。赤字が修正・追加した個所です。
BoardHandler.java
/* * BoardHandler.java * author: * Copyright(c) */ package board; import javax.servlet.ServletContext; import com.fujitsu.uji.DispatchContext; import com.fujitsu.uji.GenericHandler; import com.fujitsu.uji.http.HttpDispatchContext; import board.*; /** * ビジネスクラスです。 * * @author * @version */ public class BoardHandler extends GenericHandler { //{{UJIWIZ_GENERATE(METHODDEF) //@@UJI-Wizard Information(Class) //@@,,startup,void //@@board.UserScheduleBean,update,updateUserSchedule,void //@@board.ProfileBean,selectuser,showUserSchedule,void //}}UJIWIZ_GENERATE //内部変数
TitleBean titleBean; //タイトル情報を保持するデータBean
ProfileBean proBean; //課員メニュー情報を保持するデータBean
ScheduleBean scheBean; //行動予定表情報を保持するデータBean /** * 新しいビジネスクラスのオブジェクトを作成します。 */ public BoardHandler() { // 以下に初期化する手続きを記述して下さい。 titleBean = new TitleBean(); } /** * クラスが初期化される時に呼び出されます。 * trueを返却するとインスタンスはセションスコープになります。 * falseを返却するとインスタンスはリクエストスコープになります * @return セションスコープとする場合true */ public boolean init() { // セッションスコープとする場合はtrue、しない場合はfalseを返します。 return true; } //{{UJIWIZ_GENERATE(METHOD) /** * startupの処理を行います。 * @param context 呼び出し情報を保持するクラス */ public void startup(DispatchContext context) { // 以下に必要な手続きを記述して下さい。 // 例 : // // Beanを生成し、データを設定します。 // SampleBean dataBean = new SampleBean(); // dataBean.setXXX(...); // // 表示に使うBeanに表示モードを設定します。 // dataBean.setVerb("mode1"); // // 各画面領域対してBeanを設定します。 // context.setResponseBean("body", dataBean); //行動予定表データのロード
BoardApplication ba = (BoardApplication)context.getApplicationProfile();
//main.jspの絶対パスを取得する
HttpDispatchContext hdc = (HttpDispatchContext)context;
ServletContext sc = hdc.getServletContext();
String path = sc.getRealPath("/");
ba.setPath(path);
//一覧表データの取得
DataManager dm = ba.loadData();
//課員の行動予定一覧を作成
scheBean = new ScheduleBean(dm);
context.setResponseBean("body",scheBean);
//課員選択メニューの作成
proBean = new ProfileBean(dm);
context.setResponseBean("menu",proBean, true);
//タイトルの作成
context.setResponseBean("title",titleBean, true);
}
/** * updateの処理を行います。 * @param context 呼び出し情報を保持するクラス * @ぱらm だたBean データBeanクラス */ public void updateUserSchedule(DispatchContext context, board.UserScheduleBean dataBean) { // 「update」の処理を記述します。 // 例 : // // 次画面用のBeanを生成し、データを設定します。 // YYYBean bean = new YYYBean(); // bean.setZZZ(...); // // 表示に使うBeanに表示モードを設定します。 // bean.setVerb("mode2"); // // 各画面領域対してBeanを設定します。 // context.setResponseBean("body", bean); //アプリケーションクラスで保存されている予定表一覧データの取得
BoardApplication ba = (BoardApplication)context.getApplicationProfile();
DataManager dm = ba.loadData();
//課員名をキーとしてdm内を検索して、新しいデータを設定する
String[] record = new String[5];
record[0] = dataBean.getName().getRawText();
record[1] = dataBean.getDestination().getRawText();
record[2] = dataBean.getHour().getRawText();
record[3] = dataBean.getMinute().getRawText();
record[4] = dataBean.getMemo().getRawText();
UserRecord ur = new UserRecord(record);
dm.update(ur);
//dm.updateDataManager(dataBean);
//アプリケーションクラスにある一覧表データの更新
ba.saveData(dm);
//課員の行動予定一覧を作成
ScheduleBean scheBean = new ScheduleBean(dm);
context.setResponseBean("body",scheBean);
}
/** * selectuserの処理を行います。 * @param context 呼び出し情報を保持するクラス * @param data Bean データBeanクラス */ public void showUserSchedule(DispatchContext context, board.ProfileBean dataBean) { // 「selectuser」の処理を記述します。 // 例 : // // 次画面用のBeanを生成し、データを設定します。 // YYYBean bean = new YYYBean(); // bean.setZZZ(...); // // 表示に使うBeanに表示モードを設定します。 // bean.setVerb("mode2"); // // 各画面領域対してBeanを設定します。 // context.setResponseBean("body", bean); //アプリケーションクラスで保存されている予定表一覧データの取得
BoardApplication ba = (BoardApplication)context.getApplicationProfile();
DataManager dm = ba.loadData();
//選択された課員の予定を表示する
UserScheduleBean userScheBean = dm.obtainUserSchedule(dataBean);
context.setResponseBean("body",userScheBean); } //}}UJIWIZ_GENERATE }
以下は主なメソッド内での処理内容です。
このメソッド内ではデータの初期化を行います。処理の流れとしては以下のとおりです。
保存されている表データを読み込み、アプリケーションクラス内で定義している静的変数に保存します。
それぞれのデータBeanに対してset(プロパティ名)メソッドを使い表構成に必要なデータを設定します。
表示する表示領域とデータBeanの対を設定します。
上記処理のうち、2,3は必要最小限の処理です。1は、このアプリケーション特有の処理です。
このメソッド内では、行動予定を変更する課員が選択されたあとの処理を記述します。
選択された課員名をキーとして、startupの解説の1で読み込まれた表データから、選択された課員情報を取り出します。
どの課員が選択されたかは、ProfileBeanの中のComboBoxのインスタンスが保持しています。
取り出した課員情報を、UserScheduleBeanに設定します。
表示する表示領域とデータBeanの対を設定します。
このメソッド内では、変更した課員の行動予定を更新する時の処理を記述します。
UserScheduleBeanから更新されたデータを取得します。
表データを管理している内部変数に上書きします。
表データをファイルに保存します。
ScheduleBean のインスタンスを新たに生成します。
表示する表示領域とデータBeanの対を設定します。
次にアプリケーションクラスの拡張を行ないます。このクラスでは、行動予定表作成に必要なデータを保持します。赤字が追加した個所です。
BoardApplication.java
/* * BoardApplication.java * * Copyright (c) */ package board; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import com.fujitsu.uji.ApplicationProfile; /** * アプリケーションクラス * * @author * @version */ public class BoardApplication extends ApplicationProfile { //内部変数
private static String datafile = "DataManager.tmp"; //一覧表データが格納される
private String filepath = ""; //メインページのある絶対パス
protected DataManager dm; //データが入る /** * このクラスのコンストラクタです。 */ public BoardApplication(){ } /** * uji.methodリクエストパラメタによるメソッド指定を有効にするかどうか指定します。 * trueを返すとuji.methodリクエストパラメタを処理します。 * falseの場合uji.methodリクエストパラメタを無視します。 * @return trueの場合有効になります。falseの場合無視します。 */ public boolean isUjiMethodAvailable() { return false; } public DataManager loadData(){
if(dm==null){
this.dm = loadDataManager(new File(getPath(), datafile));
}
return this.dm;
}
public synchronized void saveData(DataManager data){
this.dm = data;
//更新ごとに最新データのセーブを行う
saveDataManager(this.dm, new File(getPath(), datafile));
}
public String getPath(){
return this.filepath;
}
public void setPath(String path){
this.filepath = path;
}
//シリアライズされた予定表データを元に戻すためのメソッド
private DataManager loadDataManager(File infile){
try{
FileInputStream fis = new FileInputStream(infile);
ObjectInputStream ois = new ObjectInputStream(fis);
return (DataManager)ois.readObject();
} catch(IOException ioe) {
//シリアライズされたファイルから読み込めない
DataManager dm = new DataManager();
return dm;
} catch (ClassNotFoundException cnex){
//ファイルは読み込めたが該当するクラスが無い場合
DataManager dm = new DataManager();
return dm;
}
}
//予定表データをシリアライズするためのメソッド
private synchronized void saveDataManager(DataManager dmr, File outfile){
try{
FileOutputStream fos = new FileOutputStream(outfile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dmr);
} catch (IOException ioe2 ){}
} }
これで、行動予定表アプリケーションに必要なソースコードが全部そろいました。