问题描述
我们正在将 JSF 1.1 (MyFaces) 项目迁移到 JSF 2.这个想法是通过将 JSP 和 XHTML 保持在一起一段时间来定期迁移.我们在 JSP 页面中使用了很多 ajax4jsf-1.1.1 标签.我们不使用 RichFaces.将系统配置为 JSF 2 后(在 Balusc 的教程中提到了所有配置更改)当尝试使用类路径中的 ajax4jsf.jar 访问 JSP 页面时,我们得到一个异常:
We are migrating JSF 1.1 (MyFaces) project to JSF 2. The idea is to migrate periodically by keeping both JSP and XHTML together for some time. We use many ajax4jsf-1.1.1 tags in JSP pages. We don't use RichFaces. After configuring the system to JSF 2 (with all config changes mentioned in tutorial by Balusc) When tried to access the JSP page with ajax4jsf.jar in classpath, we get an exception:
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 与 JSF 2 不兼容.生命周期配置看起来有些问题.
It looks ajax4jsf.jar is not compatible with JSF 2. Looks some issue with LifeCycle configuration.
有什么方法可以让 a4j 与 JSF 2 JSP 一起工作?我知道当我们使用 XHTML 时,我们不需要所有这些.
Is there any way we can make a4j work with JSF 2 JSPs? I know when we use XHTML we don't need all this.
推荐答案
彻底摆脱 Ajax4jsf 1.x.它确实与 JSF2 不兼容.相反,JSF2 提供了一个新的主要 ajax 标记 <f:ajax>
,它涵盖了以前由 Ajax4jsf 1.x 提供的所有核心功能.
Get rid of Ajax4jsf 1.x altogether. It's indeed not compatible with JSF2. Instead, JSF2 offers a new main ajax tag <f:ajax>
which covers all the core functionality as previously offered by Ajax4jsf 1.x.
如果升级到 RichFaces 4 不是一个选项(因为,正如你自己所说,你没有在任何地方使用 RichFaces 组件),那么只需删除 Ajax4jsf 1.x 并替换所有 由标准 JSF2 等效项标记.
If upgrading to RichFaces 4 is not an option (because, as you said yourself, you aren't using RichFaces components anywhere), then just remove Ajax4jsf 1.x and replace all <a4j:xxx>
tags by standard JSF2 equivalents.
:使用
.
:只需将托管 bean 通过
@ViewScoped
放入视图范围.:在 JS 上下文中使用
jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
.:将
嵌套在
中.
:使用
并记住在
中包含它的ID代码> 或 PrimeFaces
.
:只使用标准的
.
:只要使用
,它就会自动识别
.
:将
嵌套在
中.
:没有替代品.考虑 OmniFaces
或 PrimeFaces
.
:只要使用
,甚至可以包裹
> 围绕一组组件.
:只使用标准的
.
:在 JS 上下文中使用
jsf.ajax.addOnEvent()
或jsf.ajax.addOnError()
.:只使用标准的
.
:只使用标准的
.
:没有替代品.考虑 PrimeFaces
.
:没有替代品.考虑 OmniFaces
或 PrimeFaces
.
:将
嵌套在
中.
:只使用标准的
.
:只使用标准的
.
:只使用标准的
.
<a4j:ajaxListener>
: use<f:ajax listener>
.<a4j:keepAlive>
: just put managed bean in the view scope by@ViewScoped
.<a4j:log>
: usejsf.ajax.addOnEvent()
orjsf.ajax.addOnError()
in JS context.<a4j:commandLink>
: just nest<f:ajax>
inside<h:commandLink>
.<a4j:outputPanel>
: use<h:panelGroup>
and remember to include its ID in<f:ajax render>
or PrimeFaces<p:outputPanel>
.<a4j:repeat>
: just use standard<ui:repeat>
.<a4j:form>
: just use<h:form>
, it will autorecognize<f:ajax>
.<a4j:htmlCommandLink>
: just nest<f:ajax>
inside<h:commandLink>
.<a4j:jsFunction>
: no replacement. Consider OmniFaces<o:commandScript>
or PrimeFaces<p:remoteCommand>
.<a4j:region>
: just use<f:ajax execute>
, you can even wrap<f:ajax>
around a group of components.<a4j:loadBundle>
: just use standard<f:loadBundle>
.<a4j:status>
: usejsf.ajax.addOnEvent()
orjsf.ajax.addOnError()
in JS context.<a4j:actionparam>
: just use standard<f:param>
.<a4j:loadScript>
: just use standard<h:outputScript>
.<a4j:mediaOutput>
: no replacement. Consider PrimeFaces<p:media>
.<a4j:poll>
: no replacement. Consider OmniFaces<o:commandScript>
or PrimeFaces<p:poll>
.<a4j:commandButton>
: just nest<f:ajax>
inside<h:commandButton>
.<a4j:include>
: just use standard<ui:include>
.<a4j:loadStyle>
: just use standard<h:outputStylesheet>
.<a4j:support>
: just use standard<f:ajax>
.
您还需要将 JSP 文件重命名/重写为 Facelets 文件.在简单的情况下,这通常只是更改根声明和文件扩展名的问题.Facelets 使用单个模板替换所有重复代码变得更加容易.以下答案适用:
You also need to rename/rewrite JSP files to Facelets files. In simple cases, this is usually just a matter of changing root declarations and file extensions. Facelets makes it easier to replace all duplicated code by a single template. The following answer applies:
这篇关于将带有 Ajax4jsf 1.x 的 JSF 1.1 迁移到 JSF 2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!