1. ホーム
  2. java

[解決済み] JSF1.2からJSF2.0への移行について

2022-06-02 04:52:51

質問

で書かれたかなり大きなアプリを扱っています。 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 から来るか、またはに行く場合、JSF 1.xの方法でviewidにそれを含める必要があります。


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> の参照を取り除くことです。