我目前正在从事一个项目,我想从 3.3.3.Final 版本迁移到 RichFaces 4。我在想...
在迁移之前我应该考虑或知道或考虑什么重要的事情?
(可能是一个愚蠢的问题,但是......)你能“混合”richfaces 3 和richfaces 4 吗?
我想进行切换的主要原因之一是使用richfaces 4 自动完成功能,有没有办法使用richfaces 3 做这样的事情,或者迁移是最简单的?
我正在使用 JSF。
TLDR: RichFaces 在 2016 年 6 月达到了生命的终点。这是一个管理不善的项目灾难,不值得更好。
请注意,官方迁移指南仅完成了大约 30%。作为衡量标准,我在 2011 年根据迁移指南编写了一个 378 行的 XSLT 样式表。然后我将这个项目搁置到 2015 年 6 月,根据进一步的调查并让它工作,它已经达到了 1090 行。请记住,任何 XSLT 样式表都有一些开销,378/1090 = 大约 35%。
完成迁移指南中的说明后:
打开您在相邻浏览器选项卡中使用的每个组件的 TLD/VLD 生成的文档,每个版本一个,并仔细比较它们。属性名称和用途有数十处未记录的更改,并且一些属性已从父容器移至子容器。
还有一些重要的东西刚刚被随意删除了,比如rich:page
和rich:layout.
我将在本文末尾提供一些我发现的额外内容的列表。
然后,您将面临令人不快的发现,即他们还更改了大量自己的样式类名称,因此,如果您已在自己的样式表中为任何这些定义了样式,您还有更多工作要做。
您还会发现他们声称您可以定义自己的样式类并在丰富的组件中指定它们以实现您自己的样式的说法是完全不真实的。您的样式类应用于包含级别,但在许多情况下,例如他们认为适合在表格单元格级别定义字体等的表格单元格,您可以覆盖它们的唯一方法是通过名称重新定义其单元格样式。
您还必须确保您的样式表包含在 Rich Faces 样式表之后。在 3.3 中,这是自动的,因为首先包含了他们的。他们现在最后包含在内,因此您必须h:outputStylesheet
尽可能晚地使用并这样做,以确保它是在之后生成的。
我使用 XSLT 转换来实现迁移指南并完成上面的 1-2。它目前有超过 1000 行,我还没有完成。为什么他们自己不能提供这样的东西对我来说是个谜。
为什么认为有必要在第 3 版和第 4 版之间进行如此重大的更改是另一个更深层次的谜团。这是一个管理很差的产品。我不会再次迁移它或重新部署它。
编辑我发现的未记录的更改(为简洁起见,使用 XPath 语法):
a4j:status
文档在这一点上含糊不清,但该for=
属性已被删除:它现在默认在最近的 parent 内运行a4j:region
,除非通过status=
属性与特定小部件有关联。因此,如果您在同一区域内有多个,它们现在将全部开火。
如果您希望它通过您应用到特定的小部件,status=
您必须更改对应a4j:status/@id
的@name
属性。
在你修复所有这些之后,它仍然不起作用:
a4j:status
带有(@for
已删除)属性不会停止@name
属性并且 no@id
不会做任何事情@name
都@id
不会停止。rich:column/@breakBefore
现在breakRowBefore
rich:page
删除。
rich:layout
删除。
rich:column/@sortOrder
现在必须小写。
rich:dropDownMenu/@value
现在rich:dropDownMenu/@label
rich:dropDownMenu/@direction
和rich:dropDownMenu/@jointPoint
这些值已分别从{top-left, top-right, bottom-left, bottom-right}
更改{tl, tr, bl, br}
为{topLeft, topRight, bottomLeft, bottomRight}
。
rich:contextMenu/@submitMode
, rich:dropDownMenu/@submitMode
,rich:menuItem/@submitMode
这些都是现在rich:<whatever>/@mode
,"none"
需要将值更改为"client"
.
rich:isUserInRole
对于 Mojarra 2.2.08 和 EL 2.2,至少对我而言,这已经不再有效。幸运的是,有了 EL 2.2,您不再需要它并且可以使用request.isUserInRole(...)
.
rich:menuGroup/@value
现在rich:menuGroup/@label
。
rich:tab/@label
现在rich:tab/@header
。
rich:tab/f:facet/@name[.='label']
现在rich:tab/f:facet/@name[.='header']
。
rich:tabPanel/@activeTabClass
, rich:tabPanel/@contentStyle
, rich:tabPanel/@disabledTabClass
, rich:tabPanel/@inactiveTabClass
,rich:tabPanel/@tabClass
现在tabActiveHeaderClass
, tabContentClass
, tabDisabledHeaderClass
, tabHeaderClass
, tabInactiveHeaderClass
,tabContentClass
分别。
rich:tree/@adviseNodeOpened
这已被删除和rich:treeNode/@expanded
添加。这没有很好的记录:它必须是一个 EL,例如"#{true}"
, not "true"
,它可以是树节点的 bean 属性,例如"#{node.expanded}"
,或任何其他 bean;必须是布尔值。(新rich:collapsibleSubTable/@expanded
属性也是如此。)
rich:tree/@nodeFace
现在rich:tree/@nodeType
。
rich:tree/@switchType
现在rich:tree/@toggleType
和可能rich:tree/@selectionType
。
rich:tree/@treeNodeVar
现在var
,或者可能刚刚删除。
rich:treeNodesAdaptor
现在rich:treeModelAdaptor,
不再处理数组、节点集、...或任何不是 aMap
或Iterable
. 它也失去了它的var
属性,据我所知,它完全破坏了它以供嵌套使用。现在唯一var
可用的属性是祖先的属性rich:tree
。因此,例如,如果您同时想要父节点和当前子节点,它们根本不可用。此更改需要进行重要的重写或以下内容。
老的:
<rich:tree>
<rich:treeNodesAdapter var="vm_host">
<rich:treeNode .../>
<rich:treeNodesAdapter var="vm_guest">
<rich:treeNode .../>
</rich:treeNodesAdapter>
</rich:treeNodesAdapter>
</rich:tree>
新的:
<rich:tree ... var="node"> <!-- Add a 'var' attribute -->
<rich:treeModelAdapter>
<c:set var="vm_host" value="#{node}"/>
<rich:treeNode .../>
<rich:treeModelAdapter>
<c:set var="vm_guest" value="#{node}"/>
<rich:treeNode .../>
</rich:treeModelAdapter>
</rich:treeModelAdapter>
</rich:tree>
您也可以使用<ui:param>
代替<c:set>
.
RichFaces 拒绝错误检查属性名称使转换过程变得更加困难。您可以继续使用旧名称,但它们只是不起作用。默默。
在迁移之前我应该考虑或知道或考虑什么重要的事情?
他们的建议是遵循他们自己的RichFaces 3.3.x - 4.x 迁移指南——这似乎远未完成,请参阅下面的 EJP 回答以获得真实体验。
(可能是一个愚蠢的问题,但是......)你能“混合”richfaces 3 和richfaces 4 吗?
不,你不能。它会与自己发生冲突。