J'ai un problème avec le fait que l'action JSF CommandButton n'a pas été invoquée . J'ai un roleController de bean géré, comme dans
@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
public Role getSelectedRole() {
return selectedRole;
}
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
Dans mon fichier .jsf, j'essaie de modifier l'invocation de l'action updateSelectedRole sur h: commandButton, mais cela ne semble pas fonctionner. J'ai essayé de changer le nom de la méthode en nom incorrect, et il n'y a pas d'exception levée - mais lorsque je fais la même chose avec un autre formulaire, l'exception est levée - il est donc probable que l'action n'est même pas appelée.
<h:panelGroup rendered="${param.action == 'edit'}">
<h:form>
<ol>
<li>
<label for="ID">
<h:outputText value="#{msg.roleEditID}" />
</label>
<h:inputText readonly="true"
value="#{roleController.selectedRole.id}" />
</li>
<li>
<label for="Role">
<h:outputText value="#{msg.roleEditRole}" />
</label>
<h:inputText value="#{roleController.selectedRole.role}" />
</li>
<li>
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole()}"/>
</li>
</ol>
</h:form>
</h:panelGroup>
J'ai trouvé qu'il pouvait s'agir de formulaires imbriqués, mais ce n'est pas le cas dans cet exemple. Est-il possible que la racine de ce problème soit ma règle de navigation?
<navigation-rule>
<from-view-id>/admin/roles.xhtml</from-view-id>
<navigation-case>
<to-view-id>/admin/roles.xhtml</to-view-id>
<from-outcome>true</from-outcome>
<redirect>
<view-param>
<name>action</name>
<value>edit</value>
</view-param>
</redirect>
</navigation-case>
</navigation-rule>
L'action n'est pas appelée, car le composant du bouton de commande n'est pas rendu.
Lors du traitement de l'envoi du formulaire, le rendered="${param.action == 'edit'}"
du composant du groupe de panneaux parent a été réévalué (en tant que protection contre les demandes falsifiées/piratées). Cependant, comme vous ne retenez apparemment pas ce paramètre de requête dans la publication (du moins, rien dans le code ne prouve le contraire), le résultat est false
. Ainsi, le composant du groupe de panneaux parent n'est pas rendu, y compris tous ses enfants.
Vous devez vous assurer que l'attribut rendered
du bouton de commande et de tous ses composants parents est évalué à true
lors de la soumission du formulaire. Dans ce cas particulier, vous pouvez y parvenir en conservant le paramètre request en incluant un <f:param>
dans le bouton de commande lui-même.
<h:commandButton ...>
<f:param name="action" value="#{param.action}" />
</h:commandButton>
Sans lien avec le problème concret, il est recommandé d'interdire l'utilisation de ${}
dans JSF car cela entraînerait une confusion inutile et des questions. Restez juste à #{}
tout le temps.
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole()}"/>
changez le en
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole}"/>
Vous n'avez pas besoin des crochets pour votre appel à l'action.
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
et la méthode action method doit renvoyer une chaîne
public String updateSelectedRole() {
System.out.println(selectedRole.getRole());
return "true";
}
la demande du client doit être encapsulée dans un formulaire HTTP