从JSF 1.2迁移到JSF 2.0

问题描述 投票:132回答:5

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

java jsf migration jsf-2
5个回答
240
投票

Painfulness

将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"> 注意:当您使用JSF 2.2或更高版本时,请在整个上述XML片段中使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com
  • 确保web.xml的root声明已经符合至少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"> 注意:当您使用Servlet 3.0或更高版本时,请在上面的XML片段中使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com

JSP 2.x到JSP 2.x.

如果您正在使用JSP 2.x并希望继续使用它,那么您基本上不需要更改任何其他内容。

Gradually upgrading

如果你已经为url-pattern使用后缀FacesServlet,比如*.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。
  • FaceletViewHandler删除Facelets 1.x faces-config.xml
  • 任何自定义FaceletViewHandler实现都需要更新以扩展ViewHandlerWrapper
  • 没有必要,但只是为了清理,从<context-param>删除任何Facelets 1.x相关的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"> 注意:当您使用JSF 2.2或更高版本时,请在整个上述XML片段中使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com

基本上应该是它。


JSP 2.x到Facelets 2.0

如果您使用JSP 2.x作为视图技术并且希望立即升级到Facelets 2.0,则需要在站点上线之前进行大量更改。你基本上是在改变视图技术。

Master page changes

在每个母版页上,您需要更改以下基本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或更新版本时,请在上述XHTML片段中使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com

Include page changes

如果您现有的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或更新版本时,请在上述XHTML片段中使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com

Custom component changes

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


后果

无论迁移方法如何,您都可以通过新的JSF 2.0注释甚至faces-config.xml逐步消除CDI。任何<managed-bean>都可以通过@ManagedBean注释:

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

@RequestScoped旁边,还有@ViewScoped@SessionScoped@ApplicationScoped。如果省略name@ManagedBean属性,那么它将默认为classname,第一个char为小写。

@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>都可以删除,因为这将是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 (and higher) migration guide也适用于从PrimeFaces 1.x迁移到3.x(或更高)。战斧也没有移民指南。基本上,您需要更改的唯一内容是JAR,如果需要,通过使bean视图作用域来删除请求范围bean上的所有<t:saveState>引用。


7
投票

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

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

至:

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


6
投票

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

这也可能有助于JSF 1.2 application migration to JSF 2.0

还要检查这个What is new in JSF 2?


4
投票

网嗯

 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,您还必须将其升级到2.0版,以便它支持JSF 2.0。在Hacker's Valhalla有更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.