我有一个JSF应用程序,其中包含两个JSP页面,这两个JSP页面都显示来自会话作用域容器对象的一些相同数据。每个页面都以不同的方式显示数据,每个数据表在页面之间不同。到目前为止,这一切都正常。JSF - 如何从支持bean动作方法内部确定当前JSP页面
我的问题是,我一直在欺骗一点,我怎么弄清楚我的支持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">
我有一个请求范围的辅助bean(名为Controller
)与一些对这些作用的方法页面。我不想在backing 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";
}
...
}
这个工作在我的控制器类确定内部操作方法,但我需要补充一点,终于打破了我的哈克代码的另一种方法:
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()
在Validate检查中抛出一个异常,大概是因为控制绑定还没有发生。
我并不惊讶这发生了。它总是觉得是错误的方式。但我的问题是:
从请求范围的支持bean操作方法确定当前请求的JSP页面的正确方法是什么?
如果相关,我使用MyFaces 1.2 Tomahawk标签库。
您无法创建一个适当的Controller,与传递给JSF的View/Data bean分开进行呈现?一个清晰的MVC设计几乎可以肯定比黑客控制器更好的模型。 – 2013-05-13 01:13:22