首页 文章

从JSF 1.2迁移到JSF 2.0

提问于
浏览
131

我正在使用 JSF 1.2 编写的一个相当大的应用程序 . JSF 1.2现在已经有6年了 . 我需要升级到JSF 2.0 . 这会有多痛苦?我注意到自定义标签中的一些属性已被更改等 .

5 回答

  • 4

    JSF 2.0有许多新功能和组件,我不认为迁移会很痛苦 . 只有你会发现困难的地方是使用第三方图书馆 . 如果您的应用程序严重依赖于像Richfaces这样的库,那么您将面临问题 . 并非Richfaces 3中的所有组件都移植到Richfaces 4 .

    这也可能会有所帮助JSF 1.2 application migration to JSF 2.0

    另请查看What is new in JSF 2?

  • 238

    痛苦

    将JSF 1.2升级到2.0的痛苦程度取决于您当前使用的视图技术以及您要使用的视图技术 .

    • JSP 2.x到JSP 2.x =几乎没有努力 .

    • Facelets 1.x到Facelets 2.0 =很少努力 .

    • JSP 2.x到Facelets 2.0 =很多努力 . 如果您还有自定义组件,请加倍 .


    基本变化

    无论视图技术切换如何,至少应执行以下步骤:

    • /WEB-INF/lib (如果有)中删除JSF 1.2 JAR .

    • /WEB-INF/lib 中删除JSF 2.0 JAR(如果JSF 1.2是servletcontainer提供的,您可能希望更改类加载策略以在servletcontainer库之前首先加载webapp库,另请参阅JSF2 classloading issues in application servers) .

    • 更新 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 的根声明已至少符合Servlet 2.5 . JSF 2.0不适用于2.4或更低版本(although it's hackable) .
    <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 使用它,那么您基本上不需要更改任何其他内容 .

    逐步升级

    如果您已经为 FacesServlet 使用后缀 url-pattern ,例如 *.jsf ,那么很高兴知道 FacesServlet 将首先扫描 *.xhtml 文件,如果它不存在,则扫描 *.jsp 文件 . 这为您提供了在不更改URL的情况下逐步从JSP转换为Facelets的空间 .

    但是,如果您使用前缀 url-pattern ,如 /faces/* 并且您希望逐步从JSP升级到Facelets,那么您必须将其更改为 *.jsf ,并且可能还要更改现有JSP页面中的所有链接 .

    您只需要记住,新的JSF 2.0提供的隐式导航不会扫描文件的存在,无论如何它都将转到 outcome.xhtml . 因此,如果您想来自或转到 *.jsp ,那么您仍然需要将它包含在JSF 1.x方式的viewid中 .


    Facelets 1.x到Facelets 2.0

    如果您使用 Facelets 1.x 作为视图技术并且想要使用提供的JSF 2.0 Facelets 2.0 ,那么您需要执行以下附加步骤:

    • /WEB-INF/lib 删除Facelets 1.x JAR .

    • faces-config.xml 删除Facelets 1.x FaceletViewHandler .

    • 需要更新任何自定义 FaceletViewHandler 实现以扩展ViewHandlerWrapper .

    • 没有必要,但只是为了清理,从 web.xml 删除Facelets 2.0中已默认的所有Facelets 1.x相关的 <context-param> 值,如 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页面设计得很好,则不应该有任何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>
    

    自定义组件更改

    您需要将JSP TLD文件更改为Facelets TLD文件,如Mojarra Migration Guide中所述 .


    善后

    无论迁移方法如何,您都可以通过新的JSF 2.0注释逐渐实现 faces-config.xml . 任何 <managed-bean> 都可以通过_892098注释:

    @ManagedBean(name="managedBeanName")
    @RequestScoped
    public class SomeBean {}
    

    @RequestScoped旁边,还有@ViewScoped@SessionScoped@ApplicationScoped可用 . 如果省略 @ManagedBeanname 属性,则默认为classname,第一个char为小写 .

    @ManagedBean
    @RequestScoped
    public class SomeBean {}
    

    在这个特定的例子中,它将是 #{someBean} .

    任何 <managed-property> 都可以使用_892109注释:

    @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> 都可以删除,因为这将完成implicitly . 这可以通过更改所有结果值以匹配目标视图的文件名来逐步完成 .

    最后,任何会话范围的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 to 3.x migration guide也适用于从PrimeFaces 1.x迁移到3.x.战斧也没有移民指南 . 基本上,您需要更改的唯一内容是JAR,如果需要,可以通过使bean视图作用域来删除请求范围bean上的所有 <t:saveState> 引用 .

  • 6

    有一点需要提及的是,如果有人在使用JSTL和JSF 1.2,那么当升级到JSF2时,您应该更改命名空间:

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

    至:

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

  • 7

    在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>
    

    第三步: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

    如果您正在使用Apache Trinidad,请Hacker's Valhalla获取更多信息 .

相关问题