Ответы:
Болезненность обновления JSF 1.2 до 2.0 зависит от технологии просмотра, которую вы используете в данный момент и которую вы хотите использовать.
Независимо от переключателя технологии просмотра, должны быть выполнены , по крайней мере, следующие шаги:
/WEB-INF/lib
(если есть)./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 и хотите продолжать его использовать, вам больше не нужно ничего менять.
Если вы уже используете суффикс 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 в качестве технологии просмотра и хотите использовать Facelet 2.0, поставляемый с JSF 2.0 , то вам необходимо выполнить следующие дополнительные шаги:
/WEB-INF/lib
.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.
<%@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-объекта.
javax.faces.VALIDATE_EMPTY_FIELDS
параметр для false
сортировки проверки. Смотрите также: stackoverflow.com/questions/6113935/…
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 Хакера .