Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Jsf 从表单外部处理数据表_Jsf_Primefaces - Fatal编程技术网

Jsf 从表单外部处理数据表

Jsf 从表单外部处理数据表,jsf,primefaces,Jsf,Primefaces,我在datatable表单外有一个按钮,它的功能是删除所选行,但问题是它在backingbean中返回该行的空值,咆哮消息的更新正确完成,并且该操作也被调用 然而,当把按钮放在表单中时,它可以正常工作,但我需要它位于表单外部的工具栏中 这是我的xhtml代码: 我已将rowKey更改为实体类型,为表单分配了唯一的id。无需在p:commandButton单击处处理表单。我将此按钮放入中。命令组件必须始终存在。单击行时完成的图元选择。单击按钮时,它将使用预设实体从列表中删除。只需重新提交。我将控制

我在datatable表单外有一个按钮,它的功能是删除所选行,但问题是它在backingbean中返回该行的空值,咆哮消息的更新正确完成,并且该操作也被调用

然而,当把按钮放在表单中时,它可以正常工作,但我需要它位于表单外部的工具栏中

这是我的xhtml代码:


我已将rowKey更改为实体类型,为表单分配了唯一的id。无需在
p:commandButton
单击处处理表单。我将此按钮放入
中。命令组件必须始终存在。单击行时完成的图元选择。单击按钮时,它将使用预设实体从
列表中删除。只需重新提交
。我将控制器移动到
javax.faces.view.ViewScope
中。PrimeFaces组件默认使用ajax,因此控制器的作用域必须至少与view一样宽

facelet:

?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
  <h:head>
    <title>Facelet Title</title>
  </h:head>
  <h:body>
    <div class="row" >
      <h:form id="toolbarForm">
        <p:toolbar id="tb">     
          <f:facet name="left">
            <p:commandButton value="Delete selected User" process="@this" update="myForm" actionListener="#{myBean.deleteUser}"/> 
          </f:facet>        
        </p:toolbar>
      </h:form>
    </div>    

    <h:form id="myForm">
      <p:dataTable id="usersTable" value="#{myBean.users}" var="user" selectionMode="single" selection="#{myBean.selectedUser}" rowKey="#{user}">
        <p:column>
        <f:facet name="header">ID</f:facet>
        #{user.id}
        </p:column>
        <p:column>
        <f:facet name="header">First name</f:facet>
        #{user.firstName}
        </p:column>
        <p:column>
        <f:facet name="header">Last name</f:facet>
        #{user.lastName}
        </p:column>
      </p:dataTable>
    </h:form>
  </h:body>
</html>

源代码包含注释以避免样板代码(getter/setter方法)

表单外部的命令按钮不能用于提交表单。如果您想实现所需的功能,一种方法是

  • 在表单中有一个p:remoteCommand,并将其绑定到支持bean方法personel.removeSelectedAnalyse和Have update=“@form”
  • 使用onclick属性从工具栏的command按钮调用remoteCommand,remoteCommand将提交表单。现在,支持bean将从表单中获得提交的值,这样您就可以进行必要的处理,并且表单将在Ajax请求完成后更新

  • 远程命令showcase:

    尝试以下操作:
    process=“@this,form”
    it not work:/“此按钮执行更新并运行操作,但返回所选行的空值”。是
    个人选择的分析
    ?控制器的作用域是什么?它的请求scoppedPrimeFaces组件使用ajax。ajax始终至少需要ViewScope。您让我意识到,命令按钮中的过程是不需要的。我将尝试更改为ViewScope,并查看它是否工作使用用户类中的一个字段可以节省更多的空间,并为getter/setter腾出空间;-)仅仅发布“它对我有用”是有点不符合StackOverflow的礼节的。你改变了什么,为什么?@Kukeltje感谢你对我错误的反思。我已经添加了缺少的内容。通过将内容添加到进程属性(如
    process=“@this,myForm:usersTable”
    )来处理其他形式的内容并不一定有效(这是偶然的,如果将来删除它,我也不会感到惊讶)。它只适用于PF命令按钮和链接,甚至不适用于
    p:ajax
    标记afaik。而且它不适用于普通的jsf ajax。因此,我不会依赖它,只是把事情放在正常的形式上。谢谢你的回答。我尝试将rowkey设置为整个值,但它也不起作用“表单外的命令按钮不能用于提交该表单”你是否阅读了其他答案和我在下面的评论?你的答案可能行,我会根据我的建议试试看是否行得通needs@kukultje我同意你的观点。只是命令按钮也需要位于表单标签内,才能处理和提交另一个表单。如果您希望接受使用非默认行为,则不需要位于同一表单中。是的,不在同一表单中,但也需要位于表单内。例如,form1中的commandbutton可用于提交form2。
    package x;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.annotation.PostConstruct;
    import javax.inject.Named;
    import javax.faces.view.ViewScoped;
    import lombok.Data;
    
    @Data
    @Named( value = "myBean" )
    @ViewScoped
    public class MyBean implements Serializable
    {
      private List<User> users;
      private User selectedUser;
    
      public MyBean()
      {
        users = new ArrayList<>();
        users.add( new User( 1, "First1", "Last1" ) );
        users.add( new User( 2, "First2", "Last2" ) );
        users.add( new User( 3, "First3", "Last3" ) );
        users.add( new User( 4, "First4", "Last4" ) );
        users.add( new User( 5, "First5", "Last5" ) );
      }
    
      @PostConstruct
      public void init()
      {
        System.out.println( "MyBean.init() called" );
      }
    
        public void deleteUser()
       {
         if ( selectedUser == null )
           System.out.println( "Selected User is null" );
         else
           System.out.println( "The ID of the User to remove: " + Integer.toString( selectedUser.getId() ) );
        boolean bn = users.remove( selectedUser );
      }
    
    
    }
    
    package x;
    
    import lombok.Data;
    
    @Data
    public class User
    {
      private int id;
      private String firstName;
      private String lastName;
    
      public User( int id_, String firstName_, String lastName_ )
      {
        id = id_;
        firstName =  firstName_;
        lastName = lastName_;
      }
    
    }