从JSF 1.2迁移到JSF 2.0

mko*_*yak 133 java migration jsf jsf-2

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

Bal*_*usC 241

困苦

将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 .
  • 删除JSF 2.0 JAR /WEB-INF/lib(如果JSF 1.2是servletcontainer提供的,您可能希望更改类加载策略以在servletcontainer库之前首先加载webapp库,另请参阅应用程序服务器中的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">
    
    Run Code Online (Sandbox Code Playgroud)

    注意:当您使用JSF 2.2或更高版本时,请使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com整个上面的XML片段.

  • 确保root声明web.xml已经符合至少 Servlet 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">
    
    Run Code Online (Sandbox Code Playgroud)

    注意:当您使用Servlet 3.0或更高版本时,请使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com整个上面的XML片段.


JSP 2.x到JSP 2.x.

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

逐步升级

如果您已经使用后缀url-patternFacesServlet,喜欢*.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,那么您需要执行以下附加步骤:

  • 从中移除Facelets 1.x JAR /WEB-INF/lib.
  • 删除Facelets的1.x的FaceletViewHandler距离faces-config.xml.
  • 任何自定义FaceletViewHandler实现都需要更新以扩展ViewHandlerWrapper.
  • 没有必要,但只是为了清理,删除Facelets 2.0中已默认的任何Facelets 1.x相关<context-param>web.xml,如javax.faces.DEFAULT_SUFFIXwith值为*.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">
    
    Run Code Online (Sandbox Code Playgroud)

    注意:当您使用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>
Run Code Online (Sandbox Code Playgroud)

..到以下基本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>
Run Code Online (Sandbox Code Playgroud)

注意:当您使用JSF 2.2或更新版本时,请使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com上述XHTML片段.

包括页面更改

如果您现有的JSP页面设计得很好,那么您不应该有任何scriptlet代码行,并且您还应该只有<jsp:include>作为唯一的JSP特定标记.任何这些都需要改变:

<jsp:include page="include.jsp" />
Run Code Online (Sandbox Code Playgroud)

<ui:include src="include.xhtml" />
Run Code Online (Sandbox Code Playgroud)

基本的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>
Run Code Online (Sandbox Code Playgroud)

..应该更改为以下基本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>
Run Code Online (Sandbox Code Playgroud)

注意:当您使用JSF 2.2或更新版本时,请使用http://xmlns.jcp.org命名空间域而不是http://java.sun.com上述XHTML片段.

自定义组件更改

您需要按照此Mojarra迁移指南中的说明将JSP TLD文件更改为Facelets TLD文件.


后果

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

@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
Run Code Online (Sandbox Code Playgroud)

旁边@RequestScoped,也有@ViewScoped,@SessionScoped并且@ApplicationScoped可用.如果省略了该name属性@ManagedBean,那么它将默认为classname,并且第一个char为小写.

@ManagedBean
@RequestScoped
public class SomeBean {}
Run Code Online (Sandbox Code Playgroud)

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

任何<managed-property>可以使用@ManagedProperty以下注释:

@ManagedProperty("#{otherBean}")
private OtherBean otherBean;
Run Code Online (Sandbox Code Playgroud)

任何<validator>可以使用@FacesValidator以下注释:

@FacesValidator("someValidator")
public class SomeValidator implements Validator {}
Run Code Online (Sandbox Code Playgroud)

任何<converter>可以使用注释@FacesConverter

@FacesConverter("someConverter")
public class SomeConverter implements Converter {}
Run Code Online (Sandbox Code Playgroud)

任何<renderer>可以使用注释@FacesRenderer

@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}
Run Code Online (Sandbox Code Playgroud)

任何<navigation-case>它使用XHTML页面的文件名既<from-outcome><to-view-id>可以被删除,因为这将是隐式进行.这可以通过更改所有结果值以匹配目标视图的文件名来逐步完成.

最后,任何会话范围这是被放置在会议上与唯一原因保留在/窗可以更好地被标记相同的标签后续请求bean数据豆@ViewScoped,因为这样的bean将不会受到影响最终用户打开时不同标签/窗口中的同一页面.


组件库

请注意,我不采取任何第三方componant库,例如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上的所有引用.

  • 我也可以推荐大家阅读 http://balusc.blogspot.nl/2011/09/communication-in-jsf-20.html (2认同)

Raf*_* G. 7

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

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

至:

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

  • 注意:仅在从Facelets 1.x迁移到2.x时适用。 (2认同)

mvg*_*mvg 6

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

这也可能有助于 JSF 1.2应用程序迁移到JSF 2.0

另请查看JSF 2中的新功能?


归档时间:

查看次数:

92179 次

最近记录:

6 年,6 月 前