1

ユーザーリストを管理するための簡単な管理ページを作成しようとしています。jsf コードは次のようになります。

 <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アクションメソッドに渡されません。私のビーンはビュースコープです(selectManyListBoxの検証エラーのために使用する必要がありました)。Java コードは次のとおりです (これまでの addUser メソッドは、ロガー メソッドを送信し、ログインが存在するかどうか、および特権リストで sth が選択されているかどうかを確認するだけです):

@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 "";
        }

興味深いことに、クリアリング メソッドに immediate="true" を追加してから、sth を追加しました。逆のことが起こります - リストは問題ありませんが、inputTexts は埋められています。

4

1 に答える 1

1

いくつかの事実:

  1. はのvalueChangeListenerときに実行され!oldValue.equals(newValue)ます。
  2. はクライアント側のイベント リスナーvalueChangeListenerではありません。完全にサーバー側です。
  3. valueChangeListenerajax リクエストか通常のリクエストかは完全に独立しています。通常のフォーム送信を含む、すべてのタイプのリクエストで呼び出されます。

<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);
    // ...
}
于 2012-03-12T14:09:27.880 に答える