Миграция с JSF 1.2 на JSF 2.0

136

Я работаю с довольно большим приложением, написанным на JSF 1.2 . JSF 1.2 сейчас около 6 лет. Мне нужно обновить до JSF 2.0. Насколько это будет больно? Я заметил, что некоторые атрибуты в пользовательских тегах были изменены и т. Д.

mkoryak
источник

Ответы:

245

Болезненность

Болезненность обновления JSF 1.2 до 2.0 зависит от технологии просмотра, которую вы используете в данный момент и которую вы хотите использовать.

  • JSP 2.x в JSP 2.x = почти без усилий.
  • Facelets 1.x в Facelets 2.0 = мало усилий.
  • JSP 2.x в Facelets 2.0 = много усилий. Удвойте это, если у вас также есть пользовательские компоненты.

Основные изменения

Независимо от переключателя технологии просмотра, должны быть выполнены , по крайней мере, следующие шаги:

  • Удалить JSF 1.2 JAR из /WEB-INF/lib(если есть).
  • Удалите JAR JSF 2.0 /WEB-INF/lib(если JSF 1.2 был предоставлен сервлет-контейнером, вы можете изменить политику загрузки классов, чтобы загружать библиотеки веб-приложений перед библиотеками сервлет-контейнера, см. Также проблемы загрузки классов 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уже соответствует, по крайней мере, сервлету 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 в Facelets за кулисами, не меняя URL-адреса.

Но если вы используете префикс url-pattern, например, /faces/*и хотите постепенно переходить с JSP на Facelets, вам действительно нужно изменить его на*.jsf и, возможно, также все ссылки на существующих страницах JSP.

Вам нужно только иметь в виду, что новая JSF 2.0, обеспечивающая неявную навигацию, не сканирует наличие файла, она все outcome.xhtmlравно пойдет . Так что, если вы хотите прийти или перейти *.jsp, вам все равно нужно включить его в viewid в JSF 1.x.


Facelets 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значение with*.xhtml .
  • Обновите корневую декларацию существующих XML-файлов тегов Facelet для соответствия 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>

.. должен быть изменен на следующие основные Facelets, включающие шаблон страницы:

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

Изменения пользовательских компонентов

Вам необходимо изменить файлы TLD JSP на файлы 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, то по умолчанию будет указано имя класса с 1-ым символом в нижнем регистре.

@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>может быть удален, так как это будет неявно сделано . Это можно сделать постепенно, изменив все значения результатов в соответствии с именем файла целевого представления.

Наконец, любой bean-объект области действия сеанса, который был помещен в сеанс с единственной причиной сохранения данных bean-компонента в последующих запросах в той же вкладке / окне, может быть лучше помечен @ViewScoped, поскольку таким образом bean-компонент не будет затронут при открытии конечного пользователя. одна и та же страница в разных вкладках / окнах.


Библиотеки компонентов

Обратите внимание, что я не принимаю во внимание какие-либо сторонние библиотеки компонентов, такие как PrimeFaces / RichFaces / IceFaces, в этом ответе было бы невозможно написать надежный ответ, так как он в основном сводится к «зависит». В общем, достаточно просто обновить библиотеку компонентов до версии, подтвержденной JSF 2.0, согласно их инструкциям. Лучше всего просто написать модульные тесты, запустить их до и после обновления и устранить любые проблемы по отдельности.

Вот, по крайней мере, несколько полезных ссылок относительно миграции библиотеки конкретного компонента:

В PrimeFaces нет руководства по миграции для PrimeFaces 1.x на 2.x, поскольку PrimeFaces 1.x уже требует Facelets 1.x, поэтому вам просто нужно выполнить шаги миграции Facelets 1.x на 2.x. Тем не менее, существует руководство по миграции PrimeFaces 2.x на 3.x (и выше), которое может также применяться при переходе с PrimeFaces 1.x на 3.x (или выше). Томагавк также не имеет руководства по миграции. По сути, единственное, что вам нужно изменить, - это JAR-файлы и, при необходимости, избавиться от всех <t:saveState>ссылок на bean-объект в области запроса, сделав область видимости bean-объекта.

BalusC
источник
@ManagedBean (name = "managedBeanName") @RequestScoped Это :)
Даниэль Сзалай
отличный пост, мне очень помог. На что следует обратить внимание: при переходе с jsf 1.2 на jsf 2 вы можете быть почти уверены, что люди использовали a4j из richfaces 3.3.x. Я решил использовать richfaces 3.3.3 вместе с jsf 2, так как это казалось довольно посредственным изменением для обновления до richfaces 4.x. Поэтому я выполнил ваше руководство (отменил все связанные с facelets вещи в файле face-config (активированный viewhandler удалил аннотацию taglig), затем последовал community.jboss.org/wiki/RichFaces333AndJSF20 и, наконец, должен был сделать это stackoverflow.com/questions/85532/…
Тоскан
Отличный ответ. В моем случае я также должен был установить javax.faces.VALIDATE_EMPTY_FIELDSпараметр для falseсортировки проверки. Смотрите также: stackoverflow.com/questions/6113935/…
Джаспер де Врис
2
Я также могу порекомендовать всем прочитать balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Джаспер де Врис
1
@Cfold: я исправил ссылку.
BalusC
7

Следует отметить, что если кто-то использует JSTL с JSF 1.2, то при обновлении до JSF2 вы должны изменить пространство имен с:

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

чтобы:

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

Рафаль Г.
источник
2
Примечание. Это применимо только при переходе с Facelets 1.x на 2.x.
BalusC
А для
версии
6

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

Это также может помочь переходе приложения JSF 1.2 на JSF 2.0.

Также проверьте это Что нового в JSF 2?

MVG
источник
То же самое было бы, когда вы используете 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">
Pravin
источник
0

Если вы используете Apache Trinidad, вам также придется обновить его до версии 2.0, чтобы он поддерживал JSF 2.0. Там больше информации в Valhalla Хакера .

designatevoid
источник