JSF でのベスト プラクティスは何ですか。<h:form>
たとえば、テンプレートに 1 つのメインを作成し、すべてのコンテンツを内部に配置するか、パーツごとにいくつかのフォームを作成します。たとえば、ページに 2 つの論理コード ブロックがある場合、これらのブロックをラップする必要があります。 2つの別々のフォームで???
1 に答える
これは広すぎる質問であり、JSF とは何の関係もありません。HTMLの理解とデザインの問題です。
JSF の詳細をすべて抽象化すると、レンダリングされたコンポーネントがプレーンな HTML であることがわかります<form>
。仕様を思い出すと、フォームは次のようになります。
通常のコンテンツ、マークアップ、コントロールと呼ばれる特別な要素 (チェックボックス、ラジオ ボタン、メニューなど)、およびそれらのコントロールのラベルを含むドキュメントのセクション。ユーザーは通常、処理のためにエージェントにフォームを送信する前に、フォームのコントロール (テキストの入力、メニュー項目の選択など) を変更してフォームを「完成」させます (たとえば、Web サーバー、メール サーバーなど)。
したがって、最終的にフォーム全体がサーバーに送信されます。JSF などのコンポーネントベースのフレームワークの場合、エラーがなければ、コンポーネントのバインドされた値によって、送信されたデータがバッキング Bean に取り込まれます。
しかし、どのようなデータが提出されるのでしょうか? フォーム内のすべてのデータ。したがって、1 つのグローバル フォームがある場合、関連のないすべての情報が収集されることを意味します: ユーザーの資格情報、製品の選択、設定の選択など。ほとんどの場合、目的の機能は得られませんが、予期しない結果が生じる可能性があります。
問題は、懸念事項が混在していたことです。1 つのフォームに、一緒に送信するように設計されていない関連性のないデータが含まれていました。これにより、ユーザー認証/ログアウト用のフォーム、ユーザー設定を保存するための別のフォーム、製品の選択を維持するための別のフォームなど、ユーザー対話ごとに 1 つのフォームが残ります。ネストフォームの問題で、それを理解するのに時間がかかります。
そのフォームを配置する場所の選択に関しては、論理的な分離にも依存します。すべてのページにユーザーのログイン/ログアウトがある場合は、マスター テンプレートに配置できます。ビューごとのフォームは、テンプレート クライアントに配置される可能性があります。さらに、機能を区別するために横に並べると便利な場合があります。
また、フォームによって期待される動作が変わる場合があります。最後の例: ユーザーによる製品の選択。2 つのケースを考えてみましょう。
最初の1つ:
<h:form>
<ui:repeat value="#{bean.purchasedProducts}" var="product">
<h:outputText value=#{product.name}/>
<h:inputText value=#{product.quantity}/>
<h:commandButton value="Change"/>
</h:dataTable>
</h:form>
2番目のもの:
<ui:repeat value="#{bean.purchasedProducts}" var="product">
<h:form>
<h:outputText value=#{product.name}/>
<h:inputText value=#{product.quantity}/>
<h:commandButton value="Change"/>
</h:form>
</h:dataTable>
最初の例はすべての製品を更新しますが、2 番目の例は関連する製品のみを更新します。
最後に、「ベスト プラクティス」や「普遍的な解決策」はありません。HTML 文書を設計するときは、関心の分離から離れた方がよいと思います。
そして、はい、私は質問を閉じるために投票しています。