У меня есть приложение 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">
У меня есть компонент поддержки с областью действия запроса (с именем Контроллер
) с некоторыми методами действий для этих страниц. Вместо того, чтобы дублировать код в вспомогательном компоненте (один похожий метод для каждой похожей страницы 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 над привязкой управления для таблицы данных, которую я использую в компоненте поддержки, чтобы определить, на какой странице я нахожусь. В этот момент defineReportTypeFromControlBindings ()
выдает исключение при проверке Validate, предположительно из-за того, что привязка элемента управления еще не произошла.
Я не удивлен, что это происходит. Мне всегда казалось, что это неправильно. Но мой вопрос:
Как правильно определить запрашиваемую в данный момент страницу JSP с помощью метода действия компонента поддержки с областью действия запроса?
В случае необходимости я использую библиотеку тегов MyFaces 1.2 Tomahawk.