我想做一個簡單的管理頁面來管理用戶列表。 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已填充。
作爲從BalusC往常一樣和寶貴的幫助 - 非常感謝:> – 2012-03-12 15:18:46
希望我仍然可以在一些幫助指望原因是對同一個項目。您的建議可行,但我還有其他問題。當我添加用戶時,一切正常,我可以在SelectOneMenu中看到新的。但是,當我刪除它時,它仍然在列表中(儘管選中時沒有填充字段)。當然,我更新bean方法中的列表與添加用戶操作完全相同。可能是什麼問題?我試着切換到a4j:ajax的按鈕,但它是一樣的(加上消息不發送)。 – 2012-03-12 22:05:17