Подтвердить что ты не робот

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

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

Ниже приведен пример из книги JavaServer Faces 3rd edition:

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

Поддержка bean:

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

4b9b3361

Ответ 1

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

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

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

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