Java 未调用JSF CommandButton操作
我遇到了一个JSF CommandButton操作未被调用的问题。 我有一个托管bean roleController,如Java 未调用JSF CommandButton操作,java,jsf,jakarta-ee,Java,Jsf,Jakarta Ee,我遇到了一个JSF CommandButton操作未被调用的问题。 我有一个托管bean roleController,如 @ManagedBean(name = "roleController") @RequestScoped public class RoleController { public Role getSelectedRole() { return selectedRole; } public void updateSelectedRole() {
@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
public Role getSelectedRole() {
return selectedRole;
}
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
在我的.jsf文件中,我试图编辑h:commandButton上的invoke-updateSelectedRole操作,但它似乎不起作用。我试图将方法名称更改为不正确的名称,但没有引发异常-但当我对其他表单执行相同操作时,会引发异常-因此很可能该操作甚至没有被调用
<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>
/admin/roles.xhtml
/admin/roles.xhtml
真的
行动
编辑
方法action方法需要返回一个字符串
public String updateSelectedRole() {
System.out.println(selectedRole.getRole());
return "true";
}
未调用该操作,因为未呈现命令按钮组件 在处理表单提交期间,将重新评估父面板组组件上的
rendered=“${param.action=='edit'}”
(作为防止篡改/黑客请求的保护措施)。但是,由于您显然没有在回发中保留该请求参数(至少代码中没有任何其他证明),因此它的计算结果为false
。因此,不会渲染父面板组组件,包括其所有子组件
在表单提交过程中,您需要确保命令按钮的rendered
属性及其所有父组件的计算结果为true
。在这种特殊情况下,您可以通过在命令按钮本身中包含
来保留请求参数来实现这一点
另见:
- -第5点适用于您
与具体问题无关,建议禁止在JSF中使用
${}
,否则会导致不必要的混淆和问题。只要始终坚持{}
。来自客户端的请求必须封装在HTTP表单中此订单更改在我的情况下有效:
<h:form>
<h:panelGroup rendered="${param.action == 'edit'}">
.
.
.
</h:panelGroup>
</h:form>
.
.
.
我已经试过了,没用。@DanielCisek还发现了第二个问题。更新了答案。不幸的是,它不起作用。从EL 2.2开始,括号受支持。如果OP使用EL2.1或更老版本,他会得到一个ELException
。所以这绝对不是问题所在。返回字符串不是必需的。空虚也是完美的。如果它真的无效,它也会抛出一个ELException
。但事实并非如此。您确定没有更改任何其他内容吗?或者此更改触发了一个正在更正其他错误的部署?
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>