JSF 1.2からJSF 2.0への移行


136

私はJSF 1.2で書かれたかなり大きなアプリで作業しています。JSF 1.2は現在約6歳です。JSF 2.0にアップグレードする必要があります。これはどれほど辛いことでしょうか?カスタムタグの一部の属性が変更されていることに気づきました。

回答:


245

痛み

JSF 1.2から2.0へのアップグレードの痛みは、現在使用しているビューテクノロジーと使用したいビューテクノロジーによって異なります。

  • JSP 2.xからJSP 2.xへ=ほとんど労力を要しません。
  • Facelets 1.xからFacelets 2.0 =少しの労力。
  • JSP 2.xからFacelets 2.0へ=多大な労力。カスタムコンポーネントもある場合は、これを2倍にします。

基本的な変更

ビューテクノロジーの切り替えに関係なく、少なくとも次の手順を実行する必要があります。

  • JSF 1.2 JARを/WEB-INF/lib(存在する場合)から削除します。
  • JSF 2.0 JARをドロップします/WEB-INF/lib(JSF 1.2がservletcontainerで提供されている場合、サーブレットアプリケーションライブラリの前にまずwebappライブラリをロードするようにクラスロードポリシーを変更することもできますアプリケーションサーバーでの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">
    

    注:サーブレット3.0以降を使用している場合は、上記のXMLスニペット全体ではhttp://xmlns.jcp.orgなく、名前空間ドメインを使用してhttp://java.sun.comください。


JSP 2.xからJSP 2.x

あなたが使用している場合JSP 2.xのをとしたい保つ、それを使用して、あなたは基本的に他の変更は何もする必要はありません。

徐々にアップグレード

のようにのサフィックスurl-patternを既に使用している場合は、が最初にファイルをスキャンし、存在しない場合はファイルをスキャンすることを知っておくとよいでしょう。これにより、URLを変更せずに、舞台裏でJSPからFaceletsに徐々に変換する余地が与えられます。FacesServlet*.jsfFacesServlet*.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

あなたが使用している場合のFacelets 1.1をビューテクノロジとして、およびJSF 2.0供給使いたいのFacelets 2.0を、あなたは次の追加手順を実行する必要があります。

  • Facelets 1.x JARをから削除し/WEB-INF/libます。
  • Facelets 1.xをFaceletViewHandlerから削除しfaces-config.xmlます。
  • 代わりにFaceletViewHandler、カスタム実装を拡張して拡張する必要がありますViewHandlerWrapper
  • 必要ではありませんが、クリーンアップのために、withの値のように、Facelets 2.0ですでにデフォルトになっているFacelets 1.x関連の<context-param>値を削除します。web.xmljavax.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以降を使用している場合は、上記のXMLスニペット全体ではhttp://xmlns.jcp.orgなく、名前空間ドメインを使用してhttp://java.sun.comください。

それは基本的にそれであるはずです。


JSP 2.xからFacelets 2.0

JSP 2.xをビューテクノロジーとして使用していて、Facelets 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>

..to次の基本的な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インクルードページテンプレートに変更する必要があります。

<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ください。

カスタムコンポーネントの変更

このMojarra移行ガイドで説明されているように、JSP TLDファイルをFacelets TLDファイルに変更する必要があります。


余波

移行アプローチに関係なく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にはFacelets 1.xがすでに必要なので、PrimeFacesにはPrimeFaces 1.xから2.xへの移行ガイドがないため、Facelets 1.xから2.xへの移行手順に従う必要があります。ただし、PrimeFaces 1.xから3.x(以降)への移行にも適用できるPrimeFaces 2.xから3.x(以降)への移行ガイドがあります。トマホークにも移行ガイドはありません。基本的に、変更する必要があるのはJARだけであり、必要に応じ<t:saveState>て、Beanビューをスコープにして、リクエストスコープBean のすべての参照を削除します。


@ManagedBean(name = "managedBeanName")@RequestScoped It is :)
Daniel Szalay

素晴らしいポスト、私をたくさん助けてくれました。注意すべき点:jsf 1.2からjsf 2に移行するとき、richfaces 3.3.xのa4jを使用したことがある人はほぼ確実です。richfaces 4.xにアップグレードするために実行する平凡な変更のように思えたので、jsf 2と一緒にrichfaces 3.3.3を使用することにしました。私は(顔-configにすべてのFacelets関連のもの元に戻した(削除さtaglig注釈のViewHandler活性化される)あなたのガイドをしたので、その後に続くcommunity.jboss.org/wiki/RichFaces333AndJSF20、最後にこれを行う必要があったstackoverflow.com/questions/85532/...を
トスカン

すばらしい答えです。私の場合、検証をソートするためにjavax.faces.VALIDATE_EMPTY_FIELDSパラメーターをfalseに設定する必要もありました。参照:stackoverflow.com/questions/6113935/...
ジャスパー・デ・フリース


1
@Cfold:リンクを修正しました。
BalusC


6

JSF 2.0には多くの新しい機能とコンポーネントがあり、移行に苦労することはないと思います。サードパーティのライブラリを使用するのは、難しいと思う領域だけです。アプリケーションがRichfacesなどのライブラリに大きく依存している場合は、問題が発生します。Richfaces 3のすべてのコンポーネントがRichfaces 4に移植されるわけではありません。

これは、JSF 1.2アプリケーションのJSF 2.0への移行にも役立ち ます。

また、JSF 2の新機能を確認してください


JSF 1.xでRichfacesを使用する場合も同じでした。サードパーティのコンポーネントをJSFと統合する方法を見つけるためにすべての「苦痛」を経験しました。JSF 2.xへのアプローチは違いはありません。それがプログラミングの「楽しさ」ですね。:)
ChuongPham

4

Web.xml

 Add the jars
    1. jsf-api-2.0.jar 
    2. jsf-impl.2.0.2.jar

ステップ1:web.xmlを変更する

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
            xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
            id="WebApp_ID" version="2.5">


    <servlet>
            <servlet-name>facesServlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>

            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.faces</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>

ステップ2:webmvc-config.xml

<!-- Handles requests mapped to the Spring Web Flow system -->
    <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor" />
        <property name="ajaxHandler">
            <bean class="org.springframework.faces.webflow.JsfAjaxHandler" />
        </property>
</bean>

ステップ3:facess-config.xml

<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">

0

Apache Trinidadを使用している場合は、JSF 2.0をサポートするようにバージョン2.0にアップグレードする必要もあります。Hacker's Valhallaに詳細があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.