Миграция с JSF 1.2 на JSF 2.0
Я работаю с довольно большим приложением, написанным на JSF 1.2. JSF 1.2 сейчас около 6 лет. Мне нужно обновить до JSF 2.0. Насколько это будет больно? Я заметил, что некоторые атрибуты в пользовательских тегах были изменены и т. Д.
5 ответов
Болезненность
Болезненность обновления 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
(если есть). - Оставьте JSF 2.0 JAR в
/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
Домен пространства имен вместо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
вместо. - Не обязательно, но только для очистки, удалите все связанные с Facelets 1.x
<context-param>
значения изweb.xml
которые уже по умолчанию в Facelets 2.0, как иjavax.faces.DEFAULT_SUFFIX
со значением*.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.
Изменения пользовательских компонентов
Вам необходимо изменить файлы TSP 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, согласно их инструкциям. Лучше всего просто написать модульные тесты, запустить их до и после обновления и устранить любые проблемы по отдельности.
Вот, по крайней мере, несколько полезных ссылок относительно миграции библиотеки конкретного компонента:
- Руководство по миграции 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 (или выше). Томагавк также не имеет руководства по миграции. В основном, единственное, что вам нужно изменить, это JAR-файлы и, при необходимости, избавиться от всего <t:saveState>
ссылки на bean-объект в области запроса путем задания области видимости bean-компонента.
Следует упомянуть, что если кто-то использует JSTL с JSF 1.2, то при обновлении до JSF2 вы должны изменить пространство имен с:
чтобы:
JSF 2.0 имеет много новых функций и компонентов, и я не думаю, что миграция будет болезненной. Единственная область, которую вы найдете трудной, - использование сторонних библиотек. Если ваше приложение сильно зависит от таких библиотек, как Richfaces, тогда вы столкнетесь с проблемой. Не все компоненты из Richfaces 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. Там больше информации в Valhalla Хакера.