JSF 値バインディングは単方向ですか、それとも双方向ですか?
バッキング Bean データをクリアしても、ビューは古い値を保持します。これはJSFの仕組みですか?ビューをバッキング Bean と同期する方法を知りたいです。
はい、データバインディングは双方向です。しかし、これは次の 2 つの重要な質問に答えなければ、ほとんど意味がありません。
答えは次のとおりです。
これは、最初の直感に反して、次のことを意味します。 - 入力などのコンポーネントはその状態を保持し、バッキング Bean から切り離されます。これは、バッキング Bean との同期を行わずに (たとえば、フォームの他のコンポーネントが検証に失敗した場合に) 長時間保持することができます。
ライフサイクルを想像する最も簡単な方法は次のとおりです。
要点は次のとおりです。
木目に沿ってJSFを使ってみると、本当に使い心地がいいです。Web フレームワークがどのように機能するかについてのあなたのアイデア (バリデーターでのビジネス検証の使用、コンバーター内でのモデルの変更、コンストラクターからのデータベースの読み取りなど) に逆らって JSF を曲げようとする場合は、多くの BalusC の助けが必要になります。 :-)
あなたが何を求めているのか正確にはわかりませんが、はい、Bean がリクエストスコープ以外の場合、HTML フォームコントロールに以前の値が入力されます。
Bean がビュー スコープまたはセッション スコープの場合でも、Bean のアクション メソッド (commandLink/commanButton アクション) でモデル値を操作することにより、レンダリングされた値を制御できます。
後で同じページにアクセスしたときに値をクリアしたい場合は、ページ Bean のリクエスト スコープを作成する必要があります。
必要に応じて、値ではなくバインディングを使用して完全な制御のために UIComponents を直接マイクロ管理し、bean.eg で直接 UIComponents を作成および管理できます。
<h:inputText binding="#{bean.inputComponent" />
そしてあなたのコードで
public class myBean {
private UIInput inputComponent;
public UIComponent getInputComponent() {
// create your UIComponent here, and manage values in your command methods
}
public void setInputComponent(UIComponent component) {
inputComponent = component;
}
}
JSF は、指定されたとおりに実行します。
ビューを更新するには (Bean に変更を加えた後) 、元のビューにポストバックするか、アクション メソッドから null/void を返すか、クライアント ID (または @form などの他の受け入れられる値) を指定する必要があります。 ) 実行 (更新) され、後でBean に変更を加えるコンポーネントに添付されたタグの属性としてレンダリング (更新) されるコンポーネントの。<f:ajax>