回答:
JSF 1.2から2.0へのアップグレードの痛みは、現在使用しているビューテクノロジーと使用したいビューテクノロジーによって異なります。
ビューテクノロジーの切り替えに関係なく、少なくとも次の手順を実行する必要があります。
/WEB-INF/lib
(存在する場合)から削除します。/WEB-INF/lib
(JSF 1.2がservletcontainerで提供されている場合、サーブレットアプリケーションライブラリの前にまずwebappライブラリをロードするようにクラスロードポリシーを変更することもできます。アプリケーションサーバーでの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">
注:サーブレット3.0以降を使用している場合は、上記のXMLスニペット全体ではhttp://xmlns.jcp.org
なく、名前空間ドメインを使用してhttp://java.sun.com
ください。
あなたが使用している場合JSP 2.xのをとしたい保つ、それを使用して、あなたは基本的に他の変更は何もする必要はありません。
のようにのサフィックスurl-pattern
を既に使用している場合は、が最初にファイルをスキャンし、存在しない場合はファイルをスキャンすることを知っておくとよいでしょう。これにより、URLを変更せずに、舞台裏でJSPからFaceletsに徐々に変換する余地が与えられます。FacesServlet
*.jsf
FacesServlet
*.xhtml
*.jsp
しかしurl-pattern
、のようにプレフィックスを使用していて、/faces/*
JSPからFaceletsに徐々にアップグレードしたい場合は、実際にプレフィックスを変更し*.jsf
、場合によっては既存のJSPページのすべてのリンクも変更する必要があります。
暗黙のナビゲーションで提供される新しいJSF 2.0はファイルの存在をスキャンしないので、outcome.xhtml
とにかく移動することに注意してください。したがって、から、またはに移動する*.jsp
場合でも、それをJSF 1.xの方法でviewidに含める必要があります。
あなたが使用している場合のFacelets 1.1をビューテクノロジとして、およびJSF 2.0供給使いたいのFacelets 2.0を、あなたは次の追加手順を実行する必要があります。
/WEB-INF/lib
ます。FaceletViewHandler
から削除しfaces-config.xml
ます。FaceletViewHandler
、カスタム実装を拡張して拡張する必要がありますViewHandlerWrapper
。<context-param>
値を削除します。web.xml
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以降を使用している場合は、上記のXMLスニペット全体ではhttp://xmlns.jcp.org
なく、名前空間ドメインを使用してhttp://java.sun.com
ください。
それは基本的にそれであるはずです。
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 のすべての参照を削除します。
javax.faces.VALIDATE_EMPTY_FIELDS
パラメーターをfalse
に設定する必要もありました。参照:stackoverflow.com/questions/6113935/...
言及すべきことの1つは、JSF 1.2でJSTLを使用している場合、JSF2にアップグレードするときに名前空間を次のように変更する必要があることです。
に:
JSF 2.0には多くの新しい機能とコンポーネントがあり、移行に苦労することはないと思います。サードパーティのライブラリを使用するのは、難しいと思う領域だけです。アプリケーションがRichfacesなどのライブラリに大きく依存している場合は、問題が発生します。Richfaces 3のすべてのコンポーネントがRichfaces 4に移植されるわけではありません。
これは、JSF 1.2アプリケーションのJSF 2.0への移行にも役立ち ます。
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">
Apache Trinidadを使用している場合は、JSF 2.0をサポートするようにバージョン2.0にアップグレードする必要もあります。Hacker's Valhallaに詳細があります。