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?
Vous pouvez obtenir un paramètre de requête id en utilisant l'expression:
<h:outputText value="#{param['id']}" />
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.
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.
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.
Vous pouvez aimer ça:
#{requestScope["paramName"]} ,#{sessionScope["paramName"]}
Parce que requestScope
ou sessionScope
est un objet Map.
Vous pouvez également utiliser un outil tel que PrettyFaces d'OcpSoft pour injecter des valeurs de paramètres dynamiques directement dans les beans JSF.
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 }" />
Ê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>
Dans le bean, vous pouvez utiliser session.getAttribute ("nomattribut");