0

多くの場合、Web サイトに HTML コントロールまたは Facelets を追加したいと考えていますが、アクションを呼び出すときにこれらにアクセスするのは本当に簡単でしょうか?

アクションを実行するための次のコマンドリンクがあります

<h:commandLink action="#{MyBean.save}" value="">
    <f:verbatim><input type="button" value="Save"/></f:verbatim>
    <f:param name="id" value="#{MyBean.id}"/>
</h:commandLink>

アプリケーションがクラッシュしないように、Param は QueryString 状態を保存するためにあります。

これらのコンポーネントは、特にダイナミクスを作成している<input type="text" />場合<h:inputText value="hello" />は、サイトを立ち上げて実行するための基本です。

ただし、コントロールが何にもバインドされていない場合、または JavaScript で要素を追加できるリストボックスがある場合、commandLink または commandButton を実行するときにこれらにアクセスするにはどうすればよいでしょうか? コントロールを Bean にバインドする必要がありますか、または別の方法でこの FaceContext にアクセスして、リストボックス、入力テキスト、またはその他の必要なものの値を取得することは可能ですか?

4

2 に答える 2

2

JSF でレンダリングされたページを HTML と JavaScript の大きな塊として扱うのは難しい場合があります (これが問題の核心にあると思います)。クライアント上のアプリケーションに任意のフォーム コントロールを追加して、JSF フレームワークがそれらを解釈することを期待することはできません。JSF は事前定義されたコンポーネントを使用するため、コンポーネントはリクエストからの追加データを解釈する方法を知っている必要があります。最終的にはすべてサーブレットによって解釈される HTML フォームになるため、クライアントから送信されたデータは引き続きパラメーター マップに格納されますが、これらの値は JSF ライフサイクルを通過しないため、検証のメリットはありません。データバインディングなど

JSF コントロール ツリーは、他のウィジェット ツリー (Swing や SWT など) とよく似ています。

UIViewRoot
         |_HtmlForm
                  |_HtmlInputText
                  |_HtmlCommandButton

JSF コントロールは基本的に次のように機能します。

  • UIComponentインスタンスは値をカプセル化します (最初に JSP/Facelet から取り込まれます)。例: HtmlInputTextarea
  • ページがレンダリングされると、ライフサイクルはコンポーネントのRenderer実装を検索します。出力へのRendererwrites マークアップ
  • フォームが送信されると、同じレンダラーが入力パラメーター マップを調べて認識したキー付きの値を探し、最終的に (変換と検証の後) 新しい値を にプッシュしますUIComponent(モデルの値バインディングにプッシュする場合があります)。

リストボックスの具体的な例を見てみましょう - これはトリッキーなものです。JSF は、最終的に HTML の要素となるHtmlSelectManyListboxを提供します。SELECTクライアントで JavaScript を使用して DOM に子を追加することは可能ですOPTIONが、これはフォームの送信に関しては何の役にも立ちません。HTML 仕様を読むと、次のように書かれています。

選択したオプションのみが成功します。オプションが選択されていない場合、コントロールは成功せず、フォームの送信時に名前も値もサーバーに送信されません。

そのため、フォームが送信されると、ユーザーが選択したリスト要素のみがサーバーに送信されます。サーバーにすべての新しいデータを取得するには、いくつかの隠しフィールドが必要です。コア セットには、これを支援するコントロールはありません。

いくつかのオプションがあります:

于 2009-10-08T10:54:30.933 に答える
1

でアクセスできる標準のリクエスト パラメータ マップを使用して、ページ上の「非 JSF」コントロールから値を取得できます。

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()

あなたが呼び出すどんなアクションでも。MyBean.save()

于 2009-10-07T17:56:13.820 に答える