从JSF 1.2迁移到JSF 2.0
问题
我正在使用一个相当大的应用程序编写于JSF 1.2. JSF 1.2现在已经有6年了。我需要升级到JSF 2.0。这会有多痛苦?我注意到自定义标签中的一些属性已被更改等。
#1 热门回答(236 赞)
#痛苦
将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类加载问题)。
- 更新faces-config.xml的根声明以符合JSF 2.0规范。 <面-配置
的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"
版本= "2.0"> - 确保web.xml的root声明已至少符合Servlet 2.5。 JSF 2.0不能在2.4或更低版本上运行(尽管它是可以破解的)。 <web应用程序
的xmlns = "http://java.sun.com/xml/ns/javaee"
的xmlns:网络= "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"
版本= "2.5">
JSP 2.x到JSP 2.x.
如果你使用的是JSP 2.x并希望使用884166393保留**,那么你基本上不需要更改任何其他内容。
###逐步升级
如果你已经使用了后缀url-pattern
for theFacesServlet
,如*.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 1.x相关的<context-param>值,这些值在Facelets 2.0中是默认的,比如值为* .xhtml的javax.faces.DEFAULT_SUFFIX。
- 更新现有Facelet taglib XML的根声明以符合Facelets 2.0。 <的facelet-标签库
的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"
版本= "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页面设计得很好,你就不应该有任何一行ofscriptlet代码,你也应该只有<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文件,如168169637中所述。
##善后
无论迁移方法如何,你都可以通过新的JSF 2.0注释逐步实现。 Any<managed-bean>
可以通过@ManagedBean
注释:
@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
在@RequestScoped
旁边,还有@ViewScoped
,@SessionScoped
和@ApplicationScoped
可用。如果省略了@ManagedBean
的name
属性,那么它将默认为classname,并且第一个char为小写。
@ManagedBean
@RequestScoped
public class SomeBean {}
在这个特定的例子中,它将是#{someBean}
。
Any<managed-property>
可以使用电子邮件注释:@ManagedProperty
:
@ManagedProperty("#{otherBean}")
private OtherBean otherBean;
Any<validator>
可以使用@FacesValidator
注释:
@FacesValidator("someValidator")
public class SomeValidator implements Validator {}
Any<converter>
可以使用@FacesConverter
进行注释
@FacesConverter("someConverter")
public class SomeConverter implements Converter {}
Any<renderer>
可以使用@FacesRenderer
进行注释
@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}
Any<navigation-case>
使用XHTML页面的文件名作为<from-outcome>
和<to-view-id>
可以删除,因为这将是implicitlydone。这可以通过更改所有结果值以匹配目标视图的文件名来逐步完成。
最后,任何会话范围内的bean都被放在会话中,唯一的理由是在同一个选项卡/窗口中的后续请求中保留bean数据,最好标记为@ViewScoped
,因为这样在最终用户打开时bean不会受到影响不同标签/窗口中的同一页面。
##组件库
请注意,我不会在这个答案中考虑PrimeFaces / RichFaces / IceFaces等任何第三方组件库,因此它不可能写出可靠的答案,因为它基本上归结为"它取决于"。一般情况下,按照说明将组件库升级为自己验证的JSF 2.0兼容版本就足够了。最好是编写单元测试,在升级之前和之后运行它们并单独解决任何问题。
以下是关于特定组件库迁移的至少一些有用链接:
- RichFaces迁移指南 - 3.3.x到4.x迁移
- IceFaces 2 Wiki - IceFaces 1.x兼容性指南
PrimeFaces没有PrimeFaces 1.x到2.x的迁移指南,因为PrimeFaces 1.x已经需要Facelets 1.x,所以你只需要遵循Facelets 1.x到2.x的迁移步骤。但是,有一个PrimeFaces2.x to 3.x migration guide可能也适用于从PrimeFaces 1.x迁移到3.x.战斧也没有移民指南。基本上,你需要更改的唯一内容是JAR,如果需要,可以通过使bean视图作用域来删除请求范围bean上的所有<t:saveState>
个引用。
#2 热门回答(5 赞)
有一点需要提及的是,如果有人在使用JSTL和JSF 1.2,那么当升级到JSF2时,你应该更改命名空间:
http://java.sun.com/jstl/core
至:
http://java.sun.com/jsp/jstl/core
#3 热门回答(4 赞)
JSF 2.0有许多新功能和组件,我不认为迁移会很痛苦。只有你会发现困难的地方是使用第三方图书馆。如果你的应用程序严重依赖于像Richfaces这样的库,那么你将面临问题。并非Richfaces 3中的所有组件都移植到Richfaces 4。
这也可能有帮助JSF 1.2 application migration to JSF 2.0
另请查看thisWhat is new in JSF 2?