dataTable或foreach来更改数据

时间:2012-02-19 13:08:16

标签: jsf java-ee jsf-2 javabeans

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

我尝试使用dataTable并使用foreach手动执行此操作。他们都没有工作。

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

这是我的jsf-page的代码:

<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;
        }
    }
}

有谁知道我做错了什么或问题是什么?

1 个答案:

答案 0 :(得分:2)

您正在使用getter方法加载模型。

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

因此,每次调用getter时,它都会返回一个全新的模型并覆盖之前在模型上所做的任何更改。

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

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

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

修复后,只需使用<h:dataTable>即可。这样可以减少样板代码。

另见