Answers:
将JSF 1.2升级到2.0的痛苦程度取决于您当前正在使用以及要使用的视图技术。
无论采用哪种视图技术切换,都至少应执行以下步骤:
/WEB-INF/lib
(如果有)。/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">
注意:当您使用JSF 2.2或更高版本时,请使用http://xmlns.jcp.org
名称空间域,而不要使用http://java.sun.com
上述XML代码段。
确保的根声明至少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">
注意:使用Servlet 3.0或更高版本时,请使用http://xmlns.jcp.org
名称空间域,而不要使用http://java.sun.com
上述XML代码段。
如果您正在使用JSP 2.x并希望继续使用它,那么您基本上不需要更改任何其他内容。
如果您已经使用后缀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用作视图技术,并且想要使用JSF 2.0提供的Facelets 2.0,那么您需要执行以下附加步骤:
/WEB-INF/lib
。FaceletViewHandler
从中删除Facelets1.x faces-config.xml
。FaceletViewHandler
实现都需要更新以扩展ViewHandlerWrapper
。<context-param>
值web.xml
,例如javax.faces.DEFAULT_SUFFIX
with的with值。*.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或更高版本时,请使用http://xmlns.jcp.org
名称空间域,而不要使用http://java.sun.com
上述XML代码段。
基本上就是这样。
如果您将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>
注意:在使用JSF 2.2或更高版本时,请使用http://xmlns.jcp.org
名称空间域,而不要使用http://java.sun.com
上述XHTML代码段。
如果您现有的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或更高版本时,请使用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 {}
在旁边@RequestScoped
,还有@ViewScoped
,@SessionScoped
并且@ApplicationScoped
可用。如果您省略的name
属性@ManagedBean
,则它将默认为classname,且第一个字符为小写。
@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,其唯一原因是将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到3.x(及更高版本)的迁移指南,也可能适用于从PrimeFaces 1.x到3.x(或更高版本)的迁移。战斧也没有迁移指南。基本上,您唯一需要更改的是JAR,并在必要时<t:saveState>
通过使bean视图成为作用域来摆脱对请求范围的bean 的所有引用。
javax.faces.VALIDATE_EMPTY_FIELDS
参数设置为false
以获得排序的验证。另请参阅:stackoverflow.com/questions/6113935/…–
要提到的一件事是,如果有人在JSTL和JSF 1.2中使用JSTL,则在升级到JSF2时,应将命名空间从以下位置更改:
至:
JSF 2.0具有许多新功能和组件,我不认为迁移会很痛苦。您会发现困难的唯一领域是使用第三方库。如果您的应用程序严重依赖于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>
第三步: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。Hacker's Valhalla上有更多信息。