我有一个将用户存储在数据库中的应用程序。我希望管理员可以更新这些用户的数据,并尝试创建一个调用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;
}
}
}
有谁知道我做错了什么或问题是什么?
答案 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>
即可。这样可以减少样板代码。