Действие JSF CommandButton не вызывается

У меня возникла проблема с действием JSF CommandButton, которое не было вызвано. У меня есть управляемый bean roleController, как в

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

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

В моем .jsf файле я пытаюсь редактировать invoke updateSelectedRole action на h: commandButton, но он не работает. Я попытался изменить имя метода на некорректное, и никакого исключения не было, но когда я делаю то же самое с другой формой, генерируется исключение - поэтому, скорее всего, действие даже не вызывается.

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

Я обнаружил, что это может быть вызвано вложенными формами, но это не так в этом примере. Возможно ли, что корень этой проблемы - мое правило навигации?

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

Ответ 1

Действие не вызывается, потому что компонент командной кнопки не отображается.

Во время обработки формы submit, элемент rendered="${param.action == 'edit'}" в компоненте группы родительских панелей пересматривается (в качестве защиты от несанкционированных/взломанных запросов). Однако, поскольку вы, по-видимому, не сохраняете этот параметр запроса в postback (по крайней мере, ничто в коде не доказывает иначе), он оценивает значение false. И, таким образом, компонент группы родительских панелей не отображается, включая все его дочерние элементы.

Вы должны убедиться, что атрибут rendered кнопки команды и всех ее родительских компонентов оценивается как true во время отправки формы. В этом конкретном случае вы можете добиться этого, сохранив параметр запроса, включив <f:param> в самой команде.

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

См. также:


Не привязанный к конкретной проблеме, он рекомендует запретить использование ${} в JSF, поскольку это в противном случае приводило бы к ненужной путанице и вопросам. Просто придерживайтесь #{} все время.

Ответ 2

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

измените его на

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

Вам не нужны скобки для вашего вызова действий.

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

и метод действия метода должен возвращать строку

public String updateSelectedRole() {

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

Ответ 3

запрос от клиента должен быть инкапсулирован в форме HTTP