JSF 2.0の欠点?正直なところ、基本的なWeb開発(HTML / CSS / JS、サーバー側とクライアント側など)および基本的なJavaサーブレットAPI(要求/応答/セッション)に関する確かな背景知識がない場合の、比較的急な学習曲線は別として、転送/リダイレクトなど)、深刻な欠点は頭に浮かびません。JSFの現在のリリースでは、初期の段階で得られたネガティブなイメージを取り除く必要があり、その間にいくつかの重大な欠点がありました。
JSF 1.0(2004年3月)
これは最初のリリースでした。コア領域とパフォーマンス領域の両方で、知りたくないバグが散らばっています。あなたのウェブアプリケーションは、あなたが直感的に期待するように常に機能するとは限りませんでした。あなたは、開発者として泣き叫びます。
JSF 1.1(2004年5月)
これはバグ修正リリースでした。パフォーマンスはまだそれほど改善されていません。また、大きな欠点が1つありました。JSFページでHTMLを完全にインライン化できないことです。すべてのプレーンバニラHTML は、JSFコンポーネントツリーの前にレンダリングされます。あなたはすべてのプレーンバニラを包む必要があります<f:verbatim>
JSFコンポーネントツリーに含まれるように、タグでます。これは仕様どおりですが、多くの批判を受けています。ao JSF / Faceletsも参照してください:JSF / FaceletsとHTMLタグを混在させるのはなぜ良いことではないのですか?
JSF 1.2(2006年5月)
これは、Ryan Lubkeが率いる新しいJSF開発チームの最初のリリースでした。新しいチームは多くの素晴らしい仕事をしました。仕様にも変更がありました。主な変更点は、ビューの処理の改善です。これにより、JSFがJSPから完全に切り離されるだけでなく、JSPとは異なるビューテクノロジを使用できるようになるだけでなく、開発者は<f:verbatim>
タグを煩わせることなく、JSFページに単純なHTMLをインライン化できます。新しいチームのもう1つの主な焦点は、パフォーマンスの向上でした。Sun JSFリファレンス実装1.2(Mojarraとコードネームが付けられた)の存続期間中 2008年頃のビルド1.2_08以降、、実質的にすべてのビルドは、通常の(マイナー)バグフィックスの隣に(メジャー)パフォーマンスの改善が施されて出荷されました。
JSF 1.x(1.2を含む)の唯一の重大な欠点は、要求スコープとセッションスコープの間にスコープが不足していること、いわゆる会話スコープです。これにより、開発者は、検証、変換、モデルの変更、およびアクションの呼び出しをより適切に処理するために、後続のリクエストで初期モデルデータを保持したい場合は常に、非表示の入力要素、不要なDBクエリ、および/またはセッションスコープの悪用に煩わされました。複雑なWebアプリケーション。MyFaces Tomahawk <t:saveState>
コンポーネント、JBoss Seam会話スコープ、MyFaces Orchestra会話フレームワークなど、後続のリクエストで必要なデータを保持するサードパーティライブラリを採用することで、痛みを和らげることができます。
HTML / CSS純粋主義者のもう1つの欠点は、JSFが:
ID区切り文字としてコロンを使用id
して、生成されたHTML出力でHTML要素の一意性を保証することです。特に、コンポーネントがビューで2回以上再利用される場合(コンポーネントの反復、コンポーネントなど) 。これはCSS識別子では無効な文字であるため\
、CSSセレクターでコロンをエスケープするためにを使用する必要があり、その結果、#formId\:fieldId {}
またはのように見苦しく奇妙なセレクターになり#formId\3A fieldId {}
ます。CSSセレクターでJSFが生成したHTML要素IDをコロン「:」で使用する方法もご覧ください。ただし、純粋主義者でない場合は、次もお読みください。デフォルトでは、JSFは使用できないIDを生成します。これは、Web標準のCSS部分と互換性がありません。
また、JSF 1.xにはAjax機能が付属していません。実際には技術的な欠点ではありませんが、その期間のWeb 2.0の誇大宣伝により、機能上の欠点になりました。Exadelは早い時期にAjax4jsfを導入しました。Ajax4jsfは、長年にわたって徹底的に開発され、JBoss RichFacesコンポーネントライブラリのコア部分になりました。別のコンポーネントライブラリには、組み込みのAjaxパワーも含まれており、よく知られているのはICEfacesです。
JSF 1.2の存続期間のほぼ半分に、新しいXMLベースのビュー技術であるFaceletsが導入されました。これは、特にテンプレートの領域において、JSPを超える大きな利点をもたらしました。
JSF 2.0(2009年6月)
これは、Ajaxを流行語として使用した2番目のメジャーリリースでした。多くの技術的および機能的な変更がありました。JSPは、デフォルトのビュー技術としてFaceletsに置き換えられ、Faceletsは、純粋なXML(いわゆる複合コンポーネント)を使用してカスタムコンポーネントを作成する機能で拡張されました。JSF2.0以降のビュー定義言語としてFaceletsがJSPよりも好まれる理由も参照してください。
Ajaxパワーは<f:ajax>
、Ajax4jsfと非常に類似しているコンポーネントのフレーバーで導入されました。詳細ファイルを可能な限り削除するために、アノテーションと設定より規約の拡張機能が導入されましたfaces-config.xml
。また、デフォルトのネーミングコンテナID区切り文字:
が構成可能になったため、HTML / CSSの純粋主義者は安心できました。あなたがやらなければならないことは、としてそれを定義することであるinit-param
でweb.xml
名前でjavax.faces.SEPARATOR_CHAR
、あなたはどこにでもクライアントIDの中の文字を自分で使用していないことを確実にすること、など-
。
最後になりましたが、ビューのスコープという新しいスコープが導入されました。前述のように、JSF 1.xのもう1つの主要な欠点を排除しました。Bean @ViewScoped
を宣言するだけで、後続の(会話型)リクエストでデータを保持するためのあらゆる方法を煩わせることなく、会話スコープを有効にできます。@ViewScoped
あなたは後で提出し、同じビューにナビゲートしているとして、Beanは限り生きてます(独立して開いたブラウザタブ/ウィンドウの!)、同期または非同期(アヤックス)。参照してください管理Beanで表示し、Requestスコープの違いとどのように右の豆の範囲を選択するには?
JSF 1.xの実質的にすべての欠点が解消されましたが、JSF 2.0固有のバグがあり、それがショートッパーになる可能性があります。@ViewScoped
タグハンドラに失敗した部分状態省鶏の卵の問題に起因します。これはJSF 2.2で修正され、Mojarra 2.1.18でバックポートされました。また、HTML5などのカスタム属性の受け渡しdata-xxx
はサポートされていません。これは、JSF 2.2で新しいパススルー要素/属性機能によって修正されました。さらに、JSF実装Mojarraには独自の一連の問題があります。それらの多くは、の直感的でない動作<ui:repeat>
、新しい部分的な状態保存の実装、実装が不十分なフラッシュスコープに関連しています。それらのほとんどはMojarra 2.2.xバージョンで修正されています。
JSF 2.0の頃に、jQueryとjQuery UIに基づいてPrimeFacesが導入されました。最も人気のあるJSFコンポーネントライブラリになりました。
JSF 2.2(2013年5月)
JSF 2.2の導入により、HTML5が流行語として使用されましたが、これは技術的にはすべての古いJSFバージョンでサポートされていました。JavaServer Faces 2.2およびHTML5のサポートも参照してください。なぜXHTMLがまだ使用されているのですか。最も重要な新しいJSF 2.2機能は、カスタムコンポーネント属性のサポートです。これにより、カスタムのテーブルレスラジオボタングループなどの可能性の世界が広がります。
実装固有のバグと、EJBをバリデーター/コンバーターに挿入できない(JSF 2.3ですでに修正されている)など、いくつかの「迷惑な小さなこと」を除いて、JSF 2.2仕様にはそれほど大きな欠点はありません。
コンポーネントベースのMVCとリクエストベースのMVC
JSFの主な欠点は、生成されたHTML / CSS / JSを細かく制御できないことを選択する人もいます。それはJSF独自のものではありません。それは、それがコンポーネントベースの MVCフレームワークであり、リクエスト(アクション)ベースの MVCフレームワークではないからです。HTML / CSS / JSの高度な制御がMVCフレームワークを検討する際の主要な要件である場合、コンポーネントベースのMVCフレームワークではなく、Spring MVCなどのリクエストベースのMVCフレームワークを検討している必要があります。HTML / CSS / JSのボイラープレートをすべて自分で作成する必要があることだけを考慮に入れる必要があります。リクエストMVCとコンポーネントMVCの違いもご覧ください。
以下も参照してください。