CRUD <h:datatable>在每行中包含<h:inputtext>

时间:2017-10-12 19:10:31

标签: java jsf dao

这是xhtml页面

screenshot

这是代码:

<h:form rendered="#{not empty utilisateurs.users}">
<h:dataTable var="item" value="#{utilisateurs.users}" border="1">
<h:column><f:facet name="header">Id</f:facet><h:inputText value="#{item.id}" binding="#{utilisateurs.inputId}"></h:inputText></h:column>
<h:column><f:facet name="header">Nom</f:facet><h:inputText value="#{item.nom}" binding="#{utilisateurs.inputName}"></h:inputText></h:column>
<h:column><f:facet name="header">email</f:facet><h:inputText value="#{item.email}" binding="#{utilisateurs.inputEmail}"></h:inputText></h:column>
<h:column><f:facet name="header">mot de passe</f:facet><h:inputText value="#{item.motDePasse}" binding="#{utilisateurs.inputPass}"></h:inputText></h:column>
<h:column><h:commandButton value="edit" action="#{utilisateurs.update()}" /></h:column>
<h:column><h:commandButton value="delete" action="#{utilisateurs.delete(item)}" /></h:column>
<h:column><h:commandButton value="save" action="#{utilisateurs.save(item)}" /></h:column>

这是托管bean:

@ManagedBean(name="utilisateurs")
@ViewScoped
public class Users {
private HtmlInputText inputId=new HtmlInputText();
private HtmlInputText inputName=new HtmlInputText();
private HtmlInputText inputEmail=new HtmlInputText();
private HtmlInputText inputPass=new HtmlInputText();
private List<Utilisateur>users;
private UtilisateurDaoImpl dao;
private DAOFactory daoFactory;
private Utilisateur user=new Utilisateur();
private Utilisateur newUser=new Utilisateur();
public Utilisateur getNewUser() {
    return newUser;
}

public void setNewUser(Utilisateur newUser) {
    this.newUser = newUser;
}

private boolean edit;
 @PostConstruct
 public void init(){
    daoFactory=DAOFactory.getInstance();
    dao=new UtilisateurDaoImpl(daoFactory);
    users=new ArrayList<Utilisateur>();
    users=dao.lister(); 
    inputId.setDisabled(true);
    inputName.setDisabled(true);
    inputEmail.setDisabled(true);
    inputPass.setDisabled(true);
 }

public void setNewUser(Utilisateur newUser) {
    this.newUser = newUser;
}

private boolean edit;
 @PostConstruct
  public void init(){
    daoFactory=DAOFactory.getInstance();
    dao=new UtilisateurDaoImpl(daoFactory);
    users=new ArrayList<Utilisateur>();
    users=dao.lister(); 

 }
public void add() {
dao.creer(user);
users.add(user);
user = new Utilisateur();
}

public void update() {
inputId.setDisabled(false);
inputName.setDisabled(false);
inputEmail.setDisabled(false);
inputPass.setDisabled(false);
}
public void save(Utilisateur user){
dao.update(user);
inputId.setDisabled(true);
inputName.setDisabled(true);
inputEmail.setDisabled(true);
inputPass.setDisabled(true);
}

public void delete(Utilisateur user) {
dao.delete(user);
users.remove(user);
}

问题是,当我点击编辑时,整个数据表输入已启用但我只想启用我编辑的当前行

另外,如果你能提供帮助,我想在数据表的末尾只添加一行,这样我就可以插入一些数据了

1 个答案:

答案 0 :(得分:0)

问题是您将相同的UICompon绑定到所有行。你需要改变它。

我建议你看一下:https://www.primefaces.org/showcase/ui/data/datatable/edit.xhtml

使用primefaces或其他lib不是强制性的,只需使用这个想法。

例如,您可以在Utilisateur类中添加布尔属性,点击“编辑”按钮启用/禁用该行

public class Utilisateur {
   //... other code

   public boolean editMode;
   // getter and setter
}

在每一行中(替换所有输入中的绑定):

<h:inputText value="#{item.id}" readonly="#{!item.editMode}"></h:inputText>

编辑按钮:

<h:commandButton value="Make editable" actionListener="#{utilisateurs.editable(item)}" />

在你的bean中:

public void editable(Utilisateur user) {
   for(Utilisateur utilisateur : users) {
       utilisateur.setEditMode(false);
   }
   user.setEditMode(true);
}