В чем разница между 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
который заканчивается как имя параметра запроса со значением кнопки в качестве значения параметра.