我有一个 JSF 应用程序,其中包含两个 JSP 页面,它们都显示来自会话范围的容器对象的一些相同数据。每个页面都以不同的方式显示数据,每个页面都在不同页面之间变化的数据表中。到目前为止,这一切都正常工作。
我的问题是我一直在欺骗我如何弄清楚从我的支持 bean 操作方法中请求的页面。在每一页上,我都为我的数据表使用了绑定。
草稿报告.jsp:
<t:dataTable
border="1"
id="reportDraftDataTable"
binding="#{controller.reportDraftDataTable}"
value="#{sessionData.reportDraftAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
报告.jsp:
<t:dataTable
border="1"
id="reportDataTable"
binding="#{controller.reportDataTable}"
value="#{sessionData.reportAdapterList}"
var="currentRow"
rowClasses="dataTableOddRow, dataTableEvenRow">
我有一个请求范围的支持 bean(名为Controller
),其中包含这些页面的一些操作方法。我不想在支持 bean 上重复代码(每个类似的 JSP 页面使用一个类似的方法),而是想弄清楚正在呈现的页面并将其用作通用处理程序方法(可以处理来自两个页面的操作)的参数后备豆。所以我作弊并这样做了:
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 类的操作方法中运行良好,但后来我需要添加另一个方法,最终破坏了我的 hacky 代码:
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 页面的正确方法是什么?
如果它是相关的,我使用的是 MyFaces 1.2 Tomahawk 标记库。