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

вот, по крайней мере, некоторые полезные ссылки в отношении миграции конкретной библиотеки компонентов:

на основе схемы 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 вы должны изменить пространство имен с:

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

в:

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


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. Там больше информации на Валгалла хакера.