Перехід від JSF 1.2 до JSF 2.0


136

Я працюю з досить великим додатком, написаним на JSF 1.2 . JSF 1.2 зараз близько 6 років. Мені потрібно оновити JSF 2.0. Наскільки болісно це буде? Я помітив, що деякі атрибути в спеціальних тегах були змінені тощо.

Відповіді:


245

Хворобливість

Болісність оновлення JSF 1.2 до 2.0 залежить від технології перегляду, яку ви зараз використовуєте та яку ви хочете використовувати.

  • JSP 2.x до JSP 2.x = Майже ніяких зусиль.
  • Facelets 1.x to Facelets 2.0 = Невелике зусилля.
  • JSP 2.x до Facelets 2.0 = Багато зусиль. Подвійно це, якщо у вас також є спеціальні компоненти.

Основні зміни

Незалежно від перемикача технологій перегляду, слід принаймні виконати наступні кроки:

  • Видаліть JSF 1.2 JAR з /WEB-INF/lib(якщо такі є).
  • Завантажте JSF 2.0 JAR у /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 до JSP 2.x

Якщо ви використовуєте 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.


Фасетки 1.x до Facelets 2.0

Якщо ви використовуєте Facelets 1.x як технологію перегляду та хочете використовувати Facelet 2.0, що постачається у комплекті JSF 2.0 , вам потрібно зробити наступні додаткові кроки:

  • Видаліть Facelets 1.x JAR з /WEB-INF/lib.
  • Видаліть Facelets 1.x 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 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>посилань на оброблювану бобову частину запиту, зробивши масштабний вигляд квасолі.


@ManagedBean (name = "ManagedBeanName") @RequestScoped Це так :)
Даніель Шалай

чудовий пост, мені дуже допомогли. Що слід зазначити: переходячи від jsf 1.2 до jsf 2, ви майже певні люди використовували a4j від Richface 3.3.x. Я вирішив використовувати Richface 3.3.3 разом з jsf 2, оскільки це здавалося посередньою зміною для переходу на оновлення до richfaces 4.x. Тож я зробив ваш посібник (скасував усі пов’язані з фасетами речі в face-config (активований видошукач видалив тег-анотацію), потім перейшов до community.jboss.org/wiki/RichFaces333AndJSF20 і, нарешті, повинен був зробити це stackoverflow.com/questions/85532/…
Тоскан

Чудова відповідь. У моєму випадку я також повинен був встановити javax.faces.VALIDATE_EMPTY_FIELDSпараметр для falseсортування перевірки. Дивіться також: stackoverflow.com/questions/6113935/…
Jasper de Vries

2
Я також можу рекомендувати всім читати balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Jasper de Vries

1
@Cfold: я виправив посилання.
BalusC

7

Варто зазначити, що якщо хтось використовує JSTL з JSF 1.2, тоді при переході на JSF2 слід змінити простір імен з:

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

до:

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


2
Примітка. Це стосується лише міграції з Facelet 1.x до 2.x.
BalusC

А для 2.2 і вище, читайте stackoverflow.com/questions/31068678 / ...
Kukeltje

6

JSF 2.0 має багато нових функцій та компонентів, і я не думаю, що міграція буде болючою. Єдина область, якій вам буде складно, - це використання бібліотек третіх партій. Якщо ваша програма сильно залежить від таких бібліотек, як Richface, тоді ви зіткнетеся з проблемою. Не всі компоненти з Richface 3 переносяться на Richfaces 4.

Це також може допомогти міграції додатків JSF 1.2 на JSF 2.0

Також перевірте, що нового у JSF 2?


Це було б те саме, коли ви використовуєте Richfaces з JSF 1.x-, ви проходите всю "біль", щоб дізнатися, як інтегрувати сторонні компоненти в JSF. Підхід до JSF 2.x не має різниці. Ось така "радість" програмування, чи не так? :)
ChuongPham

4

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.