Миграция с 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 ofhttp://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, которая была проверена ими самими, в соответствии с их инструкциями. Лучше всего просто написать модульные тесты, запускать их до и после обновления и устранять любые проблемы по отдельности.
Вот, по крайней мере, несколько полезных ссылок, касающихся миграции конкретной библиотеки компонентов:
- Руководство по миграции RichFaces - миграция с 3.3.x на 4.x
- ICEfaces 2 Wiki - Руководство по совместимости ICEfaces 1.x
В 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 вам следует изменить пространство имен с:
Для:
Ответ 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">