web-dev-qa-db-ger.com

Die JSF-CommandButton-Aktion wird nicht aufgerufen

Ich habe ein Problem mit der JSF-CommandButton-Aktion, die nicht aufgerufen wird ... Ich habe einen verwalteten Bean-RoleController, wie in

@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
        public Role getSelectedRole() {
    return selectedRole;
}

public void updateSelectedRole() {
    System.out.println(selectedRole.getRole());
}

In meiner .jsf-Datei versuche ich, die Aktion updateSelectedRole für h: commandButton aufzurufen, aber es scheint nicht zu funktionieren. Ich habe versucht, den Methodennamen in einen falschen zu ändern, und es wird keine Ausnahme ausgelöst - aber wenn ich dasselbe mit einem anderen Formular mache, wird die Ausnahme ausgelöst - daher wird die Aktion höchstwahrscheinlich nicht einmal aufgerufen.

<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>

Ich habe festgestellt, dass es sich um verschachtelte Formulare handeln kann, dies ist jedoch in diesem Beispiel nicht der Fall. Ist es möglich, dass die Wurzel dieses Problems meine Navigationsregel ist?

<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

Die Aktion wurde nicht aufgerufen, da die Befehlsschaltflächenkomponente nicht gerendert wird.

Während der Verarbeitung des Formulars wurde der rendered="${param.action == 'edit'}" in der übergeordneten Panel-Gruppenkomponente erneut bewertet (als Schutz gegen manipulierte/gehackte Anforderungen). Da Sie diesen Anforderungsparameter jedoch scheinbar im Postback nicht beibehalten (zumindest beweist nichts im Code etwas anderes), wird er als false ausgewertet. Daher wird die übergeordnete Panel-Gruppenkomponente einschließlich aller ihrer Kinder nicht gerendert.

Sie müssen sicherstellen, dass das Attribut rendered der Befehlsschaltfläche und alle übergeordneten Komponenten während des Formulars zu true ausgewertet werden. In diesem speziellen Fall können Sie dies erreichen, indem Sie den Anforderungsparameter beibehalten, indem Sie in der Befehlsschaltfläche selbst einen <f:param> angeben.

<h:commandButton ...>
    <f:param name="action" value="#{param.action}" />
</h:commandButton>

Siehe auch:


Unrelated Für das konkrete Problem wird empfohlen, die Verwendung von ${} in JSF zu verbieten, da dies sonst zu unnötiger Verwirrung und Fragen führen würde. Bleiben Sie einfach ständig bei #{}.

27
BalusC
<h:commandButton value="#{msg.buttonUpdate}" 
  action="#{roleController.updateSelectedRole()}"/>

Ändern Sie es in

 <h:commandButton value="#{msg.buttonUpdate}" 
  action="#{roleController.updateSelectedRole}"/>

Sie benötigen keine Klammern für Ihren Aktionsaufruf.

public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}

und die Methodenaktionsmethode muss einen String zurückgeben

public String updateSelectedRole() {

    System.out.println(selectedRole.getRole());
    return "true";
}
0
Udo Held

die Anfrage vom Client muss in einem HTTP-Formular gekapselt sein

0
user3715225