セッションスコープのコンテナオブジェクトからの同じデータの一部を表示する2つのJSPページを含むJSFアプリケーションがあります。各ページはデータを異なる方法で表示し、それぞれがページ間で異なるデータテーブルに表示されます。これまでのところ、これはすべて適切に機能します。
私の問題は、バッキングBeanのアクションメソッドの内部からどのページが要求されたかをどのように把握するかについて少し浮気していることです。各ページで、データテーブルのバインディングを使用しました。
draftReport.jsp:
<t:dataTable
border="1"
id="reportDraftDataTable"
binding="#{controller.reportDraftDataTable}"
value="#{sessionData.reportDraftAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
report.jsp:
<t:dataTable
border="1"
id="reportDataTable"
binding="#{controller.reportDataTable}"
value="#{sessionData.reportAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
Controller
これらのページのアクションメソッドのいくつかを備えたリクエストスコープのバッキングBean(名前付き)があります。バッキングBean(類似したJSPページごとに1つの類似したメソッド)でコードを複製するのではなく、レンダリングされているページを把握し、それを汎用ハンドラーメソッド(両方のページからのアクションを処理できる)のパラメーターとして使用したいと思いました。バッキングビーン。だから私はだましてこれをしました:
public class Controller {
...
private HtmlDataTable preArrivalReportDataTable;
private HtmlDataTable preArrivalReportDraftDataTable;
private static enum ReportType {
NON_DRAFT,
DRAFT
}
...
private ReportType determineReportTypeFromControlBindings() {
Validate.isTrue(this.preArrivalReportDataTable != null ^
this.preArrivalReportDraftDataTable != null,
"Either preArrivalReportDataTable XOR " +
"preArrivalReportDraftDataTable must be null in " +
"determineReportTypeFromControlBindings()");
if (this.preArrivalReportDataTable != null) {
return ReportType.NON_DRAFT;
} else {
return ReportType.DRAFT;
}
}
...
public String actionOnReport() {
ReportType reportType = null;
reportType = determineReportTypeFromControlBindings();
handleReportAction(reportType);
return "REFRESH";
}
...
}
これは、Controllerクラスのアクションメソッド内では問題なく機能しましたが、その後、ハッキーコードを最終的に壊す別のメソッドを追加する必要がありました。
public String getStyleClass() {
ReportType reportType = determineReportTypeFromControlBindings();
switch (reportType) {
case NON_DRAFT:
return "styleA";
case DRAFT:
return "styleB";
default:
return null;
}
}
私のJSPでは、JSF-EL式は、バッキングBeanで使用しているデータテーブルのコントロールバインディングの上にあり、現在のページを判別しています。その時点でdetermineReportTypeFromControlBindings()
、おそらくコントロールバインディングがまだ発生していないため、検証チェックで例外がスローされます。
私はこれが起こっていることに驚いていません。それはいつも間違った方法のように感じました。しかし、私の質問は次のとおりです。
リクエストスコープのバッキングBeanアクションメソッドから現在リクエストされているJSPページを判別する正しい方法は何ですか?
関連する場合は、MyFaces1.2Tomahawkタグライブラリを使用しています。