web-dev-qa-db-fra.com

Action JSF CommandButton non appelée

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>
18
Daniel Cisek

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>

Voir également:


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.

27
BalusC
<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";
}
0
Udo Held

la demande du client doit être encapsulée dans un formulaire HTTP

0
user3715225