[解決済み】Java Server Faces 2.0の主なデメリットは何ですか?
質問
昨日、Java Server Faces 2.0のプレゼンテーションを見ましたが、私は現在ASP.NET MVCとjQueryの開発者として満足していますが、本当に印象的でした。JSFの最も気に入った点は、大量のAJAX対応UIコンポーネントで、特にAJAXを多用するサイトでは、ASP.NET MVCよりはるかに速く開発できるようだ。特にAJAXを多用するサイトでは、ASP.NET MVCよりはるかに速く開発できるようです。
JSFの良さばかりが強調されたプレゼンだったので、その裏側も聞いてみたいです。
そこで質問です。
- Java Server Faces 2.0の主なデメリットは何ですか?
- JSFの開発者が、JSFの代わりにASP.NET MVCの使用を検討する理由は何でしょうか?
どのように解決するのか?
JSF2.0のデメリット?正直なところ、JSF 2.0に関する確かな背景知識がない場合、学習曲線が比較的急であることを除けば、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 コンポーネントツリーに含まれるようにします。これは仕様通りなのですが、多くの批判が寄せられています。a.o.も参照してください。
JSF/Facelets:なぜ、JSF/FaceletsとHTMLタグを混ぜるのは良くないのですか?
JSF 1.2 (2006年5月)
Ryan Lubkeが率いる新しいJSF開発チームの最初のリリースでした。新チームは多くの素晴らしい仕事をした。また、仕様の変更もありました。大きな変更点は、ビューハンドリングの改善です。これはJSPからJSFを完全に切り離し、JSPとは異なるビュー技術を使えるようにしただけでなく、開発者がJSFページで
<f:verbatim>
タグを使用します。新チームのもう一つの大きな焦点は、パフォーマンスの改善でした。Sun JSF Reference Implementation 1.2(当時のコードネームは
モジャラ
2008年頃のビルド1.2_08以降、実質的にすべてのビルドで、通常の(マイナー)バグフィックスに加え、(メジャー)パフォーマンスの改善が行われ出荷されています。
JSF 1.x(1.2を含む)の唯一の重大な欠点は、JSF 1.xで使用されていた
リクエスト
と
セッション
スコープ、いわゆる
会話
スコープを使用します。このため開発者は、より複雑なウェブアプリケーションで検証、変換、モデルの変更、アクションの起動を正常に処理するために、後続のリクエストで最初のモデルデータを保持したい場合、隠し入力要素や不要なDBクエリ、セッションスコープの悪用に煩わされることになりました。この苦痛は、次のような後続のリクエストに必要なデータを保持するサードパーティライブラリを採用することによって和らげることができます。
MyFacesトマホーク
<t:saveState>
コンポーネントを使用します。
JBossシーム
会話スコープと
MyFacesオーケストラ
会話のフレームワークです。
HTML/CSSピュアリストにとってもう一つの欠点は、JSFがコロン
:
をID区切り文字として使用することで、HTML要素の一意性を確保します。
id
特に、コンポーネントがビュー内で複数回再利用される場合 (テンプレート化、コンポーネントの反復処理など)、生成される HTML 出力に含まれます。これは CSS 識別子の中では不正な文字であるため、このような場合は
\
を使用すると、CSS セレクタでコロンをエスケープするため、次のような醜く奇妙なセレクタになります。
#formId\:fieldId {}
あるいは
#formId\3A fieldId {}
. 以下もご参照ください。
JSFが生成したコロン":"付きのHTML要素IDをCSSセレクタで使用するには?
しかし、もしあなたが純粋主義者でないなら、次の記事も読んでください。
デフォルトでは、JSFはWeb標準のCSS部分と互換性のない、使えないidを生成します。
.
また、JSF 1.xはAjaxの機能を最初から搭載していませんでした。技術的な欠点というほどではありませんが、当時のWeb 2.0の宣伝のために、機能的な欠点となりました。 エグザデル は早くからAjax4jsfを導入しており、この数年間で徹底的に開発され JBoss RichFaces コンポーネントライブラリです。他のコンポーネント・ライブラリも同様に、ビルトインのAjaxパワーで出荷されました。 ICEfaces .
JSF 1.2の寿命の約半分、新しいXMLベースのビュー技術が導入されました。 フェイスレット . これは、特にテンプレートの領域で、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のもうひとつの大きな欠点を解消するものです。あなたはただ、ビーンを宣言するだけです。
@ViewScoped
を使えば、その後の (会話の) リクエストでデータを保持するためにあれこれ悩むことなく、会話スコープを有効にすることができます。A
@ViewScoped
同期または非同期(Ajax)で、同じビュー(開いたブラウザのタブ/ウィンドウとは無関係!)に続けて投稿したり移動したりする限り、Beanは生き続けます。以下も参照してください。
マネージドBeanにおけるViewスコープと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バージョンで修正されています。
JSF2.0の頃。 PrimeFaces は、jQuery と jQuery UI をベースとして導入されました。これは、最も人気のあるJSFコンポーネント・ライブラリとなった。
JSF 2.2 (2013年5月)
JSF 2.2の導入に伴い、HTML5がバズワードとして使われるようになりましたが、これは技術的にはすべての古いバージョンのJSFでサポートされていたに過ぎないのです。以下もご参照ください。 JavaServer Faces 2.2とHTML5のサポート、なぜXHTMLがまだ使われているのか? . JSF 2.2の最も重要な新機能は、カスタムコンポーネント属性のサポートで、これにより、次のような可能性が開けます。 カスタムテーブルレスラジオボタングループ .
実装固有のバグや、バリデータ/コンバータにEJBをインジェクトできない(JSF2.3ですでに修正済み)など、いくつかの" annoying little things" を除けば、JSF 2.2 仕様には実際に大きな欠点がありません。
コンポーネントベースMVCとリクエストベースMVCの比較
JSFの大きな欠点は、生成されるHTML/CSS/JSをほとんど細かく制御できないことだと考える人もいるかもしれません。それはJSF自身の問題ではなく、単にそれが コンポーネントベース MVCフレームワークであり リクエスト(アクション)ベース MVCフレームワークです。もしHTML/CSS/JSを高度に制御することがMVCフレームワークを検討する際の大きな要件であれば、すでにコンポーネントベースのMVCフレームワークではなく、以下のようなリクエストベースのMVCフレームワークを見ているはずです。 Spring MVC . ただ、HTML/CSS/JSのボイラープレートをすべて自分で書かなければならないことだけは考慮する必要があります。以下も参照してください。 リクエストMVCとコンポーネントMVCの違い .
こちらもご覧ください。
- JSF、Servlet、JSPの違いは何ですか? (基本を理解するために)
- JSFを使ったテーブルレスCSSレイアウトの開発 (JSFに関するもう一つの神話)
- JSFとプレーンなHTML/CSS/JS/jQueryの比較 (JSFが間違った選択である場合)
- ウェブアプリケーションにおけるデザインパターン (MVCの背後にある思想を説明します。)
関連
-
[解決済み】VS 2015でコントローラからビューを追加できない : "選択されたコードジェネレータの実行にエラーが発生しました"
-
[解決済み] Razor View throwing "The name 'model' does not exist in the current context".
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
-
[解決済み】JSFリソースライブラリは何のためにあり、どのように使用すべきですか?
-
[解決済み】MVC4 DataType.Date EditorForがChromeで日付の値を表示しない、Internet Explorerでは問題なし。
-
[解決済み】ASP.NET MVC 3 Razor - EditorForにクラスを追加する。
-
[解決済み] MVCとRazorにおけるHtml.TextboxForとHtml.EditorForの相違点
-
[解決済み] ASP.Net MVCでRequest on Controllerをモック化する方法とは?
-
[解決済み] ASP.NET MVC Html.ActionLinkにアンカータグを含める
-
[解決済み] Entity Frameworkのデータベースを再作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] glyphicons-halflings-regular.woff2 not foundに関するエラーを削除する方法
-
[解決済み] ビーンスコープを正しく選ぶには?
-
[解決済み] デザインパターン Webベースアプリケーション【終了しました
-
[解決済み】サーブレットはどのように動作するのですか?インスタンス化、セッション、共有変数とマルチスレッド
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
-
[解決済み】MVC 4 @Scripts "does not exist".
-
[解決済み】Java / Jakarta EEのWeb開発、何から始めてどんなスキルが必要ですか?[終了しました]
-
[解決済み] ASP.Net MVC デフォルトの HTTP ヘッダーを削除する方法は?
-
[解決済み] X-SourceFilesヘッダーは何をするものですか?
-
[解決済み] アクションリンクでエリア名を指定するには?