我有一个问题,没有调用JSF CommandButton操作.我有一个托管bean roleController,如
@ManagedBean(name = "roleController")
@RequestScoped
public class RoleController {
public Role getSelectedRole() {
return selectedRole;
}
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
Run Code Online (Sandbox Code Playgroud)
在我的.jsf文件中,我正在尝试在h:commandButton上编辑调用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>
Run Code Online (Sandbox Code Playgroud)
我发现它可能是嵌套表单引起的,但在本例中并非如此.这个问题的根源是否可能是我的导航规则?
<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>
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 28
未调用该操作,因为未呈现命令按钮组件.
在处理表单提交期间,已rendered="${param.action == 'edit'}"对父组面板组件进行了重新评估(以防止被篡改/被黑客入侵的请求).但是,由于您显然没有在回发中保留该请求参数(至少,代码中没有任何内容证明),它的计算结果为false.因此,不呈现父面板组组件,包括其所有儿童.
您需要确保rendered命令按钮的属性及其所有父组件true在表单提交期间评估为.在这种特殊情况下,您可以通过<f:param>在命令按钮本身中包含一个来保留请求参数来实现这一点.
<h:commandButton ...>
<f:param name="action" value="#{param.action}" />
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)
与具体问题无关,建议禁止${}在JSF中使用,否则会导致不必要的混淆和问题.坚持不懈#{}.
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole()}"/>
Run Code Online (Sandbox Code Playgroud)
将其更改为
<h:commandButton value="#{msg.buttonUpdate}"
action="#{roleController.updateSelectedRole}"/>
Run Code Online (Sandbox Code Playgroud)
您的行动号召不需要括号。
public void updateSelectedRole() {
System.out.println(selectedRole.getRole());
}
Run Code Online (Sandbox Code Playgroud)
并且方法action方法需要返回一个字符串
public String updateSelectedRole() {
System.out.println(selectedRole.getRole());
return "true";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
47577 次 |
| 最近记录: |