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

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

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

 <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 при запуске приложения?

1 ответ

Решение

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

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

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

Сервлет: Это должен быть набор параметров, доступных через 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 который заканчивается как имя параметра запроса со значением кнопки в качестве значения параметра.

Другие вопросы по тегам