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

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

133 голосов
/ 14 декабря 2010

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

Ответы [ 5 ]

240 голосов
/ 26 декабря 2010

Болезненность

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

  • JSP 2.x до JSP 2.x = Почти без усилий.
  • Facelets 1.x для Facelets 2.0 = Небольшое усилие.
  • JSP 2.x для Facelets 2.0 = Много усилий.Удвойте это значение, если у вас также есть пользовательские компоненты.

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

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


JSP 2.x до JSP 2.x

Если вы используете JSP2.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 to 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.
  • Не обязательно, но только для очистки, удалите все значения <context-param>, связанные с Facelets 1.x, из 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://java.sun.com домен пространства имен * вместо 1141 * в приведенных выше фрагментах XHTML.

Включить изменения страницы

Если ваши существующие страницы JSP хорошо спроектированы, у вас не должно быть строки scriptlet и у вас также должен быть только <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 .


Aftermath

Независимо от подхода миграции, вы можете постепенно исключать 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, потому что таким образом компонент не будет будет затронут, когда конечный пользователь откроет одну и ту же страницу в разных вкладках / окнах.


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

Обратите внимание, что в этом ответе я не принимаю во внимание какие-либо сторонние библиотеки компонентов, такие как 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-объекта.

7 голосов
/ 24 мая 2013

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

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

до:

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

6 голосов
/ 22 декабря 2010

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

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

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

4 голосов
/ 20 января 2014

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">
0 голосов
/ 16 ноября 2011

Если вы используете Apache Trinidad, вам также придется обновить его до версии 2.0, чтобы он поддерживал JSF 2.0. Больше информации на Valhalla Хакера .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...