JSF 1.2 から JSF 2.0 への移行 質問する

JSF 1.2 から JSF 2.0 への移行 質問する

私はかなり大きなアプリを扱っています。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.xmlJSF 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.xmljavax.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 のすべての参照を削除します。

おすすめ記事