2012-03-12 58 views
1

我想做一個簡單的管理頁面來管理用戶列表。 jsf代碼如下所示:JSF 2.0和selectManyListbox生命週期的問題

<h:selectOneMenu id="selectUser" value="#{adminBean.user_id}" valueChangeListener="#{adminBean.userSelected}" > 
        <f:selectItems value="#{adminBean.myModelUsersValues}" /> 
        <a4j:ajax event="valueChange" render="login password privilege_list" execute="@this"/>  
       </h:selectOneMenu > 

    <table> 
     <tr> 
     <td><h:outputLabel styleClass="LabelStyle" value="login: "/></td>   
     </tr> 
     <tr> 
     <td> 
      <h:inputText id="login" value="#{adminBean.login}"/> 
     </td> 
     <td> 
     <h:message for="login" style="color:red"/> 
     </td>       
     </tr> 
     <tr> 
     <td><h:outputLabel styleClass="LabelStyle" value="password: "/></td>   
     </tr> 
     <tr> 
     <td> 
      <h:inputText id="password" value="#{adminBean.password}"/> 
     </td> 
     <td> 
     <h:message for="password" style="color:red"/> 
     </td>      
     </tr>  
     <tr> 
     <td><h:outputLabel styleClass="LabelStyle" value="privilege list: "/></td>   
     </tr> 
     <tr> 
     <td> 
      <h:selectManyListbox id="privilege_list" value="#{adminBean.privilegeList}"> 
       <f:selectItems value="#{adminBean.privilegeValues}" />       
      </h:selectManyListbox > 
     </td>  
     <td> 
     <h:message for="privilege_list" style="color:red"/> 
     </td>      
     </tr> 
    </table> 
    <br/> 
    <h:commandButton id="addButton" value="Add" action="#{adminBean.addUser}" styleClass="ButtonStyle"/>    
    <h:commandButton id="deleteButton" value="Delete" action="#{adminBean.deleteUser}" styleClass="ButtonStyle"/>     
    <h:commandButton id="clearButton" value="Clear" action="#{adminBean.clear}" styleClass="ButtonStyle"/> 

問題是當頁面加載時,所有項目都是空的。現在,當我點擊'添加'按鈕時,我發現運行了valueChangeListener="#{adminBean.userSelected}",它將第一位用戶的權限列表替換爲我的權限列表。這同樣是當我使用清除按鈕時 - 所有字段都是空的,但是當我再次點擊添加按鈕時,列表就是第一個用戶的列表(只有列表 - 沒有其他輸入文本)。我嘗試將immediate="true"添加到添加按鈕,並解決了這個問題,但是當然,我將所有輸入文本的值都傳遞給adminBean.addUser操作方法。我的bean是viewscoped(我需要使用它,因爲selectManyListBox上有驗證錯誤)。這裏是Java代碼(ADDUSER方法至今只發送一個記錄器的方法和檢查我登錄存在,如果對PRIV列表中選擇某事物。):

@ManagedBean(name="adminBean") 
@ViewScoped 
public class AdminBean { 
private String user_id =""; 
private String login =""; 
private String password =""; 
private ArrayList<String> privilegeList = new ArrayList<String>(); 

private User model = new User(); 
private TreeMap<String, User> usersValuesBackendMap = new TreeMap<String, User>(); 
private TreeMap<String, String> privilegesValues = new TreeMap<String, String>(); 
private TreeMap<String, String> myModelUsersValues = new TreeMap<String, String>(); 

... 

    @javax.annotation.PostConstruct 
    public void init() 
    {  

     usersValuesBackendMap = queryDAO.getAllUsers(); 

     for (Map.Entry<String, User> usr : usersValuesBackendMap.entrySet()) { 
      myModelUsersValues.put(usr.getValue().getLogin(), usr.getKey()); 
     } 

     privilegesValues = queryDAO.getFullPrivilegeList(); 
     user_id = ""; 
    } 
    public void userSelected(ValueChangeEvent event){ 
      String newValue = event.getNewValue().toString();  

      User user = usersValuesBackendMap.get(newValue); 

      login = user.getLogin(); 
      password = user.getPassword(); 
      privilegesValues.clear(); 
      for (String privilege: user.getPrivilegeValues()){  
       privilegesValues.put(privilege, privilege); 
      } 
     } 

     public String clear(){ 

      user_id =""; 
      login =""; 
      password =""; 
      privilegesValues = queryDAO.getFullPrivilegeList(); 
      return ""; 
     } 

有趣的是我加入即時=「true」以清算方法,然後......相反發生 - 列表正常,但inputTexts已填充。

回答

1

一些事實:

  1. valueChangeListener運行時!oldValue.equals(newValue)
  2. valueChangeListener而不是客戶端事件偵聽器。這完全是服務器端。
  3. valueChangeListener完全獨立於它是ajax還是普通請求。它針對所有類型的請求進行調用,包括正常表單提交。

改爲需要<a4j:ajax listener>

<h:selectOneMenu id="selectUser" value="#{adminBean.user_id}"> 
    <f:selectItems value="#{adminBean.myModelUsersValues}" /> 
    <a4j:ajax event="valueChange" listener="#{adminBean.userSelected}" render="login password privilege_list" execute="@this"/>  
</h:selectOneMenu > 

public void userSelected(AjaxBehaviorEvent event){ 
    User user = usersValuesBackendMap.get(user_id); 
    // ... 
} 
+0

作爲從BalusC往常一樣和寶貴的幫助 - 非常感謝:> – 2012-03-12 15:18:46

+0

希望我仍然可以在一些幫助指望原因是對同一個項目。您的建議可行,但我還有其他問題。當我添加用戶時,一切正常,我可以在SelectOneMenu中看到新的。但是,當我刪除它時,它仍然在列表中(儘管選中時沒有填充字段)。當然,我更新bean方法中的列表與添加用戶操作完全相同。可能是什麼問題?我試着切換到a4j:ajax的按鈕,但它是一樣的(加上消息不發送)。 – 2012-03-12 22:05:17