从Icefaces 1.8迁移至4.2时遇组件类缺失编译问题
刚处理过不少Icefaces版本升级的需求,你遇到的这些com.icesoft.faces.component.ext.*组件废弃导致的编译问题,是1.8到4.x迁移里最常见的情况。Icefaces 4.x基于JSF 2.x规范,很多旧的专属ext组件要么被标准JSF组件替代,要么换成了Icefaces 4.x的新组件,下面给你逐个对应替换方案和实用迁移要点:
各组件替换明细
HtmlCommandLink(com.icesoft.faces.component.ext.HtmlCommandLink)
直接替换为两种选择:- 标准JSF组件:
javax.faces.component.html.HtmlCommandLink,页面中用<h:commandLink>,完全覆盖基础功能 - 保留Icefaces特性:用Icefaces 4.x的
org.icefaces.component.commandlink.CommandLink(对应<ice:commandLink>),如果原来用了partialSubmit这类特有属性,这个组件还能继续支持,或者也可以用JSF 2.x的<f:ajax>标签实现AJAX提交逻辑
- 标准JSF组件:
HtmlGraphicImage(com.icesoft.faces.component.ext.HtmlGraphicImage)
替换方案:- 标准JSF组件:
javax.faces.component.html.HtmlGraphicImage(<h:graphicImage>),满足普通图片加载需求 - Icefaces增强版:
org.icefaces.component.graphicimage.GraphicImage(<ice:graphicImage>),支持流式加载等额外特性,适合需要优化图片加载的场景
- 标准JSF组件:
HtmlOutputLabel(com.icesoft.faces.component.ext.HtmlOutputLabel)
直接用标准JSF的javax.faces.component.html.HtmlOutputLabel(<h:outputLabel>)就行,标准组件已经完全覆盖旧组件的所有功能,Icefaces 4.x里也没有对应的专属替代组件HtmlOutputLink(com.icesoft.faces.component.ext.HtmlOutputLink)
两种替换选项:- 标准JSF组件:
javax.faces.component.html.HtmlOutputLink(<h:outputLink>),处理普通链接跳转完全够用 - Icefaces AJAX版:
org.icefaces.component.outputlink.OutputLink(<ice:outputLink>),如果需要AJAX导航功能可以用这个,不过大部分场景标准组件就够了
- 标准JSF组件:
HtmlOutputText(com.icesoft.faces.component.ext.HtmlOutputText)
直接替换为标准JSF的javax.faces.component.html.HtmlOutputText(<h:outputText>),标准组件和旧组件功能完全兼容,不需要再用Icefaces的专属ext组件HtmlPanel系列组件(HtmlPanelGrid、HtmlPanelGroup等)
这类布局组件直接换成标准JSF对应的组件:HtmlPanelGrid→javax.faces.component.html.HtmlPanelGrid(<h:panelGrid>)HtmlPanelGroup→javax.faces.component.html.HtmlPanelGroup(<h:panelGroup>)
如果需要Icefaces特有的布局增强功能,也可以考虑用Icefaces 4.x的<ice:panel>等新组件,但基础布局需求用标准组件就足够
通用迁移注意事项
- 命名空间更新:页面里的命名空间要调整,标准JSF组件用
xmlns:h="http://xmlns.jcp.org/jsf/html",Icefaces专属组件用xmlns:ice="http://www.icesoft.com/icefaces/component",替换掉原来1.8的旧命名空间 - Java代码中的引用替换:如果你的Java代码里直接new了这些ext组件(比如
new HtmlCommandLink()),要把全类名换成上面提到的新类名,不然编译肯定报错 - 特有属性迁移:比如旧组件的
partialSubmit,在Icefaces 4.x的组件里还能继续用,或者也可以改用JSF 2.x的<f:ajax>标签来实现AJAX交互,灵活性更高 - 功能测试:替换完成后一定要逐个测试组件的功能,比如链接跳转、图片显示、表单提交、布局排版这些,确保和旧版本的行为一致,避免出现样式或功能偏差
内容的提问来源于stack exchange,提问作者Rishi Singhal

