JSF - Как определить текущую страницу JSP изнутри компонента поддержки метод действия

У меня есть приложение 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.

1
задан Jim Tough 4 October 2010 в 21:20
поделиться