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
Jsf 用于更改数据的dataTable或foreach_Jsf_Jakarta Ee_Jsf 2_Javabeans - Fatal编程技术网

Jsf 用于更改数据的dataTable或foreach

Jsf 用于更改数据的dataTable或foreach,jsf,jakarta-ee,jsf-2,javabeans,Jsf,Jakarta Ee,Jsf 2,Javabeans,我有一个在数据库中存储用户的应用程序。我希望管理员能够更新这些用户的数据,并尝试创建一个dataTable,该dataTable调用bean来获取用户列表,并迭代用户以输出他们的数据。我在inputText字段中输出数据,以便管理员能够编辑他们的数据。inputText字段旁边是保存更改的commandLink,它应该调用bean方法(sessionScoped)将更改合并到数据库中 我尝试使用dataTable和foreach手动执行此操作。他们两个都不工作 问题是,在单击链接时调用的bean

我有一个在数据库中存储用户的应用程序。我希望管理员能够更新这些用户的数据,并尝试创建一个dataTable,该dataTable调用bean来获取用户列表,并迭代用户以输出他们的数据。我在inputText字段中输出数据,以便管理员能够编辑他们的数据。inputText字段旁边是保存更改的commandLink,它应该调用bean方法(sessionScoped)将更改合并到数据库中

我尝试使用dataTable和foreach手动执行此操作。他们两个都不工作

问题是,在单击链接时调用的bean方法中,值仍然是旧值,而不是经过编辑的值(我希望它是inputText字段中的新值)。我做了一些关于actionListener的研究和阅读。因此,我在commandLink中添加了一个actionListener,它应该将inputText字段的新值复制到bean属性,但它也不起作用

这是我的jsf页面的代码:

<c:forEach items="#{UserBean.getUserList()}" var="customer">
      <tr>
          <h:form>
              <td>
                  <h:inputText disabled="true" value="#{customer.username}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.firstname}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.lastname}"/>
              </td>
              <td>
                  <h:inputText value="#{customer.email}"/>
              </td>
              <td>
                  <h:commandLink action="#{UserBean.update()}" value="Save changes">
                      <f:setPropertyActionListener target="#{UserBean.user}" value="#{customer}" />
                  </h:commandLink>
              </td>
          </h:form>
      </tr>
 </c:forEach>

这是我的豆子:

@ManagedBean(name="UserBean")
@SessionScoped
public class UserBean implements Serializable{

    private Users user;

    private List<Users> userList;


    public UserBean() {
        user = new Users();
    }

    public Users getUser() {
        return user;
    }

    public void setUser(Users user) {
        this.user = user;
    }

    public String update(){
        System.out.println(user.getFirstname());

        return null;
    }

    public List<Users> getUserList(){
        userList = findAll();
        return userList;
    }

    public void setUserList(List<Users> userList){
        this.userList = userList;
    }

    public List<Users> findAll(){
        if(userSessionBean.getSessionUser().getUgroup() > 1){
            userList = em.createNamedQuery("Users.findAll")
                    .getResultList();
            return userList;
        }
        else{
            userList = em.createNamedQuery("Users.findById")
                    .setParameter("id", userSessionBean.getSessionUser())
                    .setMaxResults(1)
                    .getResultList();
            return userList;
        }
    }
}
@ManagedBean(name=“UserBean”)
@会议范围
公共类UserBean实现了可序列化{
私人用户;
私有列表用户列表;
公共用户bean(){
用户=新用户();
}
公共用户getUser(){
返回用户;
}
公共void setUser(用户){
this.user=用户;
}
公共字符串更新(){
System.out.println(user.getFirstname());
返回null;
}
公共列表getUserList(){
userList=findAll();
返回用户列表;
}
public void setUserList(List userList){
this.userList=userList;
}
公共列表findAll(){
如果(userSessionBean.getSessionUser().getUgroup()>1){
userList=em.createNamedQuery(“Users.findAll”)
.getResultList();
返回用户列表;
}
否则{
userList=em.createNamedQuery(“Users.findById”)
.setParameter(“id”,userSessionBean.getSessionUser())
.setMaxResults(1)
.getResultList();
返回用户列表;
}
}
}

有人知道我做错了什么或者问题出在哪里吗?

您正在用getter方法加载模型

public List<Users> getUserList(){
    userList = findAll();
    return userList;
}
public List getUserList(){
userList=findAll();
返回用户列表;
}
因此,每次调用getter时,它都会返回一个新的模型,并覆盖以前对模型所做的任何更改

将该行移到bean的(post)构造函数方法

@PostConstruct
public void init() {
    userList = findAll();
}

public List<Users> getUserList(){
    return userList;
}
@PostConstruct
公共void init(){
userList=findAll();
}
公共列表getUserList(){
返回用户列表;
}
修复后,只需使用
。这会减少样板代码

另见

非常感谢。现在它起作用了。但是我不知道它和标签一起工作,因为我不知道把标签放在哪里?我试着把它放在命令链接之前,但这不起作用,因为输入文本不在,所以它不接受新的值。当我把它放在标签后面时,页面上什么也没有显示(没有链接,没有文本字段)。当我将它放在标记之前时,所有用户的所有值都在表单中,这是不合适的,因为我只想更改一个用户。有了c:foreach,我可以把它放在每一行前面。