Gestion des paramètres de vue dans JSF après la publication
J'ai quelques pages qui a besoin d'un code d'utilisateur pour le travail, donc le code suivant:
userpage.xhtml
<!-- xmlns etc. omitted -->
<html>
<f:metadata>
<f:viewParam name="userId" value="#{userPageController.userId}"/>
</f:metadata>
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
<h:form>
<h:commandButton action="#{userPageController.doAction}" value="post"/>
</h:form>
</h:body>
</f:view>
userPageController.java
@Named
@ViewScoped
public class userPageControllerimplements Serializable {
private static final long serialVersionUID = 1L;
@Inject protected SessionController sessionController;
@Inject private SecurityContext securityContext;
@Inject protected UserDAO userDAO;
protected User user;
protected Long userId;
public UserPage() {
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
if(!FacesContext.getCurrentInstance().isPostback()){
User u = userDAO.find(userId);
this.userId = userId;
this.user = u;
}
}
public void doAction(){
}
}
Cependant, après doAction est appelée, l'affichage de paramètre dans l'url disparaît. Le haricot fonctionne toujours en raison de sa viewscoped la nature, mais il ruine mes tentatives de l'avenir de la navigation. Quand j'ai chercher partout, j'ai l'impression que le paramètre affichage doit rester après un post lire ainsi userpage.jsf?userId=123, mais ce n'est pas le cas. Qu'est-ce que vraiment l'intention de comportement?
À ce propos, j'ai essayé de mettre en œuvre ajout automatique des paramètres d'affichage lors de la navigation vers une autre page où je veux garder le nom d'utilisateur. Il semble fonctionner pour les autres, mais pour moi, le nom d'utilisateur dans le ViewRoot est toujours null. Le Code ci-dessous permet de récupérer le viewparameter (je sais que je pourrais utiliser mon stockés temporairement userId de la fève à la navigation, mais cette solution serait beaucoup plus fantaisistes):
String name = "userId";
FacesContext ctx = FacesContext.getCurrentInstance();
ViewDeclarationLanguage vdl = ctx.getApplication().getViewHandler().getViewDeclarationLanguage(ctx, viewId);
ViewMetadata viewMetadata = vdl.getViewMetadata(ctx, viewId);
UIViewRoot viewRoot = viewMetadata.createMetadataView(ctx);
UIComponent metadataFacet = viewRoot.getFacet(UIViewRoot.METADATA_FACET_NAME);
//Looking for a view parameter with the specified name
UIViewParameter viewParam = null;
for (UIComponent child : metadataFacet.getChildren()) {
if (child instanceof UIViewParameter) {
UIViewParameter tempViewParam = (UIViewParameter) child;
if (name.equals(tempViewParam.getName())) {
viewParam = tempViewParam;
break;
}
}
}
if (viewParam == null) {
throw new FacesException("Unknown parameter: '" + name + "' for view: " + viewId);
}
//Getting the value
String value = viewParam.getStringValue(ctx); //This seems to ALWAYS be null.
Une dernière pensée est que le setter toujours l'air de fonctionner, setUserId est appelée avec la valeur correcte sur le post.
Ai-je complètement missunderstood comment afficher les paramètres de travail, ou est-il une sorte de bug ici? Je pense que mon cas d'utilisation doit être extrêmement commun et ont un soutien de base dans le cadre.
source d'informationauteur Rasmus Franke
Vous devez vous connecter pour publier un commentaire.
Ce comportement est correct. Le
<h:form>
génère un code HTML<form>
élément avec une URL de l'action sans tout afficher paramètres. Le POSTE demande juste soumet à exactement cette URL. Si vous avez l'intention de garder la vue des paramètres dans l'URL, puis globalement, il existe 3 façons:Apporter un peu d'ajax magie.
De cette façon, le initialement demandé de page et donc aussi à la demande de l'URL dans la barre d'adresse du navigateur reste le même tout le temps.
Le cas échéant (par exemple, pour la page-à-page de navigation), faire une demande d'OBTENIR et d'utiliser
includeViewParams=true
. Vous pouvez utiliser<h:link>
et<h:button>
pour cela:Cependant, cela a une EL exploit de sécurité dans Mojarra versions antérieures à la version 2.1.6. Assurez-vous que vous utilisez Mojarra 2.1.6 ou plus récent. Voir aussi question 2247.
De contrôle de la génération de l'URL de l'action de
<h:form>
vous-même. Fournir une coutumeViewHandler
(juste étendreViewHandlerWrapper
) dans lequel vous faites le travail dansgetActionURL()
.Pour le faire fonctionner, de l'inscrire dans
faces-config.xml
comme suit:C'est aussi ce que OmniFaces
<o:form>
est en train de faire. Il prend en charge un supplément deincludeViewParams
attribut qui comprend tous les paramètres d'affichage dans la forme de l'URL de l'action:Mise à jour: obtenir les paramètres d'affichage de la vue en cours par programme (qui est en fait votre 2ème question) doit être effectuée comme suit:
Je suis bon que pour la solution 1
<f:ajax execute="@form" render="@form" />
du travail que l'on devrait aussi inclure quelque chose commeà l'intérieur de la
<h:commandButton>
?Comme il est décrit dans https://stackoverflow.com/a/14026995/811046