2014-11-24 29 views
1

我在xhtml頁面上獲取mysql「登錄」表數據,然後嘗試編輯單行然後更新它。問題是當我單擊單行的編輯列時,所有行都變爲可編輯。我的XHTML頁面的代碼是:使用JSF編輯單行mysql

 <?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
<h:head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

<title>Users</title> 
<h:outputStylesheet library="css" name="style.css" /> 
</h:head> 
<h:body> 

<h1>Users</h1> 

     <h:form> 
     <h:dataTable value="#{loginBean.list}" var="list" border="1"> 
     <h:column>     
      <f:facet name="header">Name</f:facet> 
      <h:inputText value="#{list.UName}" size="10" rendered="#{list.isEditable}" />    
      <h:outputText value="#{list.UName}" rendered="#{not list.isEditable}" /> 
     </h:column> 
     <h:column> 
      <f:facet name="header">Email</f:facet> 
      <h:inputText value="#{list.emailAdd}" size="10" rendered="#{list.isEditable}" />     
      <h:outputText value="#{list.emailAdd}" rendered="#{not list.isEditable}" /> 
     </h:column> 
      <h:column> 
      <f:facet name="header">Password</f:facet> 
      <h:inputText value="#{list.pword}" size="10" rendered="#{list.isEditable}" />    
      <h:outputText value="#{list.pword}" rendered="#{not list.isEditable}" /> 
     </h:column> 

     <h:column> 
      <f:facet name="header">Edit</f:facet> 
      <h:commandLink value="Edit" action="#{loginBean.editable(list)}"/> 
     </h:column> 

     <h:column> 
      <f:facet name="header">Update</f:facet> 
      <h:commandLink value="Update" action="#{loginBean.updateAction()}" /> 
     </h:column> 

     <h:column> 
      <f:facet name="header">Delete</f:facet> 
      <h:commandLink value="Delete" action="#{loginBean.deleteAction(list)}" /> 
     </h:column> 


     </h:dataTable> 
    </h:form> 


</h:body> 
</html> 

和loginBean類代碼:

package com; 

import java.io.Serializable; 

import java.util.ArrayList; 
import java.util.List; 

import javax.ejb.EJB; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ManagedProperty; 
import javax.faces.bean.ViewScoped; 
import javax.persistence.EntityManager; 

import entity.Login; 
import session.LoginManagerRemote; 
/** 
* @author asma.fardoos 
* 
*/ 
@ManagedBean(name = "loginBean" , eager=true) 
@ViewScoped 
public class LoginBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private String emailid; 
    private String password; 
    boolean isEditable; 


    @EJB 
    LoginManagerRemote loginmanager; 
    EntityManager em; 

    List<Login> list=null; 

@ManagedProperty(value="#{navigationBean}") 
private NavigationBean navigationBean; 

public LoginBean(){ 


} 

    public String dologin() 
    { 
     /**String username = "madiha"; 
     String pass = "madiha"; 
     if (username.equals(emailid) && pass.equals(password)) { 
      //JOptionPane.showInputDialog("Eggs are not supposed to be green."); 
      // System.out.print("You are logged IN"); 
      return navigationBean.toWelcome(); 
     } 

     return navigationBean.tofailure(); 
     */ 
      System.out.println(">>>> within actionLogin method <<<<"); 
      if (loginmanager.isUserValid(this.emailid, this.password)){ 
       return navigationBean.toWelcome(); 
      } 
      else 
       return navigationBean.tofailure();  
     } 

    public List<Login> getList() { 
     System.out.println(">>>> In List method <<<<"); 
     list = new ArrayList<Login>(); 
     list = loginmanager.findAll(); 

     return list; 
    } 
    public void setList(List<Login> list) { 
     this.list = list; 
    } 

    public String deleteAction(Login del) { 
     System.out.println(">>>> I am in delete method <<<<"); 
     loginmanager.delete(del); 
     return ""; 
    } 



public String editable(Login lis) 
    {System.out.println(">>>> I am in editable method <<<<"); 
      lis.setIsEditable(true); 
      System.out.println(">>>> I have set editable to true <<<<"); 
     return null; 
    } 

public String editAction(Login lis) { 
// LoginManager log = new LoginManager(); 
    //Login test = log.getRecordByID(lis.getId()); 
    loginmanager.Edit(lis); 
    System.out.println(">>>> I am in editAction method <<<<"); 
    //setIsEditable(true); 
    return ""; 
} 


public void updateAction() { 

    // setIsEditable(false); 
    // Query q = em.createQuery("UPDATE Login SET UName='foziiii' ,emailAdd= 'foziiiii',pword='fozi' WHERE id=21"); 
    // em.persist(); 

} 



    public String getEmailid() { 
     return emailid; 
    } 

    public void setEmailid(String emailid) { 
     this.emailid = emailid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 

} 
    public void setNavigationBean(NavigationBean navigationBean) { 
     this.navigationBean = navigationBean; 
} 

} 

和登錄實體類,編輯方法是:

@Entity 
public class Login implements Serializable { 
    private static final long serialVersionUID = 1L; 


    @Id 
    private int id; 

    private String emailAdd; 

    private String pword; 

    private String UName; 

    public Login() { 
    } 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getEmailAdd() { 
     return this.emailAdd; 
    } 

    public void setEmailAdd(String emailAdd) { 
     this.emailAdd = emailAdd; 
    } 

    public String getPword() { 
     return this.pword; 
    } 

    public void setPword(String pword) { 
     this.pword = pword; 
    } 

    public String getUName() { 
     return this.UName; 
    } 

    public void setUName(String UName) { 
     this.UName = UName; 
    } 
    @Transient 
    private boolean isEditable; 

    public boolean getIsEditable() { 
     return isEditable; 
    } 

    public void setIsEditable(boolean isEditable) { 
     this.isEditable = isEditable; 

    } 
} 

回答

1

問題是您在使用對於所有行都是相同的布爾狀態,每行需要單獨的狀態。

因此,通過

<h:column>     
<f:facet name="header">Name</f:facet> 
<h:inputText value="#{list.UName}" size="10" rendered="#{list.isEditable}"/>    
<h:outputText value="#{list.UName}" rendered="#{not list.isEditable}" /> 
</h:column> 
<h:column> 
<f:facet name="header">Email</f:facet> 
<h:inputText value="#{list.emailAdd}" size="10" rendered="#{list.isEditable}"/>    
<h:outputText value="#{list.emailAdd}" rendered="#{not list.isEditable}" /> 
</h:column> 
<h:column> 
<f:facet name="header">Password</f:facet> 
<h:inputText value="#{list.pword}" size="10" rendered="#{list.isEditable}"/>    
<h:outputText value="#{list.pword}" rendered="#{not list.isEditable}" /> 
</h:column> 

更換

<h:column>     
<f:facet name="header">Name</f:facet> 
<h:inputText value="#{list.UName}" size="10" rendered="#{loginBean.isEditable}"/>    
<h:outputText value="#{list.UName}" rendered="#{not loginBean.isEditable}" /> 
</h:column> 
<h:column> 
<f:facet name="header">Email</f:facet> 
<h:inputText value="#{list.emailAdd}" size="10" rendered="#{loginBean.isEditable}"/>    
<h:outputText value="#{list.emailAdd}" rendered="#{not loginBean.isEditable}" /> 
</h:column> 
<h:column> 
<f:facet name="header">Password</f:facet> 
<h:inputText value="#{list.pword}" size="10" rendered="#{loginBean.isEditable}"/>    
<h:outputText value="#{list.pword}" rendered="#{not loginBean.isEditable}" /> 
</h:column> 

並添加

@Transient 
private boolean isEditable; 

//+ getter and setter 

到您的Login實體。

編輯:根據評論部分,如何更新操作後的視圖?

使用Ajax,你的鏈接變得

<h:commandLink value="Edit" action="#{loginBean.editable(list)}"> 
<f:ajax render="yourDataTable"/> 
</h:commandLink> 

另見Difference between returning null and 「」 from a JSF action

+0

@BalucC我所做的更改,並編輯了問題。請查閱。現在,當我點擊編輯鏈接時,沒有任何反應,沒有字段可編輯。 – 2014-11-24 10:28:08

+0

您添加了'rowStatePreserved =「true」'..爲什麼?並請修改您的問題,以便我們可以看到示波器等。我不是BalucC btw .. – 2014-11-24 10:31:45

+0

對不起,我做了更改,請看 – 2014-11-24 10:47:09