2

JSF でのベスト プラクティスは何ですか。<h:form>たとえば、テンプレートに 1 つのメインを作成し、すべてのコンテンツを内部に配置するか、パーツごとにいくつかのフォームを作成します。たとえば、ページに 2 つの論理コード ブロックがある場合、これらのブロックをラップする必要があります。 2つの別々のフォームで???

4

1 に答える 1

3

これは広すぎる質問であり、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 文書を設計するときは、関心の分離から離れた方がよいと思います。

そして、はい、私は質問を閉じるために投票しています。

于 2013-05-21T11:40:27.360 に答える