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