web-dev-qa-db-fra.com

Obtenir les paramètres et les attributs de requête et de session à partir des pages JSF

J'utilise JSF avec des facelets et je dois obtenir les paramètres de requête et de session dans la page JSF. Dans les pages JSP, j'ai ce paramètre comme ceci: "${requestScope.paramName}" ou "${sessionScope.paramName}". Mais maintenant, après l'utilisation de JSF, il n'y a que des haricots et vous ne pouvez obtenir aucune valeur, à l'exception des attributs de haricot.

REMARQUE: Les attributs de session dont j'ai besoin sont remplis automatiquement à l'aide de la sécurité acegi. Je ne peux donc pas y accéder.

Alors que faire maintenant?

53
Saeed

Vous pouvez obtenir un paramètre de requête id en utilisant l'expression:

<h:outputText value="#{param['id']}" />
  • param - Carte immuable des paramètres de requête pour cette requête, indexée par nom de paramètre. Seule la première valeur pour chaque nom de paramètre est incluse.
  • sessionScope - Carte des attributs de session pour cette demande, indexée par le nom de l'attribut.

La section 5.3.1.2 du spécification JSF 1. définit les objets qui doivent être résolus par le résolveur de variable.

87
McDowell

Vous pouvez également utiliser un bean (une requête ciblée est suggérée) et accéder directement au contexte via le FacesContext.

Vous pouvez obtenir les objets HttpServletRequest et HttpServletResposne à l'aide du code suivant:

HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();

Ensuite, vous pouvez accéder à des paramètres individuels via getParameter(paramName) ou accéder à la carte complète via getParameterMap()req object

La raison pour laquelle je suggère un bean périmé de requête est que vous pouvez les utiliser lors de l'initialisation (le pire des cas étant le constructeur. La plupart des frameworks vous donnent une place pour faire du code au moment de l'initialisation du bean) et ils le seront au fur et à mesure de votre requête.

C'est cependant un peu un bidouillage. ;) Vous voudrez peut-être vérifier s’il existe un module JSF Acegi qui vous permettra d’avoir accès aux variables dont vous avez besoin.

43
Drew

Vous pouvez soit utiliser

<h:outputText value="#{param['id']}" /> Ou

<h:outputText value="#{request.getParameter('id')}" />

Toutefois, si vous souhaitez transmettre les paramètres à vos beans de support, utiliser f:viewParam Est probablement ce que vous voulez. "Un paramètre de vue est un mappage entre un paramètre de chaîne de requête et une valeur de modèle."

<f:viewParam name="id" value="#{blog.entryId}"/>

Cela définira le paramètre id du paramètre GET sur le champ entryId du bean blog. Voir http://Java.dzone.com/articles/bookmarkability-jsf-2 pour les détails.

32
ustun

Vous pouvez aimer ça:

#{requestScope["paramName"]} ,#{sessionScope["paramName"]}

Parce que requestScope ou sessionScope est un objet Map.

13
Ming

Vous pouvez également utiliser un outil tel que PrettyFaces d'OcpSoft pour injecter des valeurs de paramètres dynamiques directement dans les beans JSF.

6
Lincoln

En supposant que vous ayez déjà placé votre objet en tant qu'attribut sur la carte de session de l'instance actuelle du FacesContext à partir de votre bean géré, vous pouvez l'obtenir à partir de la page JSF en:

<h:outputText value="#{sessionScope['yourObject'] }" />

Si votre objet a une propriété, obtenez-la en:

<h:ouputText value="#{sessionScope['yourObject'].anyProperty }" />
5
Omar

Êtes-vous sûr de ne pas pouvoir accéder aux variables de portée de requête/session depuis une page JSF?

Voici ce que je fais dans notre page de connexion, en utilisant Spring Security:

<h:outputText
    rendered="#{param.loginFailed == 1 and SPRING_SECURITY_LAST_EXCEPTION != null}">
    <span class="msg-error">#{SPRING_SECURITY_LAST_EXCEPTION.message}</span>
</h:outputText>
4
user7094

Dans le bean, vous pouvez utiliser session.getAttribute ("nomattribut");

0
Wandile Nxumalo