Действие 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>
Смотрите также:
- Метод commandButton/commandLink/ajax action/listener не вызывается или входное значение не обновляется - пункт 5 относится к вам
Вне зависимости от конкретной проблемы, рекомендуется запретить использование ${}
в 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";
}
Это изменение порядка работало в моем случае:
<h:form>
<h:panelGroup rendered="${param.action == 'edit'}">
.
.
.
</h:panelGroup>
</h:form>