Вопрос-ответ

Migrating from JSF 1.2 to JSF 2.0

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

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

Переведено автоматически
Ответ 1

Сложность

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


  • JSP 2.x на JSP 2.x = практически без усилий.

  • Facelets 1.x на Facelets 2.0 = без особых усилий.

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


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

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


  • Удалите JAR-файлы JSF 1.2 из /WEB-INF/lib (если таковые имеются).



  • Удалите JAR-файлы JSF 2.0 /WEB-INF/lib (если JSF 1.2 был предоставлен servletcontainer , возможно, вам захочется изменить политику загрузки классов, чтобы сначала загружать библиотеки webapp перед библиотеками servletcontainer, см. Также Проблемы с загрузкой классов 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 namespace domain вместо 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 namespace domain вместо http://java.sun.com во всем приведенном выше фрагменте XML.




JSP 2.x на JSP 2.x

Если вы используете JSP 2.x и хотите продолжать его использовать, то вам в принципе не нужно ничего менять.

Постепенное обновление

Если вы уже используете суффикс url-pattern для FacesServlet, like *.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 в качестве технологии просмотра и хотите использовать поставляемый в JSF 2.0 Facelets 2.0, то вам необходимо выполнить следующие дополнительные шаги:


  • Удалите Facelets 1.x JAR из /WEB-INF/lib.



  • Удалите Facelets 1.x FaceletViewHandler из faces-config.xml.



  • Любая пользовательская FaceletViewHandler реализация нуждается в обновлении для расширения ViewHandlerWrapper вместо этого.



  • Не обязательно, но просто для очистки удалите все связанные с Facelets 1.x <context-param> значения из 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">


    Note: when you're using JSF 2.2 or newer, use the http://xmlns.jcp.org namespace domain instead of http://java.sun.com throughout the above XML snippet.



That should basically be it.


JSP 2.x to Facelets 2.0

If you're using JSP 2.x as view technology and you want to upgrade to Facelets 2.0 immediately, then you need to do a lot of changes before the site can go live. You're basically changing the view technology here.

Master page changes

On every master page, you need to change the following basic JSP template..

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

..to the following basic Facelets template:

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

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


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

Обратите внимание, что я не принимаю во внимание какие-либо сторонние библиотеки компонентов, такие как 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 (или выше). В Tomahawk также нет руководства по миграции. По сути, единственное, что вам нужно изменить, - это JARS и, при необходимости, избавиться от всех <t:saveState> ссылок в компоненте с областью запроса, сделав область представления компонента ограниченной.

Ответ 2

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

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

Для:

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

Ответ 3

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

Это также может помочь миграции приложений JSF 1.2 на JSF 2.0

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

Ответ 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>

Step3: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">
java