Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未调用JSF CommandButton操作_Java_Jsf_Jakarta Ee - Fatal编程技术网

Java 未调用JSF CommandButton操作

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() {

我遇到了一个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上的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>