我有一個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