Jsf 用于更改数据的dataTable或foreach
我有一个在数据库中存储用户的应用程序。我希望管理员能够更新这些用户的数据,并尝试创建一个dataTable,该dataTable调用bean来获取用户列表,并迭代用户以输出他们的数据。我在inputText字段中输出数据,以便管理员能够编辑他们的数据。inputText字段旁边是保存更改的commandLink,它应该调用bean方法(sessionScoped)将更改合并到数据库中 我尝试使用dataTable和foreach手动执行此操作。他们两个都不工作 问题是,在单击链接时调用的bean方法中,值仍然是旧值,而不是经过编辑的值(我希望它是inputText字段中的新值)。我做了一些关于actionListener的研究和阅读。因此,我在commandLink中添加了一个actionListener,它应该将inputText字段的新值复制到bean属性,但它也不起作用 这是我的jsf页面的代码: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
<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(){
返回用户列表;
}
修复后,只需使用
。这会减少样板代码
另见