我正在使用JSF 1.2编写的大型应用程序。JSF 1.2大约已有6年历史了。我需要升级到JSF 2.0。这将有多痛苦?我注意到自定义标签中的某些属性已更改等。
Painfulness
将JSF 1.2升级到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">
注意:在使用JSF 2.2或更高版本时,请使用http://xmlns.jcp.org
名称空间域,而不要使用http://java.sun.com上述XML代码段。
<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到JSP 2.x
如果你正在使用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至Facelets 2.0
如果你将Facelets 1.x用作视图技术,并且想要使用JSF 2.0提供的Facelets 2.0,那么你需要执行以下附加步骤:
WEB-INF/lib
。FaceletViewHandler
从中删除Facelets1.x faces-config.xml
。FaceletViewHandler
实现都需要更新以扩展ViewHandlerWrapper。Facelets 1.x
相关的<context-param>
值,web.xml
这些值在Facelets 2.0
中已经是默认javax.faces.DEFAULT_SUFFIX
值,例如with
的with
值*.xhtml
。<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 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 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,则它将默认为类名,其中第一个字符为小写。
@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 的所有引用。
问题内容: 我很了解Java。哪些警告和资源将帮助我尽可能轻松地跨过另一端(C#)。 问题答案: 最大提示:请使用go一词中的.NET命名约定。这样,您将不断被提示使用的是哪种语言。(听起来很愚蠢,但这确实有帮助。)尽可能多地接受该语言的习惯用法。 有许多专门针对您所处地区的人们的书籍-在亚马逊上搜索“ C#for Java”,您将获得很多成功。值得 仔细 阅读以确保您不认为C#和Java中的功能
问题内容: 因此,下周我将在Java地方接受工作面试,并且希望不会遇到这么无聊的人。我是一个非常有信心的C#/。NET开发人员,并且(显然!)愿意考虑将其移植到Java中- 我希望人们推荐这样做的资源链接。我对以下问题的答案感兴趣: 有没有任何与Justin Etheridge的Ruby for C#开发人员等效的指南?当我决定要学习Ruby的耙子(因此至少要学习一点Ruby)时,这真的很有用。不
问题内容: 由于办公室人员的变动,C#专业知识的水平急剧下降,现在有更多的Java开发人员。至此,高层人士正在考虑将用C#编写的现有.NET项目转移到Java世界中。 除了从头开始完全出现 的明显问题之外,该公司还可以通过哪些可行的方法成功地将项目从.NET C#移植到Java? 问题答案: 这里是要考虑的事情: 这是大项目吗?如果是,请尝试使用C# 这个中型项目是否包含组件?如果否,请尝试使用C
我已经从Java8迁移到Java11,我发现一些Java EE库不推荐使用,我不得不使用一些第三方依赖。 所以我将这些依赖项添加到maven pom.xml中 其中变量中的版本为。但当我开始构建时,有很多类似的警告 编辑: 编辑2: 在我从两个QueryDsl工件(apt和jpa)中排除了inject依赖之后,我无法安装。下面是我得到的错误:
问题内容: 我们的Oracle数据库遇到了严重的性能问题,我们想尝试将其迁移到基于MySQL的数据库(直接使用MySQL,或者最好是Infobright)。 问题是,在我们实际上不知道新数据库的所有功能是否符合我们的需求之前,我们需要让旧系统和新系统至少重叠数周(如果不是几个月)。 因此,这是我们的情况: Oracle数据库由多个表组成,每百万行。白天,实际上有成千上万的语句,我们无法停止迁移。
问题内容: 在我的应用程序中,我从UIWebView迁移到WKWebView,如何为WKWebView重写这些功能? 和 问题答案: UIWebView => WKWebView等效 关于您可以写: 对于: