У меня есть приложение JSF, содержащее две страницы JSP, которые обе отображают одни и те же данные из объекта контейнера в области сеанса.Каждая страница отображает данные по-разному, каждая в таблице данных, которая варьируется между страницами.Пока все работает правильно.
Моя проблема в том, что я немного обманывал то, как я выясняю, какая страница была запрошена изнутри в моих методах действия поддерживающего бина.На каждой странице я использовал привязку для своей таблицы данных.
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
) с некоторыми методами действий для этих страниц.Вместо того, чтобы дублировать код на компоненте поддержки (один похожий метод для каждой похожей страницы 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, но затем мне нужно было добавить другой метод, который окончательно сломал мой хакерский код:
public String getStyleClass() {
ReportType reportType = determineReportTypeFromControlBindings();
switch (reportType) {
case NON_DRAFT:
return "styleA";
case DRAFT:
return "styleB";
default:
return null;
}
}
В моем JSP выражение JSF-EL расположено над привязкой элемента управления для таблицы данных, которую я использую в компоненте поддержки, чтобы определить, на какой странице я работаю.В этот момент determineReportTypeFromControlBindings()
выдает исключение при проверке Validate, предположительно потому, что привязка элемента управления еще не произошла.
Я не удивлен, что это происходит.Это всегда было неправильно.Но мой вопрос:
Как правильно определить запрашиваемую в настоящий момент JSP-страницу из метода действия bean-объекта в области запроса?
В случае, если это уместно, Я использую библиотеку тегов Томагавк MyFaces 1.2.