私はかなり大きなアプリを扱っています。JSFS1.2 の新機能JSF 1.2 は、現在約 6 年前のものです。JSF 2.0 にアップグレードする必要があります。これはどの程度面倒でしょうか? カスタム タグの一部の属性が変更されていることに気付きました。
ベストアンサー1
痛み
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 2.0 JARをドロップします
/WEB-INF/lib
(JSF 1.2がサーブレットコンテナによって提供されていた場合、クラスローディングポリシーを変更して、サーブレットコンテナライブラリの前にWebアプリケーションライブラリをロードすることをお勧めします。アプリケーションサーバーにおける 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 以降を使用している場合は、上記の XML スニペット全体
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 以降を使用している場合は、上記の XML スニペット全体
http://xmlns.jcp.org
ではなく、名前空間ドメインを使用します。http://java.sun.com
JSP 2.x から JSP 2.x
使用している場合JSP 2.xそしてしたい保つこれを使用する場合、基本的に他に何も変更する必要はありません。
徐々にアップグレード
url-pattern
すでにのサフィックスFacesServlet
( など)を使用している場合は、が最初にファイルをスキャンし、それが存在しない場合は ファイルをスキャンする*.jsf
ことを知っておくとよいでしょう。これにより、URL を変更せずに、バックグラウンドで JSP から Facelets に徐々に変換する余地が生まれます。FacesServlet
*.xhtml
*.jsp
url-pattern
ただし、 のようなプレフィックスを使用していて/faces/*
、JSP から Facelets に段階的にアップグレードしたい場合は、 を に変更する必要があり*.jsf
、既存の JSP ページ内のすべてのリンクも変更する必要がある可能性があります。
覚えておかなければならないのは、新しい JSF 2.0 が提供する暗黙的なナビゲーションでは、ファイルの存在をスキャンせず、outcome.xhtml
とにかく に移動するということです。したがって、 から来たり に移動したりする場合は*.jsp
、JSF 1.x の方法で viewid に を含める必要があります。
Facelets 1.x から Facelets 2.0 へ
使用している場合フェイスレット 1.xビューテクノロジーとしてJSF 2.0を使用したい場合フェイスレット 2.0、次の追加手順を実行する必要があります。
から Facelets 1.x JAR を削除します
/WEB-INF/lib
。FaceletViewHandler
からFacelets 1.x を削除しますfaces-config.xml
。カスタム
FaceletViewHandler
実装は拡張するために更新する必要があるViewHandlerWrapper
その代わり。必要ではありませんが、クリーンアップのために、の with 値のように、Facelets 2.0 で既にデフォルトになっているFacelets 1.x 関連の
<context-param>
値をすべて から削除します。web.xml
javax.faces.DEFAULT_SUFFIX
*.xhtml
既存の Facelet タグライブラリ XML のルート宣言を更新して、Facelets 2.0 に準拠します。
<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 以降を使用している場合は、上記の XML スニペット全体
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 以降を使用している場合は、上記の XHTML スニペット全体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 include ページ テンプレートに変更する必要があります。
<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 以降を使用している場合は、上記の XHTML スニペット全体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
、最初の文字が小文字になったクラス名がデフォルトになります。
@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>
してもかまいません。暗黙的に完了です。これは、すべての結果値をターゲット ビューのファイル名と一致するように変更することで、段階的に実行できます。
最後に、同じタブ/ウィンドウ内の後続のリクエストで Bean データを保持するという唯一の理由でセッションに置かれたセッション スコープの Bean は、マークを付けた方がよいでしょう@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>
Bean ビューをスコープ指定して、リクエスト スコープ指定の Bean のすべての参照を削除します。