Відповіді:
Болісність оновлення JSF 1.2 до 2.0 залежить від технології перегляду, яку ви зараз використовуєте та яку ви хочете використовувати.
Незалежно від перемикача технологій перегляду, слід принаймні виконати наступні кроки:
/WEB-INF/lib
(якщо такі є)./WEB-INF/lib
(якщо JSF 1.2 постачався з сервлет-контейнером, ви можете змінити політику завантаження класів, щоб спочатку завантажувати бібліотеки 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 або новішу версію, використовуйте http://xmlns.jcp.org
домен простору імен замість http://java.sun.com
усього вищевказаного фрагмента XML.
Переконайтеся, що кореневе оголошення web.xml
вже відповідає щонайменше Servlet 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 або новішу версію, використовуйте http://xmlns.jcp.org
домен простору імен замість http://java.sun.com
наведеного вище фрагмента XML.
Якщо ви використовуєте JSP 2.x і хочете продовжувати його використовувати, вам взагалі нічого іншого не потрібно змінювати.
Якщо ви вже використовуєте суфікс url-pattern
для FacesServlet
, наприклад *.jsf
, то добре знати, що FacesServlet
спочатку буде сканувати *.xhtml
файл, а якщо його немає, то сканувати *.jsp
файл. Це дає вам можливість поступово перетворюватися з JSP в Facelet за кадром, не змінюючи URL-адреси.
Але якщо ви використовуєте префікс url-pattern
, як, /faces/*
і ви хочете поступово оновити з JSP до Facelet, то вам дійсно доведеться змінити його на, *.jsf
а можливо, також і на всі посилання на існуючих сторінках JSP.
Потрібно лише пам’ятати, що новий JSF 2.0 за умови неявної навігації не перевіряє наявність файлу, він все outcome.xhtml
одно перейде . Отже, якщо ви хочете приїхати або перейти до нього *.jsp
, тоді вам все одно потрібно включити його в проглядається спосіб JSF 1.x.
Якщо ви використовуєте Facelets 1.x як технологію перегляду та хочете використовувати Facelet 2.0, що постачається у комплекті JSF 2.0 , вам потрібно зробити наступні додаткові кроки:
/WEB-INF/lib
.FaceletViewHandler
з faces-config.xml
.FaceletViewHandler
реалізацію потрібно оновити, щоб ViewHandlerWrapper
натомість розширити .<context-param>
з Facelets 1.x значення, з web.xml
яких уже за замовчуванням у Facelets 2.0, як-от javax.faces.DEFAULT_SUFFIX
значення зі *.xhtml
.Оновіть кореневу декларацію існуючих XML-файлів Facelet taglib, щоб відповідати 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">
Примітка. Якщо ви використовуєте JSF 2.2 або новішу версію, використовуйте http://xmlns.jcp.org
домен простору імен замість http://java.sun.com
усього вищевказаного фрагмента XML.
В основному це повинно бути.
Якщо ви використовуєте 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>
..до наступного основного шаблону 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 або новішу версію, використовуйте http://xmlns.jcp.org
домен простору імен замість http://java.sun.com
усіх описаних вище фрагментів XHTML.
Якщо ваші існуючі сторінки 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>
..потрібно змінити наступні основні фасети, що включають шаблон сторінки:
<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 або новішу версію, використовуйте http://xmlns.jcp.org
домен простору імен замість http://java.sun.com
усіх описаних вище фрагментів XHTML.
Потрібно змінити файли JSP TLD на файли TLD Facelets, як описано в цьому посібнику з міграції Mojarra .
Незалежно від міграційного підходу, ви можете поступово усунути 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>
може бути видалений, оскільки це буде зроблено неявно . Це можна поступово зробити, змінивши всі значення результатів, щоб відповідати імені файлу цільового виду.
Нарешті, будь-який квадратичний діапазон сеансу, який був розміщений в сеансі з єдиною причиною збереження даних про квасолі в наступних запитах на тій самій вкладці / вікні, може бути краще позначений @ViewScoped
, оскільки таким чином боб не вплине, коли відкриється кінцевий користувач та ж сторінка на різних вкладках / вікнах.
Зауважте, що я не беру до уваги жодних сторонніх бібліотек-компонентів, таких як PrimeFaces / RichFaces / IceFaces, у цій відповіді було б неможливо написати достовірну відповідь, оскільки вона в основному зводиться до "це залежить". Взагалі достатньо лише оновити бібліотеку компонентів до -вірно перевіреної версії, сумісної з JSF 2.0, відповідно до їх інструкцій. Найкраще - просто написати одиничні тести, запустити їх до та після оновлення та виправити будь-які проблеми окремо.
Ось принаймні кілька корисних посилань щодо міграції конкретної бібліотеки компонентів:
PrimeFaces не має посібника з міграції для PrimeFaces 1.x до 2.x, оскільки PrimeFaces 1.x вже потребує Facelets 1.x, тому вам просто потрібно дотримуватися кроків міграції Facelet 1.x до 2.x. Однак є посібник з міграції PrimeFaces від 2.x до 3.x (і вище), який може застосовуватися і при міграції з PrimeFaces 1.x до 3.x (або вище). У Tomahawk також немає посібника з міграції. По суті, єдине, що вам потрібно змінити, - це JAR, і, якщо необхідно, позбутися всіх <t:saveState>
посилань на оброблювану бобову частину запиту, зробивши масштабний вигляд квасолі.
javax.faces.VALIDATE_EMPTY_FIELDS
параметр для false
сортування перевірки. Дивіться також: stackoverflow.com/questions/6113935/…
Варто зазначити, що якщо хтось використовує JSTL з JSF 1.2, тоді при переході на JSF2 слід змінити простір імен з:
до:
JSF 2.0 має багато нових функцій та компонентів, і я не думаю, що міграція буде болючою. Єдина область, якій вам буде складно, - це використання бібліотек третіх партій. Якщо ваша програма сильно залежить від таких бібліотек, як Richface, тоді ви зіткнетеся з проблемою. Не всі компоненти з Richface 3 переносяться на Richfaces 4.
Це також може допомогти міграції додатків JSF 1.2 на JSF 2.0
Також перевірте, що нового у JSF 2?
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, вам також доведеться оновити його до версії 2.0, щоб він підтримував JSF 2.0. Додаткову інформацію можна знайти у Вакерлі Хакера .