В чем разница между FacesContext и ExternalContext

В чем разница между FacesContext и ExternalContext? Когда я могу использовать тот или иной? Что есть у одного и что есть у другого?

Следующий пример взят из книги JavaServer Faces 3rd edition:

 <h:commandButton ... actionListener="#{rushmore.handleMouseClick}" />

Фасоль поддержки:

public void handleMouseClick(ActionEvent e) {
    FacesContext context = FacesContext.getCurrentInstance();
    String clientId = e.getComponent().getClientId(context);
    Map<String, String> requestParams = context.getExternalContext().getRequestParameterMap();
    // ...
}

Почему параметр запроса в ExternalContext? Что такое clientId? Генерируется ли он JSF при запуске приложения?


person vmaric    schedule 06.04.2013    source источник


Ответы (1)


Внимательно просмотрите их javadocs, чтобы увидеть, какие методы они предлагают и что именно делают все эти методы.

Если вы внимательно посмотрите на эти методы, перечисленные в javadoc, вы заметите, что FacesContext обычно предлагает доступ к артефактам, специфичным для JSF, которые никоим образом не связаны с «основным» API сервлетов или портлетов, для которых JSF был разработан. бежать сверху. Например. создание преобразователей, валидаторов, компонентов, выражений EL и т. д., получение информации о корне представления, поддерживаемых локалях и т. д., а также добавление прослушивателей фазы, прослушивателей системных событий и т. д. Все, что относится к JSF API.

И ExternalContext обычно предлагает доступ к артефактам, специфичным для сервлетов или портлетов, которые JSF в настоящее время использует «под прикрытием». Например, при работе в контейнере сервлетов HTTP-запрос сервлета, ответ сервлета HTTP, сеанс HTTP и Контекст сервлета, а также все их артефакты. Щелкнув по этим ссылкам, вы увидите, что они, в свою очередь, предлагают методы, которые также были делегированы ExternalContext, например getRequestParameterMap(). См. также документацию по Java. Да, также нажмите на эту ссылку, вы увидите, что в ней явно упоминается запрос сервлета:

Сервлет: это должен быть набор параметров, доступных через javax.servlet.ServletRequest методы getParameter() и getParameterNames().

Нет ничего, что может предложить оба контекста. Так что не было бы абсолютно никаких причин предпочесть тот или иной. Просто используйте правильный для работы, которую вам нужно выполнить.

Что касается идентификатора клиента, он действительно генерируется JSF, но определенно не при запуске сервера. Он просто генерируется для каждого отдельного компонента JSF для каждого представления. В случае компонентов ввода, таких как <h:inputText>, которые генерируют HTML-элемент <input>, он также становится атрибутом name, например

<input type="text" id="formId:inputId" name="formId:inputId" ... />

formId:inputId — это точно идентификатор клиента JSF. Оно становится именем параметра запроса. HTML-представление командной кнопки также имеет name, которое заканчивается как имя параметра запроса со значением кнопки в качестве значения параметра.

person BalusC    schedule 06.04.2013