Переход с 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 = почти никаких усилий.
- Другие 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">
-
убедитесь, что корневое объявление
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">
JSP 2.x-JSP 2.x
если вы используете JSP 2.x и хотите keep используя его, то вам в основном не нужно ничего менять еще.
постепенно модернизируя
если вы уже используете суффикс url-pattern
на FacesServlet
, как *.jsf
, тогда хорошо знать, что FacesServlet
сначала будет проверять *.xhtml
файл, и если его нет, то сканировать для . Это дает вам возможность постепенно конвертировать из JSP в Facelets за кулисами без изменения URL-адреса.
но если вы используете префикс url-pattern
, как /faces/*
и вы хотите постепенно модернизировать от JSP до Facelets, тогда вам действительно нужно изменить его на *.jsf
и, возможно, также все ссылки на существующих страницах JSP.
вам нужно только иметь в виду, что новый JSF 2.0 при условии неявной навигации не сканирует наличие файла, он перейдет в outcome.xhtml
в любом случае. Так что, если вы хотите, чтобы прийти или пойти в *.jsp
, тогда вам все равно нужно включить его в viewid JSF 1.х путь.
Другие 1.x для Facelets 2.0
если вы используя Другие 1.x как технология просмотра и хотите использовать поставляемый JSF 2.0 Facelets 2.0, то вам нужно сделать следующие дополнительные шаги:
- Удалить Фейслетов 1.X JAR от
/WEB-INF/lib
. - Удалить Фейслетов 1.x
FaceletViewHandler
Сfaces-config.xml
. - пользовательские
FaceletViewHandler
реализация должна быть обновлена, чтобы продлитьViewHandlerWrapper
вместо. - не обязательно, но только для очистки, удалить любые другие 1.связанных с х
<context-param>
значенияweb.xml
которые уже по умолчанию в Facelets 2.0, какjavax.faces.DEFAULT_SUFFIX
стоимостью*.xhtml
. -
обновить корневое объявление существующего Facelet taglib XML для соответствия 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">
это должно быть в основном.
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>
включить изменения страницы
если ваши существующие страницы JSP хорошо разработаны, вы не должно иметь никакой строки сценарий код, и вы также должны иметь только <jsp:include>
как единственный JSP-специфический тег. Любой из них должен быть изменен с:
<jsp:include page="include.jsp" />
to
<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>
пользовательские изменения компонентов
вам нужно изменить файлы JSP TLD на Facelets TLD файлы, как описано в этом Mojarra Руководство По Миграции.
после
независимо от подхода миграции, вы можете постепенно ликвидировать the faces-config.xml
по новым аннотациям JSF 2.0. Любой <managed-bean>
может быть аннотирован @ManagedBean
:
@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
рядом с @RequestScoped
, есть еще @ViewScoped
, @SessionScoped
и @ApplicationScoped
доступен. Если вы опустите на @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>
можно удалить, так как это будет имплицитно сделано. Это можно сделать постепенно, изменив все значения результата в соответствии с именем файла целевого представления.
наконец, любой сеанс, который был помещен в сеанс с единственной целью сохранить данные bean в последующих запросах в той же вкладке / окне можно лучше отметить @ViewScoped
, потому что таким образом компонент не будет затронут, когда конечный пользователь откроет одну и ту же страницу на разных вкладках/окнах.
библиотеки компонентов
обратите внимание, что я не принимаю во внимание сторонние библиотеки компонентов, такие как PrimeFaces/RichFaces/IceFaces в этом ответе, тогда было бы невозможно написать надежный ответ, так как он в основном сводится к "это зависит". В общем, достаточно просто обновить библиотеку компонентов до - самостоятельно проверенной-совместимой версии JSF 2.0 в соответствии с их инструкциями. Лучше всего просто написать модульные тесты, запустить их до и после обновления и исправить любые проблемы по отдельности.
вот, по крайней мере, некоторые полезные ссылки в отношении миграции конкретной библиотеки компонентов:
- RichFaces Руководство По Миграции-3.3.от x до 4.икс миграция
- IceFaces 2 Wiki-IceFaces 1.X руководство по совместимости
на основе схемы PrimeFaces не имеет руководство по миграции на основе схемы PrimeFaces 1.x-2.х как на основе схемы PrimeFaces 1.для x требуются фасетки 1.x уже, поэтому вам просто нужно следовать Facelets 1.x-2.х этапов миграции. Однако, есть на основе схемы PrimeFaces 2.от x до 3.X руководство по миграции который также может применяться при миграции из PrimeFaces 1.от x до 3.X. В Tomahawk также нет руководства по миграции. В основном единственное, что вам нужно изменить, это банки и при необходимости избавиться от всех <t:saveState>
ссылки на боб с областью запроса, сделав вид боба с областью.
следует отметить, что если кто-то использует JSTL с JSF 1.2, то при обновлении до JSF2 вы должны изменить пространство имен с:
в:
JSF 2.0 имеет много новых функций и компонентов, и я не чувствую, что миграция будет болезненной. Единственная область, которую вы найдете сложной, - это использование библиотек thrid party. Если ваше приложение сильно зависит от библиотек, таких как 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. Там больше информации на Валгалла хакера.