include和ajax冲突,使用<ui:include> </ui:include>进行动态ajax导航

对于OmniFaces,我也通过创建一个作为UIComponent而不是一个TagHandler进行了FaceletContext#includeFacelet()的尝试。 encodeChildren()方法。这样,在恢复视图阶段就会记住正确包含的facelet,并且包含的​​组件树仅在渲染响应阶段期间发生更改,这正是我们想要实现此构造的内容。

这是一个基本的启动示例:

@FacesComponent("com.example.Include")

public class Include extends UIComponentBase {

@Override

public String getFamily() {

return "com.example.Include";

}

@Override

public boolean getRendersChildren() {

return true;

}

@Override

public void encodeChildren(FacesContext context) throws IOException {

getChildren().clear();

((FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY)).includeFacelet(this, getSrc());

super.encodeChildren(context);

}

public String getSrc() {

return (String) getStateHelper().eval("src");

}

public void setSrc(String src) {

getStateHelper().put("src", src);

}

}

在.taglib.xml中注册的内容如下:

include

com.example.Include

src

true

java.lang.String

这适用于以下视图:

以下支持bean:

@ManagedBean

@ViewScoped

public class IncludeBean implements Serializable {

private List includes = Arrays.asList("include1", "include2", "include3");

private String include = includes.get(0);

private List getIncludes() {

return includes;

}

public void setInclude(String include) {

return this.include = include;

}

public String getInclude() {

return include;

}

}

(此示例要求包含文件include1.xhtml,include2.xhtml和include3.xhtml与主文件位于同一个基本文件夹中)

另请注意,这样每个包含文件在必要时都可以拥有自己的

,因此您不一定需要将它放在包含的位置。

这种方法在Mojarra中运行良好,即使回复请求来自include中的表单,但是在初始请求期间,MyFaces中的表单出现了以下异常:

java.lang.NullPointerException

at org.apache.myfaces.view.facelets.impl.FaceletCompositionContextImpl.generateUniqueId(FaceletCompositionContextImpl.java:910)

at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.generateUniqueId(DefaultFaceletContext.java:321)

at org.apache.myfaces.view.facelets.compiler.UIInstructionHandler.apply(UIInstructionHandler.java:87)

at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:49)

at org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:158)

at org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)

at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:48)

at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:394)

at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:448)

at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:426)

at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:244)

at com.example.Include.encodeChildren(Include.java:54)

MyFaces基本上在视图构建时间结束时释放Facelet上下文,使其在视图渲染时间内不可用,从而导致NPE,因为内部状态具有多个无效属性。但是,在渲染时可以添加单个组件而不是Facelet文件。我真的没有时间调查这是我的错还是MyFaces的错。这也是为什么它还没有在OmniFaces中结束的原因。

如果您正在使用Mojarra,请随意使用它。但是我强烈建议在同一页面上对所有可能的用例进行彻底测试。 Mojarra有一些与状态保存相关的怪癖,当使用这个构造时可能失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值