現在、jboss-seam-1.1.5.GA と JBoss AS 4.0.5 を使って開発を行っております。
★ <h:commandButton> と <s:button> の挙動差異について
クリック可能なリストを @dataModel と @dataModelSelection を使って実装し
ています。画面遷移は リスト画面 -> 項目修正画面(submit押下) -> リスト画
面と言う単純なものです。
===
@DataModel
private List<User> userList;
@DataModelSelection("userList")
@In(required=false) @Out(required=false)
private User user;
===
クリック可能リストからリンクする時は、<h:commandLink を使って JSF アクショ
ンリスナメソッド (今回は @Begin select()) を invoke します。
一方、編集画面の submit は @End modify() を invoke します。
この時、リスト画面では s:link を使うと、対話情報を伝播できず、NPE が発生
します。
<s:link id="links" value="#{usr.loginName}-2" action="#{userAction.select}"/>
下記を使うと対話情報を伝播できます。
<h:commandLink id="link" value="#{usr.loginName}" action="#{userAction.select}"/>
ドキュメント上では、対話情報の伝播の簡便化の為に s:link 等を用意している
と書いている気がするのですが、どの様に理解したらよいでしょうか?
★永続化のタイミングについて
また、編集画面で
<s:button action="#{userAction.userEdit}" value="submit2"/>
を使うと、user の値が変更されず永続化もされません。
編集画面の submit ボタンで実行する userEdit() ですが、
EntityManager の merge() 等は実行していないのに、データベースに永続化さ
れるようです。
どのタイミングで、永続化されると考えればよいでしょうか?
問題になってくるのは、アクションリスナの中でバリデーションを組んだ場合で、
例えば下記のような場合です。
@End
public String userEdit() {
log.info("<<<<< userEdit() <<<<<");
// 永続化はここで止めたい
if (! validUserName(user.getUserName())) {
// エラーメッセージ表示
log.info(">>>>> userEdit() >>>>>");
return null;
} else {
log.info(user.toString());
//em.merge(user); // <= コメントアウトしても永続化される
log.info(">>>>> userEdit() >>>>>");
return "/user";
}
}
画面遷移は止める事ができますが、この時点で永続化されてしまっているので、
ロールバックする事ができません。
以上、2点についてご教示いただけたら幸いです。
よろしくお願い致します。
_______________________________________________
Japan-jbug-seam mailing list
Japan-j...@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/japan-jbug-seam
お世話になっております。
seam の日本語 ML を作って頂いてありがとうございます。
早速投稿させて頂きました。
★永続化のタイミングについて