web-dev-qa-db-fra.com

Quelle est la différence entre FacesContext et ExternalContext

Quelle est la différence entre FacesContext et ExternalContext? Quand puis-je utiliser l'un ou l'autre? Qu'est-ce que l'un et qu'est-ce que l'autre?

L'exemple suivant provient du livre JavaServer Faces 3rd edition:

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

Haricot de support:

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

Pourquoi le paramètre de demande est-il dans ExternalContext? Qu'est-ce que clientId? Est-il généré par JSF au démarrage de l'application?

29
vmaric

Regardez attentivement dans leurs javadocs pour voir quelles méthodes ils proposent et ce que font exactement ces méthodes.

Si vous regardez de plus près les méthodes répertoriées dans le javadoc, vous remarquerez que le FacesContext offre généralement un accès aux artefacts spécifiques à JSF qui ne sont en aucun cas liés au Servlet ou à l'API de portlet "sous-jacents" pour lesquels JSF est conçu pour fonctionner par dessus. Par exemple. créer des convertisseurs, validateurs, composants, expressions EL, etc. et obtenir des informations sur la racine de la vue, les paramètres régionaux pris en charge, etc. et ajouter des écouteurs de phase, des écouteurs d'événements système, etc. Tout ce qui est spécifique à l'API JSF.

Et, ExternalContext offre généralement un accès aux artefacts spécifiques aux servlets ou aux portlets que JSF utilise actuellement "sous les couvertures". Par exemple, lors de l'exécution sur un conteneur de servlet, la demande de servlet HTTP , réponse de servlet HTTP , session HTTP et contexte de servlet = et intrinsèquement aussi tous leurs artefacts. Cliquez sur ces liens, vous verrez qu'ils offrent à leur tour des méthodes qui ont également été déléguées par ExternalContext, telles que getRequestParameterMap(). Voir aussi le javadoc . Oui, cliquez également sur ce lien, vous verrez qu'il mentionne explicitement la demande de servlet:

Servlet: Il doit s'agir de l'ensemble des paramètres disponibles via les méthodes javax.servlet.ServletRequestgetParameter() et getParameterNames().

Il y a rien qui peut être offert par les les deux contextes. Il n'y aurait donc absolument aucune raison de préférer l'un ou l'autre. Utilisez simplement le bon pour le travail que vous devez effectuer.

Quant à l'ID client, il est bien généré par JSF, mais certainement pas au démarrage du serveur. Il est simplement généré pour chaque composant JSF par vue. Dans le cas de composants d'entrée comme <h:inputText>, Qui génère un élément HTML <input>, Il devient également l'attribut name comme ceci

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

Le formId:inputId Est exactement l'ID client JSF. Il devient le nom du paramètre de requête. La représentation HTML du bouton de commande a également un name qui finit comme nom de paramètre de requête avec la valeur du bouton comme valeur de paramètre.

43
BalusC