2012-03-12 9 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コードがある(アドユーザーの方法は、これまでのところ唯一の私は存在してログインロガー方法とチェックを送信し、STHが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」に清算の方法とその後sth。反対は起こる - リストはOKであるが、inputTextsは満たされる。

答えて

1

いくつかの事実:

  1. valueChangeListener実行!oldValue.equals(newValue)
  2. valueChangeListenerは、ではなく、のクライアントサイドイベントリスナーです。それは完全にサーバー側です。
  3. valueChangeListenerは、それがajaxか通常のリクエストかに完全に依存しません。これは、通常のフォーム送信を含む、すべてのタイプのリクエストで呼び出されます。

代わりに<a4j:ajax listener>が必要です。

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

<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 > 

BalusCからいつもと非常に貴重な助けとして - 大感謝:> –

+0

それは同じプロジェクトについてです原因うまくいけば、私はまだいくつかの助けを当てにすることができます。あなたの提案はうまくいきますが、別の問題があります。ユーザーを追加するとすべて正常に動作し、SelectOneMenuで新しいものを見ることができます。しかし、私はそれを削除すると(まだ選択されているフィールドがいっぱいではありませんが)それはまだリストにあります。もちろん、Beanメソッドのリストは、add userアクションとまったく同じです。何が問題なの?私はボタンのa4j:ajaxに切り替えようとしましたが、同じです(メッセージは送信されません)。 –