JSF 1.2'den JSF 2.0'a geçiş


136

Ben JSF 1.2 yazılmış oldukça büyük bir uygulama ile çalışıyorum . JSF 1.2 şu anda 6 yaşında. JSF 2.0'a yükseltmem gerekiyor. Bu ne kadar acı verici olacak? Özel etiketlerdeki bazı özelliklerin vb. Değiştirildiğini fark ettim.

Yanıtlar:


245

painfulness

JSF 1.2'yi 2.0'a yükseltmenin acısı, şu anda kullandığınız ve kullanmak istediğiniz görünüm teknolojisine bağlıdır.

  • JSP 2.x - JSP 2.x = Neredeyse hiç çaba yok.
  • Facelets 1.x - Facelets 2.0 = Az çaba.
  • JSP 2.x - Facelets 2.0 = Çok fazla çaba. Özel bileşenleriniz varsa bunu iki katına çıkarın.

Temel değişiklikler

Görünüm teknolojisi anahtarından bağımsız olarak, en azından aşağıdaki adımlar gerçekleştirilmelidir:

  • JSF 1.2 JAR'ları /WEB-INF/lib(varsa) kaldırın .
  • JSF 2.0 /WEB-INF/libJAR'ı bırakın (JSF 1.2 sunucu uygulaması sağlayıcısı tarafından sağlanmışsa, sunucu uygulaması kitaplıklarından önce webapp kitaplıklarını yüklemek için sınıf yükleme ilkesini değiştirmek isteyebilirsiniz, ayrıca bkz . Uygulama sunucularında JSF2 sınıflandırma sorunları ).
  • faces-config.xmlJSF 2.0 spesifikasyonuna uymak için kök bildirimini güncelleyin .

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

    Not: JSF 2.2 veya daha yenisini kullanırken , yukarıdaki XML snippet'i http://xmlns.jcp.orgyerine ad alanı etki alanını kullanın http://java.sun.com.

  • Kök bildiriminin en azından Servlet 2.5 ile web.xmluyumlu olduğundan emin olun . JSF 2.0 2.4 veya daha düşük sürümlerde çalışmaz ( hacklenebilir olsa da ).

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

    Not: Servlet 3.0 veya daha yenisini kullanırken , yukarıdaki XML snippet'i http://xmlns.jcp.orgyerine ad alanı etki alanını kullanın http://java.sun.com.


JSP 2.x - JSP 2.x

JSP 2.x kullanıyorsanız ve kullanmaya devam etmek istiyorsanız , temelde başka bir şey değiştirmeniz gerekmez.

Kademeli olarak yükseltme

Zaten bir sonek kullanıyorsanız url-patterniçin FacesServlet, gibi *.jsf, o 's iyi olduğunu bilmek FacesServletilk tarar *.xhtmldosya ve değil varsa, o zaman için tarama *.jspdosyası. Bu, URL'leri değiştirmeden yavaş yavaş perde arkasındaki JSP'den Facelets'e geçiş yapmanızı sağlar.

Ancak url-pattern, gibi bir önek kullanıyorsanız /faces/*ve yavaş yavaş JSP'den Facelets'e yükseltmek istiyorsanız, o zaman gerçekten *.jsfmevcut JSP sayfalarındaki tüm bağlantıları ve muhtemelen tüm bağlantıları değiştirmeniz gerekir .

Yalnızca, örtülü gezinmenin sağlanan yeni JSF 2.0'ın dosyanın varlığını taramadığını, yine de gideceğini unutmayın outcome.xhtml. Eğer gelmek ya da gitmek *.jspistiyorsanız, o zaman hala JSF 1.x şekilde viewid'e eklemeniz gerekir.


Facelets 1.x - Facelets 2.0

Eğer kullanıyorsanız Facelets 1.x görünümü teknoloji olarak ve MTU 2.0 sağlanan kullanmak istiyorum Facelets 2.0 , daha sonra aşağıdaki ek adımları yapmanız gerekir:

  • Facelets 1.x JAR öğesini kaldırın /WEB-INF/lib.
  • Facelets 1.x Kaldır FaceletViewHandlerdan faces-config.xml.
  • Bunun yerine tüm özel FaceletViewHandleruygulamaların güncellenmesi gerekir ViewHandlerWrapper.
  • Gerekli değil, ama sadece temizlik için, Facelets 2.0'da zaten değeri olan ve değeri gibi Facelets 1.x ile ilgili <context-param>değerleri kaldırın .web.xmljavax.faces.DEFAULT_SUFFIX*.xhtml
  • Mevcut Facelet taglib XML'lerinin kök bildirimini Facelets 2.0'a uyacak şekilde güncelleyin.

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

    Not: JSF 2.2 veya daha yenisini kullanırken , yukarıdaki XML snippet'i http://xmlns.jcp.orgyerine ad alanı etki alanını kullanın http://java.sun.com.

Temelde bu olmalı.


JSP 2.x - Facelets 2.0

Görüntüleme teknolojisi olarak JSP 2.x kullanıyorsanız ve hemen Facelets 2.0'a yükseltmek istiyorsanız , sitenin yayınlanabilmesi için çok fazla değişiklik yapmanız gerekir. Temel olarak burada görüntüleme teknolojisini değiştiriyorsunuz.

Kalıp sayfa değişiklikleri

Her kalıp sayfada aşağıdaki temel JSP şablonunu değiştirmeniz gerekir.

<%@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>

.. aşağıdaki temel Facelets şablonuna:

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

Not: JSF 2.2 veya daha yenisini kullanırken , yukarıdaki XHTML snippet'leri http://xmlns.jcp.orgyerine ad alanı etki alanını kullanın http://java.sun.com.

Sayfa değişikliklerini dahil et

Mevcut JSP sayfalarınız iyi tasarlanmışsa, komut dosyası kod satırı içermemeli ve yalnızca <jsp:include>tek JSP'ye özgü etiketi olmalıdır. Bunlardan herhangi birinin aşağıdakilerden değiştirilmesi gerekir:

<jsp:include page="include.jsp" />

için

<ui:include src="include.xhtml" />

Temel JSP, sayfa şablonunu içerir ..

<%@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>

.. aşağıdaki temel Facelets sayfa şablonunu içerecek şekilde değiştirilmelidir:

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

Not: JSF 2.2 veya daha yenisini kullanırken , yukarıdaki XHTML snippet'leri http://xmlns.jcp.orgyerine ad alanı etki alanını kullanın http://java.sun.com.

Özel bileşen değişiklikleri

Bu Mojarra Geçiş Kılavuzu'nda açıklandığı gibi JSP TLD dosyalarını Facelets TLD dosyalarına değiştirmeniz gerekir .


Sonrası

Geçiş yaklaşımından bağımsız olarak, faces-config.xmlyeni JSF 2.0 ek açıklamalarını veya hatta CDI'yi aşamalı olarak kaldırabilirsiniz . Herhangi bir <managed-bean>açıklama ekleyebilir @ManagedBean:

@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}

Yanında @RequestScoped, orada da @ViewScoped, @SessionScopedve @ApplicationScopedmevcut. Öğesinin nameözniteliğini atlarsanız, @ManagedBeanvarsayılan olarak 1. karakter küçük harfle sınıf adına atanır.

@ManagedBean
@RequestScoped
public class SomeBean {}

Bu özel örnekte, olacaktır #{someBean}.

Herhangi <managed-property>biri kullanılarak açıklama eklenebilir @ManagedProperty:

@ManagedProperty("#{otherBean}")
private OtherBean otherBean;

Herhangi <validator>biri kullanılarak açıklama eklenebilir @FacesValidator:

@FacesValidator("someValidator")
public class SomeValidator implements Validator {}

Herhangi <converter>biri kullanılarak açıklama eklenebilir@FacesConverter

@FacesConverter("someConverter")
public class SomeConverter implements Converter {}

Herhangi <renderer>biri kullanılarak açıklama eklenebilir@FacesRenderer

@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}

Herhangi <navigation-case>hem de XHTML sayfanın dosya adını kullanır <from-outcome>ve <to-view-id>bu edilecektir beri kaldırılabilir örtük yapılır. Bu, tüm sonuç değerlerini hedef görünümün dosya adıyla eşleşecek şekilde değiştirerek kademeli olarak yapılabilir.

Son olarak, aynı sekmede / pencerede sonraki isteklerde fasulye verilerini tutmak için tek nedenle oturuma yerleştirilen herhangi bir oturum kapsamındaki fasulye daha iyi işaretlenebilir @ViewScoped, çünkü bu şekilde uç kullanıcı açıldığında fasulye etkilenmez aynı sekmeyi farklı sekmelerde / pencerelerde görebilirsiniz.


Bileşen kütüphaneleri

Bu cevapta PrimeFaces / RichFaces / IceFaces gibi herhangi bir üçüncü taraf bileşen kütüphanesini dikkate almadığımı, daha sonra temelde "duruma bağlı" olduğundan güvenilir bir cevap yazmak imkansız olacağını unutmayın. Genel olarak, bileşen kitaplığını, talimatlarına uygun olarak, yalnızca kendileri doğrulanmış JSF 2.0 uyumlu bir sürüme yükseltmek yeterlidir. En iyisi sadece birim testleri yazmak, yükseltmeden önce ve sonra çalıştırmak ve sorunları tek tek düzeltmektir.

Aşağıda, belirli bileşen kitaplığının taşınmasıyla ilgili en azından bazı yararlı bağlantılar verilmiştir:

PrimeFaces 1.x, zaten Facelets 1.x gerektirdiğinden, PrimeFaces 1.x - 2.x için geçiş kılavuzuna sahip değildir, bu yüzden sadece Facelets 1.x - 2.x geçiş adımlarını takip etmeniz gerekir. Ancak, PrimeFaces 1.x'ten 3.x'e (veya daha yüksek) geçiş için de geçerli olabilecek bir PrimeFaces 2.x - 3.x (ve üstü) geçiş kılavuzu vardır. Tomahawk'un göç rehberi de yoktur. Temel olarak değiştirmeniz gereken tek şey JAR'lardır ve gerekirse <t:saveState>fasulye görünümünü kapsamlandırarak isteğe bağlı bir fasulye üzerindeki tüm referanslardan kurtulun .


@ManagedBean (name = "yönetilenBeanName") @RequestScoped Bu :)
Daniel Szalay

harika gönderi, bana çok yardımcı oldu. Dikkat edilmesi gereken bir şey: jsf 1.2'den jsf 2'ye geçerken, insanların rich.faces 3.3.x'ten a4j kullandığından neredeyse emin olabilirsiniz. Richfaces 3.3.3'ü jsf 2 ile birlikte kullanmaya karar verdim çünkü richfaces 4.x'e yükseltmek için vasat bir değişiklik gibi görünüyordu. Bu yüzden rehberinizi yaptım (yüzlerle ilgili tüm şeyleri çözdüğünüzde config-config (aktif görüntüleyici taglig ek açıklamasını kaldırdı), sonra community.jboss.org/wiki/RichFaces333AndJSF20'yi takip ettim ve sonunda bunu yapmak zorundayız stackoverflow.com/questions/85532/…
Toskan

Mükemmel cevap. Benim durumumda da doğrulama doğrulamak için javax.faces.VALIDATE_EMPTY_FIELDSparametre ayarlamak zorunda kaldı false. Ayrıca bakınız: stackoverflow.com/questions/6113935/…
Jasper de Vries


1
@Cfold: Bağlantıyı düzelttim.
BalusC


6

JSF 2.0'ın birçok yeni özelliği ve bileşeni var ve göçün acı verici olacağını düşünmüyorum. Sadece zor bulacağınız alan üçüncül kütüphane kullanmaktır. Uygulamanız büyük ölçüde Richfaces gibi kütüphanelere bağımlıysa sorunla karşılaşırsınız. Richfaces 3'teki tüm bileşenler Richfaces 4'e taşınmaz.

Bu ayrıca JSF 1.2 uygulamasının JSF 2.0'a geçişine yardımcı olabilir

Ayrıca bunu kontrol edin JSF 2'deki yenilikler nelerdir?


JSF 1.x ile Richfaces kullandığınızda aynı olurdu - üçüncü taraf bileşenlerini JSF ile nasıl entegre edeceğinizi öğrenmek için tüm "acı" dan geçersiniz. JSF 2.x'e yaklaşım bir fark değil. Programlamanın "sevinci" bu değil mi? :)
ChuongPham

4

web.xml

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

1. Adım: web.xml dosyasını değiştirin

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

Adım 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>

Adım 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">

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.