19

我遇到了未调用 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 文件中,我试图在 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>

我发现它可能是嵌套表单引起的,但在本例中并非如此。这个问题的根源是否可能是我的导航规则?

<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

4 回答 4

30

未调用该操作,因为未呈现命令按钮组件。

在处理表单提交期间,rendered="${param.action == 'edit'}"父面板组组件上的组件被重新评估(以防止被篡改/黑客请求)。但是,由于您显然没有在回发中保留该请求参数(至少,代码中没有任何其他证明),因此它的计算结果为false. 因此父面板组组件不会被渲染,包括它的所有子组件。

您需要确保rendered命令按钮的属性及其所有父组件true在表单提交期间评估为。<f:param>在这种特殊情况下,您可以通过在命令按钮本身中包含 a 来保留请求参数来实现这一点。

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

也可以看看:


与具体问题无关,建议禁止${}在 JSF 中使用,否则会导致不必要的混淆和问题。只是一直坚持#{}

于 2012-11-11T00:13:18.797 回答
0

来自客户端的请求必须封装在 HTTP 表单中

于 2015-03-27T11:29:48.463 回答
0
<h:commandButton value="#{msg.buttonUpdate}" 
  action="#{roleController.updateSelectedRole()}"/>

将其更改为

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

您的操作调用不需要括号。

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

并且方法action方法需要返回一个字符串

public String updateSelectedRole() {

    System.out.println(selectedRole.getRole());
    return "true";
}
于 2012-11-10T21:52:04.090 回答
-2

此订单更改在我的情况下有效:

<h:form>
  <h:panelGroup rendered="${param.action == 'edit'}">
  .
  .
  .
  </h:panelGroup>
</h:form>
于 2018-05-30T11:10:06.843 回答