[解決済み] JSF1.2からJSF2.0への移行について
質問
で書かれたかなり大きなアプリを扱っています。 JSF 1.2 . JSF 1.2はもう6年ほど前のものです。JSF 2.0にアップグレードする必要があります。これはどれくらいの痛みを伴うのでしょうか?私は、カスタムタグのいくつかの属性が変更されていることなどに気づきました。
どのように解決するのですか?
痛み
JSF 1.2 から 2.0 へのアップグレードの辛さは、現在使用しているビューテクノロジーとこれから使用したいビューテクノロジーに依存します。
- JSP 2.x から JSP 2.x = ほとんど手間がかからない。
- Facelets 1.x から Facelets 2.0 = ほとんど手間がかからない。
- JSP 2.x から Facelets 2.0 = 大変な労力。カスタムコンポーネントもある場合は、この倍。
基本的な変更点
ビューテクノロジーの切り替えに関係なく 少なくとも は以下のステップを実行する必要があります。
-
JSF 1.2 の JAR を
/WEB-INF/lib
にある JSF 1.2 JAR を削除します (もしあれば)。 -
JSF 2.0 JARのドロップを
/WEB-INF/lib
(JSF 1.2がサーブレットコンテナで提供されている場合、クラスロードのポリシーを変更して、サーブレットコンテナのライブラリの前にウェブアプリケーションのライブラリを最初にロードするようにしたいかもしれません。 アプリケーションサーバーにおけるJSF2クラスロードの問題 ). -
のルート宣言を更新する。
faces-config.xml
をJSF 2.0仕様に準拠するように更新する。<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
注意: JSF 2.2以降を使用している場合、JSF 2.1では
http://xmlns.jcp.org
の代わりに、名前空間ドメインhttp://java.sun.com
の代わりに名前空間ドメインを使用します。 -
のルート宣言が
web.xml
は既に準拠し 少なくとも サーブレット 2.5。JSF 2.0は2.4以下では動きません ( ハック可能ですが ).<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="YourWebappID" version="2.5">
注意: Servlet 3.0 以降を使用している場合は、Servlet 3.0 以降を使用する前に
http://xmlns.jcp.org
の代わりに、名前空間ドメインhttp://java.sun.com
の代わりに名前空間ドメインを使用します。
JSP 2.x から JSP 2.x への移行
もし、あなたが JSP 2.x を使っていて を維持する を使いたいのであれば、基本的に何も変更する必要はありません。
段階的なアップグレード
すでにサフィックスを使用している場合
url-pattern
に対して
FacesServlet
のように
*.jsf
であるならば、その後に
FacesServlet
が最初にスキャンするのは
*.xhtml
ファイルをスキャンし、それが存在しない場合は
*.jsp
ファイルをスキャンします。これにより、URLを変更することなく、舞台裏でJSPからFaceletsに徐々に変換する余地が生まれます。
しかし、もしあなたがプレフィックス
url-pattern
のように
/faces/*
のように、JSPからFaceletsに徐々にアップグレードしたい場合は、これを
*.jsf
に変更し、おそらく既存の JSP ページのすべてのリンクも変更する必要があります。
新しいJSF 2.0が提供する暗黙のナビゲーションは、ファイルの存在をスキャンしないことだけを念頭に置く必要があり、その場合、それは
outcome.xhtml
に行くということです。そのため、もしあなたが
*.jsp
から来るか、または
Facelets 1.x から Facelets 2.0 への移行
もしあなたが Facelets 1.x を使っていて、JSF 2.0 が提供する Facelets 2.0 を使用したい場合は、以下の追加手順を実行する必要があります。
-
から Facelets 1.x JAR を削除します。
/WEB-INF/lib
. -
Facelets 1.x の削除
FaceletViewHandler
からfaces-config.xml
. -
任意のカスタム
FaceletViewHandler
を拡張するために、実装を更新する必要があります。ViewHandlerWrapper
を拡張するように更新する必要があります。 -
必要ありませんが、クリーンアップのため、Facelets 1.x 関連の
<context-param>
の値をweb.xml
のように、Facelets 2.0ではすでにデフォルトになっているものです。javax.faces.DEFAULT_SUFFIX
の値で*.xhtml
. -
Facelets 2.0に準拠するために、既存のFacelet taglib XMLのルート宣言を更新しました。
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="2.0">
注意: JSF 2.2以降を使用している場合、JSF 2.1では
http://xmlns.jcp.org
の代わりに、名前空間ドメインhttp://java.sun.com
の代わりに名前空間ドメインを使用します。
基本的にはこれでいいはずです。
JSP 2.x から Facelets 2.0 への移行
もしあなたが JSP 2.x をビューテクノロジーとし、アップグレードする場合は フェイスレット 2.0 にアップグレードしたい場合、サイトが稼動する前に多くの変更を行う必要があります。基本的には、ここでビューテクノロジーを変更することになります。
マスター ページの変更
すべてのマスターページで、以下の基本的なJSPテンプレートを変更する必要があります...
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html>
<f:view>
<html lang="en">
<head>
<title>JSP page</title>
</head>
<body>
<h:outputText value="JSF components here." />
</body>
</html>
</f:view>
...次のような基本的なFaceletsのテンプレートになります。
<!DOCTYPE html>
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>XHTML page</title>
</h:head>
<h:body>
<h:outputText value="JSF components here." />
</h:body>
</html>
注意: JSF 2.2以降を使用している場合、JSF 2.1では
http://xmlns.jcp.org
の代わりに、名前空間ドメイン
http://java.sun.com
の代わりに名前空間ドメインを使用します。
ページの変更を含める
既存の JSP ページがうまく設計されている場合、ページ内のどの行にも
スクリプトレット
のコードはなく、また
<jsp:include>
を唯一の JSP 固有のタグとして使用します。からどれかを変更する必要があります。
<jsp:include page="include.jsp" />
から
<ui:include src="include.xhtml" />
基本的なJSPのインクルードページのテンプレートは...
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<f:subview id="include">
<h:outputText value="JSF components here." />
</f:subview>
...は、以下の基本的なFaceletsのインクルードページテンプレートに変更する必要があります。
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:outputText value="JSF components here." />
</ui:composition>
注意: JSF 2.2以降を使用している場合、JSF 2.1では
http://xmlns.jcp.org
の代わりに、名前空間ドメイン
http://java.sun.com
の代わりに名前空間ドメインを使用します。
カスタムコンポーネントの変更
以下のように、JSP TLD ファイルを Facelets TLD ファイルに変更する必要があります。 Mojarra 移行ガイド .
余波
移行手法に関わらず、徐々に
faces-config.xml
を新しい JSF 2.0 のアノテーションによって、あるいはさらに
CDI
. 任意の
<managed-bean>
によってアノテーションすることができます。
@ManagedBean
:
@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
次は
@RequestScoped
の次は
@ViewScoped
,
@SessionScoped
そして
@ApplicationScoped
を利用できます。を省略した場合は
name
属性を省略すると
@ManagedBean
を指定すると、1文字目を小文字にしたクラス名がデフォルトになります。
@ManagedBean
@RequestScoped
public class SomeBean {}
この例では、次のようになります。
#{someBean}
.
任意の
<managed-property>
を使ってアノテーションすることができます。
@ManagedProperty
:
@ManagedProperty("#{otherBean}")
private OtherBean otherBean;
任意の
<validator>
にアノテーションを付けることができます。
@FacesValidator
:
@FacesValidator("someValidator")
public class SomeValidator implements Validator {}
任意の
<converter>
にアノテーションを付けることができます。
@FacesConverter
@FacesConverter("someConverter")
public class SomeConverter implements Converter {}
任意の
<renderer>
にアノテーションを付けることができます。
@FacesRenderer
@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}
任意の
<navigation-case>
で、XHTML ページのファイル名を
<from-outcome>
と
<to-view-id>
になるので、削除することができます。
を暗黙のうちに
されます。これは、ターゲットビューのファイル名に一致するようにすべての結果の値を変更することによって、徐々に行うことができます。
最後に、同じタブ/ウィンドウ内の後続のリクエストでビーンデータを保持する唯一の理由でセッションに置かれた任意のセッションスコープドビーンは、よりよくマークされることができます。
@ViewScoped
なぜなら、この方法では、エンドユーザーが異なるタブ/ウィンドウで同じページを開いたときに、Beanは影響を受けないからです。
コンポーネント・ライブラリ
この回答では、PrimeFaces/RichFaces/IceFacesのようなサードパーティのコンポーネントライブラリを考慮に入れていないことに留意してください。一般的には、彼らの指示に従って、コンポーネントライブラリをJSF 2.0互換のバージョンにアップグレードすることで十分です。ベストは、単体テストを書き、アップグレードの前と後にそれらを実行し、問題があれば個別に修正することです。
特定のコンポーネントライブラリの移行に関して、少なくともいくつかの有用なリンクがあります。
PrimeFacesにはPrimeFaces 1.xから2.xへの移行ガイドがありません。PrimeFaces 1.xはすでにFacelets 1.xを必要とするので、Facelets 1.xから2.xへの移行ステップに従うだけでいいのです。しかし、PrimeFacesの
2.x から 3.x (およびそれ以降) への移行ガイドがあります。
は、PrimeFaces 1.xから3.x(またはそれ以上)への移行にも適用されるかもしれません。Tomahawkには移行ガイドもありません。基本的に変更する必要があるのはJARだけで、必要であればすべての
<t:saveState>
の参照を取り除くことです。
関連
-
Dateが型に解決できない問題を解決する
-
プロローグでのコンテンツは禁止されています
-
プロジェクトの依存関係を解決できなかった 解決
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み】JSF、Servlet、JSPの違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
テストが見つかりませんでした
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。