ui中的复合组件:使用ajax调用重复vs c:forEach

时间:2012-11-26 21:44:47

标签: jsf classcastexception composite-component uirepeat

我有一个复合组件,它表示将存储在列表中的项目。我想使用<ui:repeat>显示这些项目,但我在进行ajax调用时遇到问题。问题是,对于<f:ajax>渲染属性,我想通过

给出我的组件的id
#{cc.clientId}

但是,当我将其与<ui:repeat>一起使用时会出现错误,原因是本文档[{3}}中解释了这些原因。

<cc:implementation>
    <div id="#{cc.clientId}">
          <h:form>
                <h:commandLink styleClass="btn btn-info" value="Click me">
                    <f:ajax execute="@form"
                            render=":#{cc.clientId}"/>
                </h:commandLink>
            </h:form>
    </div>
</cc:implementation>

是否有办法使用<ui:repeat>使上述组件工作(例如,是否有可以替换<f:ajax>标记处理程序的组件,或者我们是否坚持<c:forEach>构造) ?

<ui:repeat id="myComponent" value="#{backingBean.myComponentItem}" var="item" varStatus="itemIndex">
    <components:exampleComponent id="myComponent"/>
</ui:repeat>

所以我开始使用<c:forEach>而不是<ui:repeat>,我能够在<f:ajax>的render属性中使用我的组件的id。但是这一次,当我进行分页时,如果列表的大小减少,我的页面中开始有空组件。为了解决这个问题,我开始通过ajax调用进行分页,这解决了空组件问题。

我认为一切都解决了我遇到了另一个问题:让我说我有一个列出10个组件的页面,然后我去了另一个页面,从那个页面我再次来到组件显示页面,但由于某种原因可以说这次我只从数据库中检索了3个项目,我只想通过我的组件显示这3个项目,但没有别的。不幸的是,在这种情况下,3个项目正确显示,但页面也包含7个空组件。为了克服这一点,我需要再次重定向到此页面。所以我就放弃了这一点。除此之外,当页面上的组件数量发生变化时,我最终也会得到以下例外。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sun.faces.application.view.StateHolderSaver

我尝试使用帖子http://www.ninthavenue.com.au/blog/c:foreach-vs-ui:repeat-in-facelets中解释的建议,但它对我不起作用,我开始收到另一个类似于上述异常的错误。

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/pagename.xhtml</param-value>
</context-param> 

因此,经过这些长时间的解释之后,我想了解创建具有ajax功能的复合组件的最佳方法是什么,谁完全负责自己的状态并且独立于其他组件,并且可以显示在页面不止一次,组件数量可能会在页面生命周期中变化(通过分页,导航等)。

1 个答案:

答案 0 :(得分:0)

到目前为止,我提出的最佳解决方案是,检查页面中的组件数量,以及当该号码通过ajax调用或通过其他页面导航时更改时,再次重定向到目标页面,这刷新页面中的空组件,而不会对用户造成太大干扰。如果您想出任何更好的解决方案,请告诉我们。