首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Ajax4jsf 1.x迁移JSF1.1到JSF 2

用Ajax4jsf 1.x迁移JSF1.1到JSF 2
EN

Stack Overflow用户
提问于 2013-07-09 16:07:16
回答 1查看 5.2K关注 0票数 6

我们正在将JSF1.1 (MyFaces)项目迁移到JSF2,其思想是通过将JSP1.1和XHTML放在一起进行一段时间的定期迁移。我们在JSP页面中使用了很多ajax4jsf-1.1.1标记。我们不使用RichFaces。在将系统配置为JSF 2(Balusc在教程中提到的所有配置更改)之后,当尝试使用类路径中的ajax4jsf.jar访问JSP页面时,我们将得到一个异常:

代码语言:javascript
复制
Caused by: java.lang.IllegalStateException: setViewHandler may not be executed after a lifecycle request has been completed
    at org.apache.myfaces.application.ApplicationImpl.setViewHandler(ApplicationImpl.java:853)
    at org.ajax4jsf.framework.ajax.InitPhaseListener.beforePhase(InitPhaseListener.java:92)
    at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersBefore(PhaseListenerManager.java:76)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:131)

它看起来ajax4jsf.jar与JSF2不兼容,LifeCycle配置看起来有些问题。

有什么方法可以让a4j与JSF2JSP协同工作吗?我知道当我们使用XHTML时,我们不需要这些。

EN

回答 1

Stack Overflow用户

发布于 2013-07-09 18:01:22

完全摆脱Ajax4jsf 1.x。它确实与JSF2不兼容。相反,JSF2提供了一个新的ajax标记<f:ajax>,它涵盖了Ajax4jsf 1.x之前提供的所有核心功能。

如果升级到RichFaces 4不是一个选项(因为,正如您自己说的,您没有在任何地方使用RichFaces组件),那么只需删除Ajax4jsf 1.x并用标准的JSF2等效项替换所有的<a4j:xxx>标记。

  • <a4j:ajaxListener>:使用<f:ajax listener>
  • <a4j:keepAlive>:只需将托管bean放在@ViewScoped的视图范围内即可。
  • <a4j:log>:在JS上下文中使用jsf.ajax.addOnEvent()jsf.ajax.addOnError()
  • <a4j:commandLink>:只需在<h:commandLink>中嵌套<f:ajax>即可。
  • <a4j:outputPanel>:使用<h:panelGroup>,并记住在<f:ajax render>或中包含它的ID。
  • <a4j:repeat>:只需使用标准的<ui:repeat>
  • <a4j:form>:只要使用<h:form>,它就会自动识别<f:ajax>
  • <a4j:htmlCommandLink>:只需在<h:commandLink>中嵌套<f:ajax>即可。
  • <a4j:jsFunction>:只需使用标准的<h:commandScript>。然而,它是在JSF2.3中后期引入的。如果不能升级到JSF2.3,那么可以考虑使用或。
  • <a4j:region>:只需使用<f:ajax execute>,甚至可以将<f:ajax>封装在一组组件上。
  • <a4j:loadBundle>:只需使用标准的<f:loadBundle>
  • <a4j:status>:在JS上下文中使用jsf.ajax.addOnEvent()jsf.ajax.addOnError()
  • <a4j:actionparam>:只需使用标准的<f:param>
  • <a4j:loadScript>:只需使用标准的<h:outputScript>
  • <a4j:mediaOutput>:没有替代者。考虑一下。
  • <a4j:poll>:没有替代者。比如或。
  • <a4j:commandButton>:只需在<h:commandButton>中嵌套<f:ajax>即可。
  • <a4j:include>:只需使用标准的<ui:include>
  • <a4j:loadStyle>:只需使用标准的<h:outputStylesheet>
  • <a4j:support>:只需使用标准的<f:ajax>

您还需要将JSP文件重命名/重写为Facelets文件。在简单的情况下,这通常只是更改根声明和文件扩展名的问题。Facelets使用一个模板替换所有重复的代码变得更加容易。以下答案适用于:

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17553033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档