Migracja z JSF 1.2 do JSF 2.0

Pracuję z dość dużą aplikacją napisaną w JSF 1.2 . JSF 1.2 ma już około 6 lat. Muszę uaktualnić do JSF 2.0. Jak bolesne to będzie? Zauważyłem, że niektóre atrybuty w niestandardowych tagach zostały zmienione itp.

Author: BalusC, 2010-12-14

5 answers

Ból

Bolesność aktualizacji JSF 1.2 do 2.0 zależy od technologii widoku, której aktualnie używasz i której chcesz użyć.

  • JSP 2.x do JSP 2.x = prawie bez wysiłku.
  • Facelets 1.x do 2.0 = mały wysiłek.
  • JSP 2.x do 2.0 = dużo wysiłku. Podwoić to, jeśli masz również niestandardowe komponenty.

Podstawowe zmiany

Niezależnie od przełącznika technologii widoku, przynajmniej należy wykonać następujące kroki:

  • Usuń JSF 1.2 JAR z /WEB-INF/lib (jeśli istnieje).
  • Drop JSF 2.0 Jar ' s in /WEB-INF/lib (jeśli JSF 1.2 był dostarczany przez servletcontainer, możesz zmienić politykę ładowania klas, aby załadować biblioteki webapp najpierw przed bibliotekami servletcontainer, patrz także problemy z klasowaniem JSF2 na serwerach aplikacji ).
  • Zaktualizuj główną deklarację faces-config.xml, aby była zgodna ze specyfikacją 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">
    
  • Upewnij się, że root deklaracja web.xml spełnia już co najmniej Servlet 2.5. JSF 2.0 nie działa na wersji 2.4 lub niższej (, chociaż można go zhakować ).

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

JSP 2.x do JSP 2.x

Jeśli używasz JSP 2.x i chcesz zachować używając go, to w zasadzie nie musisz niczego zmieniać.

Stopniowa modernizacja

Jeśli używasz już sufiksu url-pattern dla FacesServlet, Jak *.jsf, dobrze jest wiedzieć, że FacesServlet skanuje najpierw plik *.xhtml, a jeśli go nie ma, skanuje plik *.jsp. Pozwala to na stopniową konwersję z JSP na Facelets za kulisami bez zmiany adresu URL.]}

Ale jeśli używasz prefiksu url-pattern, takiego jak /faces/* i chcesz stopniowo uaktualniać JSP do Facelets, to naprawdę musisz zmienić go na {[21] } i ewentualnie również wszystkie linki w istniejących stronach JSP.

Trzeba tylko pamiętać, że nowy JSF 2.0 pod warunkiem ukryta nawigacja nie skanuje w poszukiwaniu obecności pliku, i tak trafi do outcome.xhtml. Więc jeśli chcesz przyjść z lub przejść do *.jsp, to nadal musisz umieścić go w viewid JSF 1.X way.


Facelets 1.x do Facelets 2.0

Jeśli używasz Facelets 1.x jako technologia widoku i chcesz użyć dostarczonego JSF 2.0 facets 2.0, musisz wykonać następujące dodatkowe kroki:

  • Usuń Facelets 1.X słoik z /WEB-INF/lib.
  • Usuń Facelets 1.x FaceletViewHandler Z faces-config.xml.
  • każda implementacja niestandardowa FaceletViewHandler musi zostać zaktualizowana, aby rozszerzyć ViewHandlerWrapper zamiast tego.
  • nie jest to konieczne, ale tylko do oczyszczenia, usuń wszelkie Facelets 1.x related <context-param> wartości z web.xml, które są już domyślne w Facelets 2.0, Jak javax.faces.DEFAULT_SUFFIX z wartością *.xhtml.
  • Zaktualizuj główną deklarację istniejących Facelet taglib XML, aby była zgodna z 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">
    

To powinno w zasadzie to tak.


JSP 2.x do Facelets 2.0

Jeśli używasz JSP 2.x jako technologia wyświetlania i chcesz uaktualnić do Facelets 2.0 natychmiast, musisz zrobić wiele zmian, zanim strona będzie mogła zostać uruchomiona. W zasadzie zmieniasz technologię widoku.

Zmiany strony wzorcowej

Na każdej stronie wzorcowej musisz zmienić następujący podstawowy szablon 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>

.. do następujących podstawowych szablon:

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

Dołącz zmiany strony

Jeśli istniejące strony JSP są dobrze zaprojektowane, nie powinieneś mieć żadnej linii kodu scriptlet i powinieneś mieć tylko <jsp:include> jako jedyny znacznik specyficzny dla JSP. Każda z nich musi zostać zmieniona z:

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

Do

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

Podstawowy szablon strony 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>

..należy zmienić na następujący podstawowy szablon strony:

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

Komponent Niestandardowy zmiany

Musisz zmienić pliki JSP TLD na Facelets TLD, jak opisano w tym Mojarra Migration Guide .


Następstwa

Niezależnie od podejścia do migracji, możesz stopniowo eliminować faces-config.xml przez nowe adnotacje JSF 2.0. Dowolna <managed-bean> może być przypisana przez @ManagedBean:

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

Obok @RequestScoped, są też @ViewScoped, @SessionScoped oraz @ApplicationScoped dostępny. Jeśli pominiesz name atrybut @ManagedBean, to domyślnie będzie to classname z pierwszym znakiem pisanym małymi literami.

@ManagedBean
@RequestScoped
public class SomeBean {}

W tym konkretnym przykładzie będzie to #{someBean}.

Dowolna {[50] } może być przypisana za pomocą @ManagedProperty:

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

Dowolna {[52] } może być przypisana za pomocą @FacesValidator:

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

Dowolna <converter> może być przypisana za pomocą @FacesConverter

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

Dowolna {[56] } może być przypisana za pomocą @FacesRenderer

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

Każdy <navigation-case>, który używa nazwy pliku strony XHTML zarówno jako <from-outcome>, jak i <to-view-id>, może zostać usunięty, ponieważ zostanie to zrobione w domyśle . Można to zrobić stopniowo, zmieniając wszystkie wartości wyniku, aby pasowały do nazwy pliku widoku docelowego.

Wreszcie, każda sesja scoped bean, która została umieszczona w sesji z jedynym powodem, aby zachować dane bean w kolejnych żądaniach w tej samej zakładce/oknie, może być lepiej oznaczona @ViewScoped, ponieważ to sposób bean nie będzie miało wpływu, gdy użytkownik końcowy otworzy tę samą stronę w różnych kartach / oknach.


Biblioteki komponentów

Zauważ, że nie biorę pod uwagę żadnych bibliotek komponentów innych firm, takich jak PrimeFaces/RichFaces/Icefaces w tej odpowiedzi, wtedy nie byłoby możliwe napisanie wiarygodnej odpowiedzi, ponieważ w zasadzie sprowadza się to do "to zależy". Ogólnie wystarczy tylko uaktualnić bibliotekę komponentów do wersji zgodnej z JSF 2.0 jako zgodnie z ich instrukcjami. Najlepiej jest po prostu napisać testy jednostkowe, uruchomić je przed i po aktualizacji i rozwiązać wszelkie problemy indywidualnie.

Oto co najmniej kilka przydatnych linków w odniesieniu do migracji określonej biblioteki komponentów:

PrimeFaces nie ma przewodnika migracji dla PrimeFaces 1.x do 2.x jako PrimeFaces 1.x wymaga Facelets 1.x już, więc po prostu trzeba śledzić Facelets 1.x do 2.kroki migracji x. Jednak istnieje PrimeFaces 2.x do 3.x migration guide , który może mieć zastosowanie również przy migracji z PrimeFaces 1.x do 3.X. Tomahawk nie ma również przewodnika migracji. W zasadzie jedyne, co musisz zmienić, to słoiki i jeśli to konieczne, pozbądź się wszystkich odniesień {62]} na żądanie scoped bean, czyniąc widok Bean scoped.

 236
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:50

Należy wspomnieć o tym, że jeśli ktoś używa JSTL z JSF 1.2, to przy aktualizacji do JSF2 należy zmienić przestrzeń nazw z:

Http://java.sun.com/jstl/core

Do:

Http://java.sun.com/jsp/jstl/core

 5
Author: Rafal G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 11:39:17

JSF 2.0 ma wiele nowych funkcji i komponentów i nie czuję, że migracja będzie bolesna. Jedynym obszarem, który jest trudny, jest korzystanie z bibliotek stron thrid. Jeśli Twoja aplikacja jest w dużym stopniu zależna od bibliotek takich jak Richfaces, napotkasz problem. Nie wszystkie komponenty z Richfaces 3 są przenoszone do Richfaces 4.

To również może pomóc JSF 1.2 migracja aplikacji do JSF 2.0

Sprawdź również to Co nowego w JSF 2?

 4
Author: mvg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:40

Www.xml

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

Krok 1: Zmień sieć.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>

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

Krok 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">
 2
Author: Pravin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 06:45:35

Jeśli używasz Apache Trinidad będziesz musiał również uaktualnić go do wersji 2.0, aby obsługiwał JSF 2.0. Więcej informacji na stronie Hacker ' s Valhalla .

 0
Author: designatevoid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-17 03:23:01