ViewScoped に変更しようとしましたが、プロパティにアクセスするたびに Bean の「コンストラクターを呼び出す」ことになります...
その間、私は多くのことを試しましたが、何も期待どおりに機能しませんでした:
私がそれを機能させることができる唯一のケースは、コントローラーを「SessionScoped」に設定することです。しかし、「クリーニング」値を処理し、多くの不要な (初期化された) Bean を発生させる必要があるため、これは良いアプローチではないと思います...
周りで遊ぶための簡単なプロジェクトを作成しました。動作しているセッション スコープ バージョンを次に示します。しかし、スコープを変更すると、保存ボタンを押すときに現在のユーザーを「リロード」する必要があります。そして、リクエストパラメーターにアクセスできないと、それを達成する方法がわかりません。
(「フォーム」でユーザーIDを再度渡そうとしましたが、「初めて」IDを渡すのに問題があります)
これが私のサンプルです。(ゲッターとセッターは利用可能であり、簡潔にするために言及されていません)
ユーザークラス:
public class User {
private String firstname;
private String lastname;
public User (String f, String l){
this.firstname = f;
this.lastname = l;
}
}
DBシミュレーター:
@Named("dbSimulator")
@SessionScoped
public class DBSimulator implements Serializable {
/**
*
*/
private static final long serialVersionUID = 659826879566280911L;
private Map<String, User> data;
public DBSimulator() {
//Load data
User u1 = new User("Mickey", "Maus");
User u2 = new User("Peter", "Pan");
this.data = new HashMap<String, User>();
this.data.put("Mickey", u2);
this.data.put("Max", u1);
}
public List<User> getUserList(){
List<User> l = new LinkedList<User>();
for (Map.Entry<String, User> user : data.entrySet()) {
l.add(user.getValue());
}
return l;
}
public void saveUser(User user){
this.data.put(user.getFirstname(), user);
}
}
ユーザー管理コントローラー:
@Named
@SessionScoped
public class UserManagementController implements Serializable {
/**
*
*/
private static final long serialVersionUID = -4300851229329827994L;
@Inject
private DBSimulator dbSimulator;
private List<User> users;
public UserManagementController() {
System.out.println("UserManagementController:construct()");
}
@PostConstruct
public void LoadUsers(){
this.setUsers(this.dbSimulator.getUserList());
}
}
ユーザー編集コントローラー
@Named
@SessionScoped
public class UserEditController implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1867483972880755108L;
@Inject
private DBSimulator dbSimulator;
private User user;
public UserEditController() {
System.out.println("UserEditController:construct()");
}
public String activateUser(User user){
this.setUser(user);
System.out.println("setting User");
return "userEdit";
}
public String save(){
//Save user
this.dbSimulator.saveUser(user);
return "userManagement";
}
}
最後に両方の XHTML ファイル: UserManagement.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:outputText value="Select user to edit." />
<h:dataTable value="#{userManagementController.users}" var="user">
<h:column>
<f:facet name="header">Firstname</f:facet>
<h:outputText value="#{user.firstname}" />
</h:column>
<h:column>
<f:facet name="header">Lastname</f:facet>
<h:outputText value="#{user.lastname}" />
</h:column>
<h:column>
<f:facet name="header">Options</f:facet>
<h:form>
<h:commandLink action="userEdit" actionListener="#{userEditController.activateUser(user)}" value="edit user" />
</h:form>
</h:column>
</h:dataTable>
</h:body>
</html>
UserEdit.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form>
<h:inputText value="#{userEditController.user.firstname}"></h:inputText>
<br /><br />
<h:inputText value="#{userEditController.user.lastname}"></h:inputText>
<br /><br />
<h:commandButton value="save" action="#{userEditController.save}"></h:commandButton>
</h:form>
</h:body>
</html>
ps .: 誰にも私のコードを「修正」してほしくありません - しかし、完全な例があれば誰かが見ることができるかもしれません:)
ViewScoped Bean を操作すると、次のコンソール出力が生成されます。
[pageload]
12:07:49,126 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:07:49,334 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:07:49,341 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
[edit click]
12:08:35,410 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,411 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,412 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,413 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,414 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,414 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,415 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,416 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,416 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,417 INFO [stdout] (http--0.0.0.0-8090-3) UserManagementController:construct()
12:08:35,476 INFO [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()
12:08:35,478 INFO [stdout] (http--0.0.0.0-8090-3) setting User
12:08:35,494 INFO [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()
12:08:35,497 INFO [stdout] (http--0.0.0.0-8090-3) UserEditController:construct()
(ViewScoped) UserEditController はユーザーの設定後に 2 回再構築されているため、明らかにユーザーはもう設定されていません...