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

I'm having a problem with JSF CommandButton action not being invoked. I have a managed bean roleController, as in

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

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

В моем файле.jsf я пытаюсь изменить действие invoke updateSelectedRole для 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>

4 ответа

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

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

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

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

Смотрите также:


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

<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";
}

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

Это изменение порядка работало в моем случае:

<h:form>
  <h:panelGroup rendered="${param.action == 'edit'}">
  .
  .
  .
  </h:panelGroup>
</h:form>
Другие вопросы по тегам