![]() ![]() ![]() ![]() |
この章では、Worklist User Portal で使用するためにカスタマイズされたタスク ユーザ インタフェースを作成する方法を説明します。Worklist は、デフォルトのタスク ユーザ インタフェース (ユーザ ポータルの [タスクの作業] ページに表示) を提供します。このユーザ インタフェースは、タスク プランのメタデータに基づいたフォームを動的に作成します。たとえば、デフォルトのタスク ユーザ インタフェースは、タスクの現在のユーザ インタフェースを確認してから、アクションの実行ページでどのアクションを使用できるようにするかを決定します。また、アクションに定義されているプロパティを確認してから、タスク アクションの完了ページにどのプロパティを表示するかを決定します。これにより、ユーザは、カスタム ユーザ インタフェースを開発せずに、Worklist での人間による操作のほとんどを実行できます。
ただし、特定のステップまたはタスク プラン全体のために、インタフェースをカスタマイズし、何を表示するかを制御する必要がある場合があります。Worklist を使用すると、ユーザは、特定のタスク プランに基づいたタスク用 (およびオプションでタスク プランの特定のステップ用) に、カスタマイズされたユーザ インタフェースを実現できます。これにより、カスタム ビジネス ロジック、外部システムなどを、タスク アクションの処理およびプロパティ設定に組み込めます。
カスタム タスク ユーザ インタフェースは、タスク プラン (またはそれらのプランのステップ) に基づいたタスクを表示したときに、Worklist が提供するデフォルトのタスク ユーザ インタフェースの代わりに使用されます。これらは、Worklist User Portal の [タスクの作業] ページに、デフォルトのタスク ユーザ インタフェースの代わりに表示されます。このように、デフォルトのタスク ユーザ インタフェースを細かく置き換えることで、必要な場所のみにカスタム タスク ユーザ インタフェースを指定し、その他の場所ではデフォルトのタスク ユーザ インタフェースを使用できます。
たとえば、融資責任者が、融資を承認または拒否する前に、顧客の信用度を確認する必要がある場合があるとします。カスタム タスク UI を使用すれば、ユーザ ポータルをカスタマイズして、融資責任者が詳細な情報に基づいた決断ができるようにするための情報を表示できます。
カスタマイズされたユーザ インタフェースの作成を始める前に、モデルを作成してページの外観を定義します。このチュートリアルでは、管理者審査 (Manager Review) ページおよび資産概要 (Asset Summary) ページ (図 7-1 および図 7-2 を参照) のモデル ページを作成します。
モデルができました。次の節に従って、ページ フローの定義に進みます。
カスタマイズされたユーザ インタフェースのページの外観を決定したら、次のように、これらのページのロジックおよび使用方法を定義します。
[関連付けられたパースペクティブを開きますか?] ダイアログ ボックスが表示されます。
@Jpf.Controller(nested = true, simpleActions = { @Jpf.SimpleAction(name = "begin", path = "index.jsp") })
@Jpf.Controller(nested = true)
public class ManagerReview extends com.bea.wli.worklist.TaskUIPageFlowController {
注意 : | この変更によって、「アクション "begin" が見つかりませんでした。」というコンパイル エラーが発生します。このエラーは、次の手順で解決します。コンパイル エラーは、IDE の下部にある [問題] ビューに表示されます。[問題] ビューが開いていることを確認してください。メニューから [問題] ビューを開くには、[ウィンドウ![]() ![]() |
2 つの Web ページのモデルを作成するために、フォーム Bean を定義する必要があります (「Web ページのモデルおよびフローの定義」を参照)。
[Manager Review] ペインの内部クラスとして、次の 3 つのフォーム Bean を作成します。
[Getter および Setter の生成] ダイアログ ボックスが表示されます。
@Jpf.FormBean
public static class ManagerReviewForm implements java.io.Serializable {
rivate static final long serialVersionUID = 746621147L;
private String _name;
private String _ssn;
private int _loanAmount;
private PropertyInstanceHolder _notesProp;
private String _collateralAssets;
public int getLoanAmount() { return _loanAmount; }
public void setLoanAmount(int loanAmount) { _loanAmount = loanAmount; }
public String getName() { return _name; }
public void setName(String name) { _name = name; }
public String getSsn() { return _ssn; }
public void setSsn(String ssn) { _ssn = ssn; }
public PropertyInstanceHolder getNotesProp() { return _notesProp; }
public void setNotesProp(PropertyInstanceHolder notesProp)
_notesProp = notesProp; }
public String getCollateralAssets() { return _collateralAssets; }
public void setCollateralAssets(String collateralAssets) {
_collateralAssets = collateralAssets; }
}
注意 : | serialVersionUID の値はさまざまです。この値は自動生成されるため、ここで表示されているものと異なる場合があります。 |
public java.util.SortedSet<AssetForm> getAssets() { return _assets; }
public int getCreditScore() { return _creditScore; }
@Jpf.FormBean
public static class AssetSummaryForm
implements java.io.Serializable {
private static final long serialVersionUID = 1517513921L;
private java.util.SortedSet<AssetForm> _assets;
private int _creditScore;
private String _name;
private String _ssn;
public AssetSummaryForm() {
_assets = new java.util.TreeSet<AssetForm>();
}
public String getName() { return _name; }
public void setName(String name) { _name = name; }
public String getSsn() { return _ssn; }
public void setSsn(String ssn) { _ssn = ssn; }
public java.util.SortedSet<AssetForm> getAssets() { return _assets; }
public int getCreditScore() { return _creditScore; }
}
注意 : | serialVersionUID の値はさまざまです。この値は自動生成されるため、ここで表示されているものと異なる場合があります。 |
AssetSummaryForm で、以下のコードを追加して、フォーム Bean が資産および信用度情報を読み込めるようにします。
この情報は、このチュートリアルの目的には十分な程度の、非常に単純化された方法 (プロパティ ファイル) で読み込まれます。実際のアプリケーションでは多くの場合、この情報は Java API または外部システムへの Web サービスという形で取得されます。
ページ フローのアクションの実装では、以下のコードに含まれている loadSummaryInfo メソッドを使用し、名前変数によって与えられたユーザの資産および信用度情報で、AssetSummaryForm オブジェクトを初期化します。
public void loadSummaryInfo(HttpSession session) {
loadCreditScore(session);
loadAssets(session);
}
public int getTotalActualAssetValue() {
int total = 0;
for (AssetForm asset: _assets) {
total = asset.getActualValue();
}
return total;
}
protected void loadCreditScore(HttpSession session) {
// プロパティとして信用度を読み込みます
String resourceName = "/creditRatings/creditRatings.properties";
java.util.Properties props =
loadProperties(resourceName, session);
_creditScore = getIntProperty(props, _name);
}
protected void loadAssets(HttpSession session) {
// プロパティとして資産を読み込みます
String resourceName = "/assets/" + _name + ".properties";
java.util.Properties props =
loadProperties(resourceName, session);
String assetList = props.getProperty("assetList");
if (assetList != null) {
java.util.StringTokenizer st = new java.util.StringTokenizer(assetList, ",");
while (st.hasMoreTokens()) {
String assetName = st.nextToken().trim();
AssetForm asset = new AssetForm();
asset.setName(assetName);
int value =
getIntProperty(props, assetName + "." + "value");
asset.setValue(value);
int amountOwed =
getIntProperty(props, assetName + "." + "amountOwed");
asset.setAmountOwed(amountOwed);
_assets.add(asset);
}
}
}
protected java.util.Properties
loadProperties(String resourceName, HttpSession session) {
// プロパティとしてリソースを読み込みます
java.io.InputStream is = null;
try {
is = session.getServletContext().
getResourceAsStream(resourceName);
java.util.Properties props = new java.util.Properties();
if (is != null) {
props.load(is);
}
return props;
} catch (Exception e) {
// TODO : 処理の改善
e.printStackTrace();
} finally {
if (is != null) {
try { is.close(); } catch (Exception e) { e.printStackTrace(); }
}
}
return new java.util.Properties();
}
private int getIntProperty(java.util.Properties props, String key) {
String value = props.getProperty(key);
if (value == null) {
return 0;
}
return Integer.valueOf(value);
}
上記の手順が完了すると、ページ フローに begin() メソッドがないというコンパイル エラーが表示されます。
@Jpf.FormBean
public static class AssetForm
implements java.io.Serializable, Comparable {
private static final long serialVersionUID = 1491696939L;
private String _name;
private int _value;
private int _amountOwed;
public int getAmountOwed() {
return _amountOwed;
}
public void setAmountOwed(int lienValue) {
_amountOwed = lienValue;
}
public String getName() {
return _name;
}
public void setName(String name) {
_name = name;
}
public int getValue() {
return _value;
}
public void setValue(int value) {
_value = value;
}
public int getActualValue() {
return _value - _amountOwed;
}
}
注意 : | serialVersionUID の値はさまざまです。この値は自動生成されるため、ここで表示されているものと異なる場合があります。 |
上記の手順が完了すると、AssetForm クラスが、継承した抽象メソッド Comparable.compareTo(Object)
を実装する必要があるというコンパイル エラーが表示されます。このエラーを解決するには、以下のメソッドをコピーして、AssetForm クラス内に貼り付けます。このコードにより、資産概要 Web ページで、個々の資産項目を合計の資産価値の降順に並べ替えることができるようになります。
public int compareTo(Object o) {
if (!(o instanceof AssetForm)) {
return 0;
}
AssetForm other = (AssetForm)o;
int otherActualValue = other._value - other._amountOwed;
return otherActualValue - getActualValue();
}
AssetForm クラスの最後に以下のメソッドを追加します。このメソッドは、後で定義する JSP ページから「実際の」資産価値を取得するために使用されます。
public int getActualValue() {
return _value - _amountOwed;
John Smith (このスペルおよび大/小文字表記を使用) という名前の人物の融資要求をサポートするための情報を、以下のように定義します。
[新規フォルダー] ダイアログ ボックスが表示されます (図 7-9 を参照)。
ページ フローでの、管理者審査ページと資産概要ページ間を移動するアクション、およびタスクでの承認アクションと拒否アクションを実行するアクションを定義します。ページ フローのアクションは、ページ フロー コントローラのメソッドです。このメソッドにより、UI が新しいページに進み、必要に応じて結果が計算され、進むページにフォーム Bean が渡されます。
フォーム Bean はアクションから Web ページに渡され、、ページの表示フィールドに値が設定されます。その後、処理のために Web ページがサーバに送信されたときに、Web ページ上のフィールドの値が収集され、フォーム Bean のプロパティに設定されます。
アクション メソッドは、フォーム Bean をアクション メソッドのパラメータとして定義することで、Web ページの送信ボタンをクリックして入力されたフォーム Bean を受け入れることができます。この例としては、以下の「承認」アクションを参照してください。アクション メソッドは、アクションが転送されているターゲットの Web ページに、フォーム Bean を渡すこともできます。これは、Forward オブジェクト (自身に設定されたフォーム Bean を持っている) を渡すことで実行されます。この例としては、以下の「show asset summary」アクションを参照してください。この例としては、以下の「承認」アクションを参照してください。
注意 : | 上記の 2 つのアクションは、互いに連携する関係にあります。このことは、周期的に 2 つのページを移動する目的を反映しています。 |
以下の、タスクでのユーザ アクションを処理するためのアクションを定義します。
以下では、新しいアクションを追加する方法について説明します。以下の手順およびページ フローのアクション ウィザードに従って、上記のすべてのアクションを追加できます (その後、「アクション メソッドの実装」で示されているアクション メソッド本体のコードをコピー/ペーストします)。または、以下の「アクション メソッドの実装」で示されているアクションの宣言およびアクション メソッドの完全なコードをそのままコピー アンド ペーストして、次の手順をすべて省略することもできます。
次に、先ほど定義したアクション メソッドの、メソッド本体を実装する必要があります。
すべてのアクション メソッドのコードを以下に示します。各アクション メソッドの @Jpf.Action アノテーションとともにアクション シグネチャをコピーしていることを確認してください。
上記の節で説明されている各アクション メソッドで、以下を行います。
アクション ウィザードを使用してアクション メソッドを作成しない場合は、以下を行う必要があります。
アクション ウィザードを使用してアクション メソッドを作成した場合は、以下を行う必要があります。
/**
* このコントローラを初期化し、スーパークラスのヘルパーを呼び出して、
* 取得した内容を初期化します。
* これには、タスク コンテキスト、タスクおよびアクションの標準のフォーム Bean、
* およびプロパティ編集サポートが含まれます。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name="success", path="GetManagerReview.jsp")
})
public Forward begin() throws Exception {
// 基本クラスのヘルパーを初期化して、
// このコントローラを通じて使用できるようにします。
beginActionHelper();
// ManagerReviewForm を作成して、基本クラスのヘルパーによって
// 取得されるプロパティ値とともに読み込みます
_managerReviewForm = new ManagerReviewForm();
_managerReviewForm.setName(
(String)getTaskPropertiesMap().
get("Name").getValue());
_managerReviewForm.setSsn(
(String)getTaskPropertiesMap().
get("SSN").getValue());
_managerReviewForm.setLoanAmount(
((Long)getTaskPropertiesMap().
get("LoanAmt").getValue()).intValue());
// 編集可能な notes プロパティを取得します。
// この PropertyInstanceHolder を使用して、Worklist で提供される
// ヘルパーを介して notes プロパティを編集するためです。
com.bea.wli.worklist.portal.PropertyInstanceHolder notesProp =
getTaskEditablePropertiesMap().
get("Notes");
_managerReviewForm.setNotesProp(notesProp);
return new Forward("success", _managerReviewForm);
}
/**
* 資産のサブ フォームに進み、
* 検出した融資申し込み者の資産を表示します。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
path = "AssetSummary.jsp")
}, useFormBean = "_managerReviewForm"
)
public Forward viewAssetSummaryAction(ManagerReviewForm form) {
AssetSummaryForm assetSummaryForm = new AssetSummaryForm();
assetSummaryForm.setName(form.getName());
assetSummaryForm.setSsn(form.getSsn());
assetSummaryForm.loadSummaryInfo(getSession());
return new Forward("success", assetSummaryForm);
}
/**
* 資産を確認した後で、メイン フォームに戻ります。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
path = "GetManagerReview.jsp")
})
public Forward returnToManagerReviewAction(AssetSummaryForm form) {
Forward forward = new Forward("success", _managerReviewForm);
return forward;
}
/**
* スーパークラスのヘルパーおよび ManagerReviewForm に
* 格納しているプロパティを使用して、融資を承認します。
* useFormBean 属性を指定して、ManagerReviewForm のコピーを
* 1 つ保持します。
* 注意 : このアクションは、(メイン フォームにフィールドを
* 直接置く代わりに) アクション プロパティ ページに進み、
* アクションのプロパティを収集するように設計されています。
* 別のページが必要な場合は、showStepActionActionHelper を呼び出して、
* TakeStepActionActionForm がこれらのプロパティを取得できるように
* することができます。このフォームは、アクション プロパティ フォームで
* propertyEditor タグとともに使用するのに適しています。
* @see TaskUIPageFlowController#showStepActionActionHelper(com.bea.wli.worklist.api.taskplan.StepAction)
* @see TaskUIPageFlowController#takeStepActionActionHelper(com.bea.wli.worklist. portal.TakeStepActionActionForm)
* @see TaskUIPageFlowController#isPostActionInteractiveAssignment(java.lang.String)
* @see TaskUIPageFlowController#takeStepActionAndClaimActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm, java.lang.String)
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean="_managerReviewForm")
public Forward approveLoanAction(ManagerReviewForm form)
throws Exception {
// アクションに渡すプロパティ値のマップを構築します
java.util.Map<String, String> propMap
= new java.util.HashMap<String, String>();
propMap.put("Notes", form.getNotesProp().getEditorValueAsString());
propMap.put("CollateralAssets", form.getCollateralAssets());
// ここで、アクションを実行します。
this.takeStepAction(getCurrentStep().getName(),
"Approve",
propMap);
Forward forward = new Forward("success");
return forward;
}
/**
* スーパークラスのヘルパーを使用して、融資を拒否します。
* useFormBean 属性を指定して、ManagerReviewForm のコピーを
* 1 つ保持します。
* 注意 : このアクションは、(メイン フォームにフィールドを
* 直接置く代わりに) アクション プロパティ ページに進み、
* アクションのプロパティを収集するように設計されています。
* 別のページが必要な場合は、showStepActionActionHelper を呼び出して、
* TakeStepActionActionForm がこれらのプロパティを取得できるように
* することができます。このフォームは、アクション プロパティ フォームで
* propertyEditor タグとともに使用するのに適しています。
* @see TaskUIPageFlowController#showStepActionActionHelper(com.bea.wli.worklist.api.taskplan.StepAction)
* @see TaskUIPageFlowController#takeStepActionActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm)
* @see TaskUIPageFlowController#isPostActionInteractiveAssignment(java.lang.String)
* @see TaskUIPageFlowController#takeStepActionAndClaimActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm, java.lang.String)
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean="_managerReviewForm")
public Forward rejectLoanAction(ManagerReviewForm form)
throws Exception {
// アクションに渡すプロパティ値のマップを構築します
java.util.Map<String, String> propMap
= new java.util.HashMap<String, String>();
propMap.put("Notes", form.getNotesProp().getEditorValueAsString());
// ここで、アクションを実行します。
this.takeStepAction(getCurrentStep().getName(),
"Reject",
propMap);
Forward forward = new Forward("success");
return forward;
}
アクション メソッドは、フォーム Bean を受け入れ、フォーム Bean を使用してページに転送できます。Web フォームを送信するとき、および送信に関連付けられているアクションを呼び出しているときに、デフォルトでは、NetUI フレームワークが (フォーム Bean クラスの、引数を持たないパブリックコンストラクタを使用して) 新しいフォーム Bean インスタンスを作成します。その後、この新しい Bean インスタンスに、Java Reflection を介して、送信された Web ページ フォームのデータ バインディング タグからのデータが入力されます。
このプロセスには、いくつかの制限があります。たとえば、Web ページの JSP タグに示されない、一時的な非表示の情報がフォーム Bean に含まれている場合、アクション メソッドに実際に渡されるフォーム Bean (NetUI フレームワークによって作成された Bean) はこの情報を見つけられません。
アクション メソッドが呼び出されるたびに、新しい Bean の作成によるオーバーヘッドや動作上の問題が発生しないように、アクション メソッドの @Jpf.Action
アノテーションに useFormBean フィールドを指定できます。これにより、コントローラが、ページ フロー コントローラの状態フォーム Bean の 1 つのコピーを保持できるようになり、アクション メソッドは、新しいフォーム Bean オブジェクトを作成せずに、その状態からオブジェクトを取得できるようになります。
前の節で示されているアクション メソッドのコードで、useFormBean 機能を利用します。このコードを機能させるには、ページ フロー コントローラでメンバー変数を定義して、後で渡すフォーム Bean を保持する必要があります。
ManagerReview クラスの最上部に、次のメンバー関数を追加します。
private ManagerReviewForm _managerReviewForm; // 要求間でフォームを保持するため
ManagerReviewForm パラメータを取得するアクション メソッドが、@Jpf.Action アノテーションに useFormBean 属性を指定していない場合は、指定します。たとえば、rejectLoanAction の @Jpf.Action アノテーションは、以下のようになっています。
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean = "_managerReviewForm")
追加する必要のあるテキストは、上記のコードの強調表示されている部分です。
ワークリストには、カスタム タスク UI のプロパティを編集するための組み込みサポートが用意されています。この組み込みサポートには、JSP タグ、デフォルトのエディタ、および基本の TaskUIPageFlowController のヘルパー メソッドがあります。これらの機能により、用意された UI を使用して次のタイプのプロパティを容易に編集できます。
さらに、プロパティ エディタ機能により、上記の複雑な型で、スタンドアロン エディタだけでなく、インライン エディタ (簡単なフォーム フィールド) も使用してプロパティの編集が容易にサポートできるようになります。この機能によって、面倒なプロパティの編集が非常に容易になります。このチュートリアルで定義される管理者審査 Web ページは、Notes と CollateralAssets の 2 つのプロパティを編集します。Worklist のプロパティ エディタ機能を使用して Notes プロパティを編集し、簡単な NetUI データ バインディング タグを使用して、CollateralAssets プロパティを編集します。
このチュートリアルでのプロパティ エディタ機能の使用には、複数の構成要素があります。
タスクのユーザ プロパティ エディタを処理するための以下のアクションを定義します。
「ページ フローでのアクションの定義」の節で説明されている、アクションの追加手順を使用して、表 7-2 で示されている以下のアクションを追加します。
注意 : | com.bea.wli.datatype.EditorValueHolder を追加する場合は、フォーム Bean の入力フィールドの横にある [追加] ボタンをクリックする必要があります。これにより、検索ウィンドウが開きます。EditorValueHolder と入力すると、このクラスが検索されます。エントリをクリックして、[OK] を押します。 |
上記の 3 つのアクションに対する以下のコードを、ManagerReview ページ フロー コントローラに挿入します。
private transient com.bea.wli.datatype.EditorValueHolder _editorValue; // 効率化のため
/**
* このアクションは、GetManagerReview.jsp および Worklist の
* propertyEditor タグからの「スタンドアロン エディタの起動」
* 呼び出しを処理します。(editPropActionHelper を介して) スタンドアロン
* エディタの URI を算出し、その URI に進みます。このエディタは
* ネストされたページ フローであり、既知のアクションである
* okPropAction と cancelPropAction を介してこのコントローラ (呼び出し元)
* に戻ります。ManagerReviewForm フォーム Bean を渡して、
* この呼び出しで再作成されないようにします。
*/
@Jpf.Action(useFormBean="_managerReviewForm")
public Forward editNotesPropAction(ManagerReviewForm form)
throws com.bea.wli.worklist.api.ManagementException,
com.bea.wli.datatype.DataTypeException {
// スーパークラスから編集可能なプロパティを取得
// します。これらは、スーパークラスに含まれる
// UpdateActionForm からも取得できます。
// UpdateActionForm は、スーパークラスによって管理され、
// タスク (PropertyInstanceHolder として示される) の
// 編集可能なプロパティを含んでいます。
// 汎用タスク UI は、UpdateActionForm を使用できます。
// 単にメイン ページのフォーム Bean として使用できます。
com.bea.wli.worklist.portal.PropertyInstanceHolder[] properties =
getTaskEditablePropertiesMap().
values().toArray(new com.bea.wli.worklist.portal.PropertyInstanceHolder[0]);
// 注意 : ここで、propertyEditor タグの属性 (hostPage など) を
// 格納できます。
// これにより、編集が (okPropAction を介して) 完了
// または (cancelPropAction を介して) 中断した場合に、
// 適切なページに戻ることができます。
// これは、JSP ページで選択したプロパティの編集を
// 開始します (また、このメソッドで、
// 受信する HTTP 要求に名前が設定されます)。
Forward forward = editPropActionHelper(properties);
return forward;
}
/**
* [OK] をクリックして編集を適用すると、(editNotesPropAction で転送された)
* スタンドアロン エディタがこのアクションに戻ります。
* スタンドアロンのエディタは、エディタで作成/編集された値を保持する
EditorValueHolder を渡して、このアクションに戻ります。
* この _editorValue を、useFormBean に渡すことで、
* 大きくなる可能性のあるフォーム Bean のコピーの作成を回避します。
*/
@Jpf.Action(loginRequired = true,
forwards = {
@Jpf.Forward(name = "backToManagerReview",
path = "GetManagerReview.jsp")
},
useFormBean = "_editorValue")
protected Forward okPropAction(com.bea.wli.datatype.EditorValueHolder value)
throws Exception {
okPropActionHelper(value);
return new Forward("backToManagerReview", _managerReviewForm);
}
/**
* エディタで、ユーザが [取り消し] をクリックした場合に、
* (editNotesPropAction で起動された) スタンドアロン エディタが
* 呼び出すアクションです。
* @return
* @throws Exception
*/
@Jpf.Action(loginRequired = true,
forwards = {
@Jpf.Forward(name = "backToManagerReview",
path = "GetManagerReview.jsp")
})
protected Forward cancelPropAction()
throws Exception {
cancelPropActionHelper();
return new Forward("backToManagerReview", _managerReviewForm);
}
上記の手順を完了すると、ページ フローのコードは以下のようになります。
package manager;
import javax.servlet.http.HttpSession;
import org.apache.beehive.netui.pageflow.Forward;
import org.apache.beehive.netui.pageflow.annotations.Jpf;
import com.bea.wli.worklist.portal.PropertyInstanceHolder;
import com.bea.wli.worklist.portal.TaskUIPageFlowController;
@Jpf.Controller(nested = true)
public class ManagerReview extends TaskUIPageFlowController {
private static final long serialVersionUID = -1579985639L;
private ManagerReviewForm _managerReviewForm; // 要求間でフォームを保持するため。
@Jpf.Action(forwards = { @Jpf.Forward(name = "done", returnAction = "managerDone") })
protected Forward done() {
return new Forward("done");
}
/**
* このコントローラを初期化し、スーパークラスのヘルパーを呼び出して、
* 取得した内容を初期化します。
* これには、タスク コンテキスト、タスクおよびアクションの標準のフォーム Bean、
* およびプロパティ編集サポートが含まれます。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name="success", path="GetManagerReview.jsp")
})
public Forward begin() throws Exception {
// 基本クラスのヘルパーを初期化して、
// このコントローラを通じて使用できるようにします。
beginActionHelper();
// ManagerReviewForm を作成して、基本クラスのヘルパーによって
// 取得されるプロパティ値とともに読み込みます
_managerReviewForm = new ManagerReviewForm();
_managerReviewForm.setName(
(String)getTaskPropertiesMap().
get("Name").getValue());
_managerReviewForm.setSsn(
(String)getTaskPropertiesMap().
get("SSN").getValue());
_managerReviewForm.setLoanAmount(
((Long)getTaskPropertiesMap().
get("LoanAmt").getValue()).intValue());
// 編集可能な notes プロパティを取得します。
// この PropertyInstanceHolder を使用して、Worklist で提供される
// ヘルパーを介して notes プロパティを編集するためです。
PropertyInstanceHolder notesProp =
getTaskEditablePropertiesMap().
get("Notes");
_managerReviewForm.setNotesProp(notesProp);
return new Forward("success", _managerReviewForm);
}
/**
* 資産のサブ フォームに進み、
* 検出した融資申し込み者の資産を表示します。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
path = "AssetSummary.jsp")
}, useFormBean = "_managerReviewForm"
)
public Forward viewAssetSummaryAction(ManagerReviewForm form) {
AssetSummaryForm assetSummaryForm = new AssetSummaryForm();
assetSummaryForm.setName(form.getName());
assetSummaryForm.setSsn(form.getSsn());
assetSummaryForm.loadSummaryInfo(getSession());
return new Forward("success", assetSummaryForm);
}
/**
* 資産を確認した後で、メイン フォームに戻ります。
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
path = "GetManagerReview.jsp")
})
public Forward returnToManagerReviewAction(AssetSummaryForm form) {
Forward forward = new Forward("success", _managerReviewForm);
return forward;
}
/**
* スーパークラスのヘルパーおよび ManagerReviewForm に
* 格納しているプロパティを使用して、融資を承認します。
* useFormBean 属性を指定して、ManagerReviewForm のコピーを
* 1 つ保持します。
* 注意 : このアクションは、(メイン フォームにフィールドを
* 直接置く代わりに) アクション プロパティ ページに進み、
* アクションのプロパティを収集するように設計されています。
* 別のページが必要な場合は、showStepActionActionHelper を呼び出して、
* TakeStepActionActionForm がこれらのプロパティを取得できるように
* することができます。このフォームは、アクション プロパティ フォームで
* propertyEditor タグとともに使用するのに適しています。
* @see TaskUIPageFlowController#showStepActionActionHelper(com.bea.wli.worklist.api.tasktype.StepAction)
* @see TaskUIPageFlowController#takeStepActionActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm)
* @see TaskUIPageFlowController#isPostActionInteractiveAssignment(java.lang.String)
* @see TaskUIPageFlowController#takeStepActionAndClaimActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm, java.lang.String)
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean="_managerReviewForm")
public Forward approveLoanAction(ManagerReviewForm form)
throws Exception {
// アクションに渡すプロパティ値のマップを構築します
java.util.Map<String, String> propMap
= new java.util.HashMap<String, String>();
propMap.put("Notes", form.getNotesProp().getEditorValueAsString());
propMap.put("CollateralAssets", form.getCollateralAssets());
// ここで、アクションを実行します。
this.takeStepAction(getCurrentStep().getName(),
"Approve",
propMap);
Forward forward = new Forward("success");
return forward;
}
/**
* スーパークラスのヘルパーを使用して、融資を拒否します。
* useFormBean 属性を指定して、ManagerReviewForm のコピーを
* 1 つ保持します。
* 注意 : このアクションは、(メイン フォームにフィールドを
* 直接置く代わりに) アクション プロパティ ページに進み、
* アクションのプロパティを収集するように設計されています。
* 別のページが必要な場合は、showStepActionActionHelper を呼び出して、
* TakeStepActionActionForm がこれらのプロパティを取得できるように
* することができます。このフォームは、アクション プロパティ フォームで
* propertyEditor タグとともに使用するのに適しています。
* @see TaskUIPageFlowController#showStepActionActionHelper(com.bea.wli.worklist.api.tasktype.StepAction)
* @see TaskUIPageFlowController#takeStepActionActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm)
* @see TaskUIPageFlowController#isPostActionInteractiveAssignment(java.lang.String)
* @see TaskUIPageFlowController#takeStepActionAndClaimActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm, java.lang.String)
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean="_managerReviewForm")
public Forward rejectLoanAction(ManagerReviewForm form)
throws Exception {
// アクションに渡すプロパティ値のマップを構築します
java.util.Map<String, String> propMap
= new java.util.HashMap<String, String>();
propMap.put("Notes", form.getNotesProp().getEditorValueAsString());
// ここで、アクションを実行します。
this.takeStepAction(getCurrentStep().getName(),
"Reject",
propMap);
Forward forward = new Forward("success");
return forward;
}
/**
* このコントローラのインスタンスが作成されたときに呼び出されるコールバックです。
*/
@Override
protected void onCreate() {
}
/**
* このコントローラのインスタンスが破棄されたときに呼び出されるコールバックです。
*/
@Override
protected void onDestroy(HttpSession session) {
}
private transient com.bea.wli.datatype.EditorValueHolder _editorValue; // 効率化のため
/**
* このアクションは、GetManagerReview.jsp および Worklist の
* propertyEditor タグからの「スタンドアロン エディタの起動」
* 呼び出しを処理します。(editPropActionHelper を介して) スタンドアロン
* エディタの URI を算出し、その URI に進みます。このエディタは
* ネストされたページ フローであり、既知のアクションである
* okPropAction と cancelPropAction を介してこのコントローラ (呼び出し元)
* に戻ります。ManagerReviewForm フォーム Bean を渡して、
* この呼び出しで再作成されないようにします。
*/
@Jpf.Action(useFormBean="_managerReviewForm")
public Forward editNotesPropAction(ManagerReviewForm form)
throws com.bea.wli.worklist.api.ManagementException,
com.bea.wli.datatype.DataTypeException {
// スーパークラスから編集可能なプロパティを取得
// します。これらは、スーパークラスに含まれる
// UpdateActionForm からも取得できます。
// UpdateActionForm は、スーパークラスによって管理され、
// タスク (PropertyInstanceHolder として示される) の
// 編集可能なプロパティを含んでいます。
// 汎用タスク UI は、UpdateActionForm を使用できます。
* 別のページが必要な場合は、showStepActionActionHelper を呼び出して、
* TakeStepActionActionForm がこれらのプロパティを取得できるように
* することができます。このフォームは、アクション プロパティ フォームで
* propertyEditor タグとともに使用するのに適しています。
* @see TaskUIPageFlowController#showStepActionActionHelper(com.bea.wli.worklist.api.tasktype.StepAction)
* @see TaskUIPageFlowController#takeStepActionActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm)
* @see TaskUIPageFlowController#isPostActionInteractiveAssignment(java.lang.String)
* @see TaskUIPageFlowController#takeStepActionAndClaimActionHelper(com.bea.wli.worklist.portal.TakeStepActionActionForm, java.lang.String)
*/
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
action = "stepDoneAction")
}, useFormBean="_managerReviewForm")
public Forward rejectLoanAction(ManagerReviewForm form)
throws Exception {
// アクションに渡すプロパティ値のマップを構築します
java.util.Map<String, String> propMap
= new java.util.HashMap<String, String>();
propMap.put("Notes", form.getNotesProp().getEditorValueAsString());
// ここで、アクションを実行します。
this.takeStepAction(getCurrentStep().getName(),
"Reject",
propMap);
Forward forward = new Forward("success");
return forward;
}
/**
* このコントローラのインスタンスが作成されたときに呼び出されるコールバックです。
*/
@Override
protected void onCreate() {
}
/**
* このコントローラのインスタンスが破棄されたときに呼び出されるコールバックです。
*/
@Override
protected void onDestroy(HttpSession session) {
}
private transient com.bea.wli.datatype.EditorValueHolder _editorValue; // 効率化のため
/**
* このアクションは、GetManagerReview.jsp および Worklist の
* propertyEditor タグからの「スタンドアロン エディタの起動」
* 呼び出しを処理します。(editPropActionHelper を介して) スタンドアロン
* エディタの URI を算出し、その URI に進みます。このエディタは
* ネストされたページ フローであり、既知のアクションである
* okPropAction と cancelPropAction を介してこのコントローラ (呼び出し元)
* に戻ります。ManagerReviewForm フォーム Bean を渡して、
* この呼び出しで再作成されないようにします。
*/
@Jpf.Action(useFormBean="_managerReviewForm")
public Forward editNotesPropAction(ManagerReviewForm form)
throws com.bea.wli.worklist.api.ManagementException,
com.bea.wli.datatype.DataTypeException {
// スーパークラスから編集可能なプロパティを取得
// します。これらは、スーパークラスに含まれる
// UpdateActionForm からも取得できます。
// UpdateActionForm は、スーパークラスによって管理され、
// タスク (PropertyInstanceHolder として示される) の
// 編集可能なプロパティを含んでいます。
// 汎用タスク UI は、UpdateActionForm を使用できます。
public String getSsn() { return _ssn; }
public void setSsn(String ssn) { _ssn = ssn; }
public PropertyInstanceHolder getNotesProp()
{ return _notesProp; }
public void setNotesProp(PropertyInstanceHolder notesProp)
{ _notesProp = notesProp; }
public String getCollateralAssets() { return _collateralAssets; }
public void setCollateralAssets(String collateralAssets) {
_collateralAssets = collateralAssets; }
}
@Jpf.FormBean
public static class AssetSummaryForm implements java.io.Serializable {
private static final long serialVersionUID = 1517513921L;
private java.util.SortedSet<AssetForm> _assets;
private int _creditScore;
private String _name;
private String _ssn;
public AssetSummaryForm() {
_assets = new java.util.TreeSet<AssetForm>();
}
public String getName() { return _name; }
public void setName(String name) { _name = name; }
public String getSsn() { return _ssn; }
public void setSsn(String ssn) { _ssn = ssn; }
public java.util.SortedSet<AssetForm> getAssets() { return _assets; }
// 注意 : assets プロパティのセッターがありません。内部でこれを読み込みます。
public int getCreditScore() { return _creditScore; }
// 注意 : creditScore のセッターがありません。内部でこれを読み込みます。
public void loadSummaryInfo(HttpSession session) {
loadCreditScore(session);
loadAssets(session);
}
public int getTotalActualAssetValue() {
int total = 0;
for (AssetForm asset: _assets) {
total = asset.getActualValue();
}
return total;
}
protected void loadCreditScore(HttpSession session) {
// プロパティとして信用度を読み込みます
String resourceName = "/creditRatings/creditRatings.properties";
java.util.Properties props =
loadProperties(resourceName, session);
_creditScore = getIntProperty(props, _name);
}
protected void loadAssets(HttpSession session) {
// プロパティとして資産を読み込みます
String resourceName = "/assets/" + _name + ".properties";
java.util.Properties props =
loadProperties(resourceName, session);
String assetList = props.getProperty("assetList");
if (assetList != null) {
java.util.StringTokenizer st = new java.util.StringTokenizer(assetList, ",");
while (st.hasMoreTokens()) {
String assetName = st.nextToken().trim();
AssetForm asset = new AssetForm();
asset.setName(assetName);
int value =
getIntProperty(props, assetName + "." + "value");
asset.setValue(value);
int amountOwed =
getIntProperty(props, assetName + "." + "amountOwed");
asset.setAmountOwed(amountOwed);
_assets.add(asset);
}
}
}
protected java.util.Properties
loadProperties(String resourceName, HttpSession session) {
// プロパティとしてリソースを読み込みます
java.io.InputStream is = null;
try {
is = session.getServletContext().
getResourceAsStream(resourceName);
java.util.Properties props = new java.util.Properties();
if (is != null) {
props.load(is);
}
return props;
} catch (Exception e) {
// TODO : 処理の改善
e.printStackTrace();
} finally {
if (is != null) {
try { is.close(); } catch (Exception e) { e.printStackTrace(); }
}
}
return new java.util.Properties();
}
private int getIntProperty(java.util.Properties props, String key) {
String value = props.getProperty(key);
if (value == null) {
return 0;
}
return Integer.valueOf(value);
}
}
@Jpf.FormBean
public static class AssetForm implements java.io.Serializable, Comparable {
private static final long serialVersionUID = 1491696939L;
private String _name;
private int _value;
private int _amountOwed;
public int getAmountOwed() {
return _amountOwed;
}
public void setAmountOwed(int lienValue) {
_amountOwed = lienValue;
}
public String getName() {
return _name;
}
public void setName(String name) {
_name = name;
}
public int getValue() {
return _value;
}
public void setValue(int value) {
_value = value;
}
public int getActualValue() {
return _value - _amountOwed;
}
public int compareTo(Object o) {
if (!(o instanceof AssetForm)) {
return 0;
}
AssetForm other = (AssetForm)o;
int otherActualValue = other._value - other._amountOwed;
return otherActualValue - getActualValue();
}
}
}
「Web ページのモデルおよびフローの定義」の画面モデルに従って、Beehive NetUI データ バインディング JSP タグを使用し、カスタム タスク UI の 2 つの JSP ページを定義して、フォーム Bean からの読み込みおよびフォーム Bean への書き込みができる Web フォームを表示します。これらのタグを使用することで、データ駆動型の JSP ページを記述するプロセスが大幅に簡素化されます。
Workshop のページ フロー パースペクティブは、適切なページを定義する場合に最初に使用します。ManagerReview ページ フロー コントローラには、これまでの節で定義したアクションによって、[ページ フロー エクスプローラ] の [ページ] ノードの下に、グレー表示された 2 つの JSP ページが表示されています。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<p>Beehive NetUI JavaServer Page - ${pageContext.request.requestURI}</p>
</netui:body>
</netui:html>
<netui:body/>
タグの間にフォームの適切なテキストを挿入して、これらのページを完成します。HTML の<table>
タグを使用して、これらのフォーム フィールドを整理および調整することをお勧めします。
JSP から以下のコードを削除します。
<p>Beehive NetUI JavaServer Page - ${pageContext.request.requestURI}</p>
この手順では、すべての JSP のデータ項目を保持する <netui:form>
要素を作成し、その後で、ManagerReview ページ フロー コントローラから、そのフォームをアクションに関連付けます。これにより、フォームが、アクション メソッドで参照されているフォーム Bean に関連付けられます。この関連付けにより、フォーム Bean のデータが、JSP フォームに追加するデータ項目とバインドされます。
NetUI フォームを JSP に追加するための一般的なプロセスは以下のとおりです。
[JSP デザイン パレット] が表示されます (図 7-11 を参照)。
<netui:body/>
タグ内にドロップします。
ドロップすると、<netui:form action=""></netui:form>
のように form 要素が追加されます。
ページ フロー コントローラのアクションにフォームを関連付けます。このチュートリアルでは、パラメータとしてフォーム Bean を取得する ManagerReview ページ フロー コントローラのアクションと form 要素を関連付けます。フォームが送信されたときに呼び出されるアクション メソッドと、フォームと関連付けるフォーム Bean の Java 型を定義するため、この関連付けは非常に重要です。関連付けられたフォーム Bean は、JSP コードの NetUI タグから、それらのタグの値と dataSource 属性を使用してアクセスできるようになります。これらの属性は、以下のように JSP 式を介してフォーム Bean のプロパティを参照します。
actionForm.<フォーム Bean のプロパティ>
フォーム Bean は、フォームのメソッドのペアを定義します。
<プロパティの Java タイプ> get<プロパティ名>()
void set<プロパティ名>(<プロパティの Java タイプ> value)
actionForm.<property> -> Call method ManagerReviewForm.get<property>
これらのすべてのアクションは、ManagerReviewForm インスタンスを含む Forward を返す必要があります。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="approveLoanAction"></netui:form>
</netui:body>
</netui:html>
<netui:form> を作成して、そのフォームのアクションを returnToManagerReviewAction に設定します。returnToManagerReviewAction は以下のように記述してください。
@Jpf.Action(forwards = {
@Jpf.Forward(name = "success",
path = "GetManagerReview.jsp"),
@Jpf.Forward(name = "success2",
path = "GetManagerReview2.jsp")
})
public Forward returnToManagerReviewAction(AssetSummaryForm form) {
Forward forward = new Forward("success", _managerReviewForm);
return forward;
}
次のように、returnToManagerReviewAction が、AssetSummaryForm 型のフォーム Bean パラメータを取得することで、AssetSummary.jsp の form タグ内のみで関連付けが行われます。
actionForm.<property> -> Call method AssetSummaryForm.get<property>
この呼び出しを行うために使用される ManagerReviewForm のインスタンスは、このページに転送した Forward オブジェクトで渡されたインスタンスです。ManagerReview.java のページ フロー コードでは、これらのアクションにより AssetSummary.jsp に転送されます。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="returnToManagerReviewAction"></netui:form>
</netui:body>
</netui:html>
NetUI データ バインディング JSP タグは、JSP ページに表示するデータをフォーム Bean から取得し、<netui:form>
を送信することによって、フォーム Bean にデータを設定するために必要な作業を自動化します。すべての NetUI データ バインディング タグは、それらをフォーム Bean のプロパティと関連付ける属性を持っています。一部のタグ (<netui:label>
など) では、属性には「value」という名前が付いています。その他のタグ (<netui-data:repeater>
など) では、属性には「dataSource」という名前が付いています。これらの属性は、プロパティ式の定義に異なる構文を使用します。属性が dataSource の場合、構文は次のようになります。
属性が、その他のもの (<netui:label> の値など) の場合、構文は次のようになります。
以下の JSP コードで、プロパティを ManagerReviewForm から JSP ページにバインドするために、actionForm 参照を使用します。これは、JSP Designer パレットから JSP コードに、該当するタグをドラッグ アンド ドロップすることで行えます。一部のタグは NetUI メニューに、その他のタグ (repeater など) は NetUI-Data メニューにあります。次の節で、JSP ファイルの最終コードを示します。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="approveLoanAction">
<table>
<tr>
<td><netui:label value="Customer Name:"/></td>
<td><netui:label value="${actionForm.name}"/></td>
</tr>
<tr>
<td><netui:label value="SSN:"/></td>
<td><netui:label value="${actionForm.ssn}"/></td>
</tr>
<tr>
<td><netui:label value="Loan Amount:"/></td>
<td><netui:label value="${actionForm.loanAmount}"/></td>
</tr>
<tr>
<td colspan="2">
<!-- 従来の NetUI actionForm バインディングを使用して、
このプロパティを編集します (netui:textBox タグ
に注意してください) -->
<netui:label value="Collateral Assets:"/>
<netui:textBox dataSource="actionForm.collateralAssets"/>
</td>
</tr>
</table>
</netui:form>
</netui:body>
</netui:html>
Notes プロパティを処理するためのタグがありません。Worklist によって提供されるプロパティ編集のフレームワークを利用できるようにするために、propertyEditor と呼ばれる Worklist のカスタム タグを使用するため、ここでは、Notes プロパティを個別に扱います。上記の table 内の最後の <tr> 要素 (プロパティ要素 CollateralAssets を持っているもの) の前に以下のコードを挿入してください。
<tr>
<td colspan="2">
<!-- これは、propertyEditor タグの使用方法を示します。
また、ラベル、合計値、およびスタンドアロン エディタが
使用できる場合は、スタンドアロン エディタへのリンクを
示します。このタグは、インプレースでのプロパティ値の編集も
可能にします。
注意 : プロパティの編集後に
このページに戻るように、
hostPage 属性を設定します。
注意 : actionName attr 属性で取得した名前を持つ
コントローラで定義されたアクションが必要です。
-->
<netui:label value="Reason for Action:"/>
<worklist:propertyEditor dataSource="actionForm.notesProp"
propName="Notes"
readOnly="false"
hostPage="GetManagerReview.jsp"
actionName="editNotesPropAction"/>
</td>
</tr>
<worklist:propertyEditor> タグ参照を有効にするには、Worklist のプレフィックスを定義して、Worklist タグの正確な URI にマップする必要があります。以下を、JSP ファイル最上部の taglib 宣言の最後に追加してください。
<%@taglib uri="http://bea.com/wli/worklist/tags-worklist-1.0" prefix="worklist"%>
propertyEditor タグは、型 PropertyInstanceHolder である actionForm.notesProp にバインドされています。このバインディングにより、propertyEditor タグは、プロパティの編集可能なプロパティ値の取得、プロパティの型の判断、その型の登録されているスタンドアロン エディタの検出、およびスタンドアロン エディタへの値の受け渡しができるようになります。
注意 : | propertyEditor タグは、editNotesPropAction を参照します。このアクションは、プロパティ用にスタンドアロン エディタを起動したときに呼び出されます。ここでは明示していませんが、ManagerReview ページ フロー コントローラのコードにも、[OK] および [取り消し] ボタンがクリックされた場合に、スタンドアロン エディタが呼び出しページ フローに戻れるようにする、2 つの「return」アクション メソッドが含まれています。これらのアクションは、それぞれ、okPropAction、cancelPropAction です。 |
Asset Summary.jsp の最終コードを以下に示します。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="returnToManagerReviewAction">
<table>
<tr>
<td colspan="2"><netui:label value="Assets for ${actionForm.name}"/></td>
</tr>
<tr>
<netui-data:repeater dataSource="actionForm.assets">
<netui-data:repeaterHeader>
<table border="1">
<tr>
<td>Name</td>
<td>Value</td>
<td>Amount Owed</td>
<td>Actual Value</td>
</tr>
</netui-data:repeaterHeader>
<netui-data:repeaterItem>
<tr>
<td><netui:label value="${container.item.name}"/></td>
<td><netui:label value="${container.item.value}"/></td>
<td><netui:label value="${container.item.amountOwed}"/></td>
<td><netui:label value="${container.item.actualValue}"/></td>
</tr>
</netui-data:repeaterItem>
<netui-data:repeaterFooter>
</table>
</netui-data:repeaterFooter>
</netui-data:repeater>
</tr>
<tr>
<td><netui:label value="Credit Score:"/></td>
<td><netui:label value="${actionForm.creditScore}"/></td>
</tr>
</table>
</netui:form>
</netui:body>
</netui:html>
フォーム間の移動およびそれらが示すタスクでのアクションの実行のための <netui:button> 要素を追加します。
<worklist:propertyEditor> タグを含んでいる <tr> 要素の前/上側に、以下のコードを挿入します。このコードは、GetManagerReview ページにアクション ボタンを表示します。このボタンは、クリックされると、viewAssetSummary アクションを呼び出し、ユーザを AssetSummary ページに転送します。
<tr>
<td colspan="2">
<netui:button value="View Asset Summary"
action="viewAssetSummaryAction"/>
</td>
</tr>
次に、最後の </table> タグの前に、以下のコードを挿入します。
<tr>
<td colspan="2">
<netui:button value="Approve" action="approveLoanAction"/>
<p/>
<netui:button value="Reject" action="rejectLoanAction"/>
</td>
</tr>
これは、融資責任者が、タスクで (ページ フローの approveLoanAction および rejectLoanAction アクション メソッドを介して) 承認アクションおよび拒否アクションを実行できるようにするためのボタンを表示します。
最後の table タグ (</table>) の前に、以下のコードを挿入します。
<td colspan="2"><netui:button value="Back"/>
これは、融資管理者が管理者審査ページに戻るための [戻る] ボタンを表示します。ここでは、アクション属性はありません。この場合、フォームからのアクション (returnToManagerReviewAction) が実行されます。
GetManagerReview.jsp の最終の JSP コードを以下に示します。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<%@taglib uri="http://bea.com/wli/worklist/tags-worklist-1.0" prefix="worklist"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="approveLoanAction">
<table>
<tr>
<td><netui:label value="Customer Name:"/></td>
<td><netui:label value="${actionForm.name}"/></td>
</tr>
<tr>
<td><netui:label value="SSN:"/></td>
<td><netui:label value="${actionForm.ssn}"/></td>
</tr>
<tr>
<td><netui:label value="Loan Amount:"/></td>
<td><netui:label value="${actionForm.loanAmount}"/></td>
</tr>
<tr>
<td colspan="2">
<netui:button value="View Asset Summary" action="viewAssetSummaryAction"/>
</td>
</tr>
<tr>
<td colspan="2">
<!-- これは、propertyEditor タグの使用方法を示します。
また、ラベル、合計値、およびスタンドアロン エディタが
使用できる場合は、スタンドアロン エディタへのリンクを
示します。このタグは、インプレースでのプロパティ値の編集も
注意 : actionName attr 属性で取得した名前を持つ
<netui:label value="Reason for Action:"/>
<worklist:propertyEditor hostPage="GetManagerReview.jsp"
dataSource="actionForm.notesProp"
actionName="editNotesPropAction"/>
<!-- 従来の NetUI actionForm バインディングを使用して、
このプロパティを編集します (netui:textBox タグ
<netui:label value="Collateral Assets:"/>
<netui:textBox dataSource="actionForm.collateralAssets"/>
<netui:button value="Approve" action="approveLoanAction"/><p/>
<netui:button value="Reject" action="rejectLoanAction"/>
AssetSummary.jsp の最終の JSP コードを以下に示します。
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-html-1.0" prefix="netui"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-databinding-1.0" prefix="netui-data"%>
<%@taglib uri="http://beehive.apache.org/netui/tags-template-1.0" prefix="netui-template"%>
<netui:html>
<head>
<netui:base/>
</head>
<netui:body>
<netui:form action="returnToManagerReviewAction">
<table>
<tr>
<td colspan="2"><netui:label value="Assets for ${actionForm.name}"/></td>
</tr>
<tr>
<netui-data:repeater dataSource="actionForm.assets">
<netui-data:repeaterHeader>
<table border="1">
<tr>
<td>Name</td>
<td>Value</td>
<td>Amount Owed</td>
<td>Actual Value</td>
</tr>
</netui-data:repeaterHeader>
<netui-data:repeaterItem>
<tr>
<td><netui:label value="${container.item.name}"/></td>
<td><netui:label value="${container.item.value}"/></td>
<td><netui:label value="${container.item.amountOwed}"/></td>
<td><netui:label value="${container.item.actualValue}"/></td>
</tr>
</netui-data:repeaterItem>
<netui-data:repeaterFooter>
</table>
</netui-data:repeaterFooter>
</netui-data:repeater>
</tr>
<tr>
<td><netui:label value="Credit Score:"/></td>
<td><netui:label value="${actionForm.creditScore}"/></td>
</tr>
<tr>
<td colspan="2"><netui:button value="Back"/>
</tr>
</table>
</netui:form>
</netui:body>
</netui:html>
融資承認タスク プランの ManagerReviewPending ステップのためのカスタム タスク UI を設計したら、以下の LoanWeb Web プロジェクトにあるレジストリ ファイルにマッピング エントリを追加して、これらの環境で適用されるようにカスタム タスク UI を登録する必要があります。
LoanWeb/WebContent/WEB-INF/task-ui-registry.xml
この XML ファイルは、ワークリスト タスク UI レジストリのスキーマに関連付けられています。また、このスキーマは Workshop に登録されています。このファイルは、Workshop で編集する必要があります。ファイルを開くと、[デザイン] および [ソース] タブのあるエディタが表示されます。[ソース] タブの、最初のコンテンツは次のように表示されています。
<task-ui-registry xmlns="http://www.bea.com/wli/worklist/taskuiregistry">
</task-ui-registry>
[デザイン] タブのツリー ビューで、作業する任意のノードを右クリックできます。ノードの削除および子ノードの追加が行えます。
カスタム タスク UI を登録するには、以下の情報が必要です。
このチュートリアルでのページ フロー コントローラ ファイルは、実際は ManagerReview.java ですが、URI の末尾は .jpf になります。これは、LoanApp Web アプリケーションのサーブレット フィルタが正常に起動するようにするために必要なことです。task-ui-registry.xml の編集を最初に終了するには、[パッケージ・エクスプローラー] ビューに切り替えて、エディタの [デザイン] タブで以下を行います。
カスタム タスク UI を検証するために、以下のシナリオを使用します。
「融資処理のユーザおよびグループのコンフィグレーション」を参照してください。
新しいタスク プランのタスク インスタンスを作成する前に、以下の資格を使用して、Loan_Web プロジェクトにログインします
「John Smith 向け融資」タスクが、Mary の受信ボックスに表示されます。タスクをクリックすると、前に定義したカスタム タスク UI ページ フローが表示されます (図 7-15 を参照)。
これにより、図 7-16 に示すように、John Smith の資産が表示されます。
この表は、John Smith の資産とその実際の価値を (降順に) 示しています。Mary はこの情報を見て、John Smith の資産が 10,000 ドルのみであり、信用度が低い (100) ことが分かります。Mary は、以下の手順を実行して、この融資を拒否することを決定します。
![]() ![]() ![]() |