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.
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
Zfaces-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 zweb.xml
, które są już domyślne w Facelets 2.0, Jakjavax.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.
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:
Do:
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?
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">
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 .
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