myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nicolas Labrot <nith...@gmail.com>
Subject Re: Duplicate id on stylesheet inserted with ResourceDependency
Date Sun, 17 Feb 2013 22:13:31 GMT
Thanks for your answer Leonardo.

It's a bit annoying to not be able to use c:forEach on a dynamic purpose.
Hope it will be fixe on 2.2.

Nicolas



On Sun, Feb 17, 2013 at 12:36 AM, Leonardo Uribe <lu4242@gmail.com> wrote:

> Hi
>
> The problem is caused by use c:forEach tag, iterating over something
> that is not "application scoped".
>
> The reason why c:forEach should be avoided in cases like the one
> shown here is Partial State Saving (PSS) algorithm works under the
> assumption that the same view can be generated between requests,
> so when the delta is applied, it can be applied over the same
> components.
>
> The issue has been widely studied and the conclusion has been that
> c:forEach cannot really be fixed because c:forEach does not have an
> underlying UIComponent instance that encapsultate what's inside
> and in that way generate unique stable ids.
>
> Create a custom component that works in MyFaces and Mojarra is not
> really possible, because the component requires to know some
> implementation details.
>
> Is there any solution? maybe something like this (I don't know if the EL
> is correct, but I hope you get the idea):
>
> <c:if test="#{empty sessionBean.values ? false :
> sessionBean.values.get(0)  eq null ? false : sessionBean.values.get(0)
> }">
>     <ui:include src="#{....}"/>
> </c:if>
> <c:if test="#{empty sessionBean.values ? false :
> sessionBean.values.get(1)  eq null ? false : sessionBean.values.get(1)
> }">
>     <ui:include src="#{....}"/>
> </c:if>
>
> And repeat the same code as many times as options you can put
> on sessionBean.values. In that way, PSS algorithm will reserve the
> necessary slots.
>
> In theory, a variant of c:forEach can be created to fix this problem, but
> it requires to store sessionBean.values into delta view state, to ensure
> stability of PSS algorithm. The previous example works because the
> values of src="#{...}" are stored into the state and unique ids are
> generated per each slot (by c:if effect).
>
> Note any variant of c:forEach will add a strong dependency of the code
> with MyFaces, so that's the reason why it hasn't been done before.
>
> Other alternative to make it work is disable PSS, or use
> org.apache.myfaces.REFRESH_TRANSIENT_BUILD_ON_PSS_PRESERVE_STATE
> web config param, but that is one step back, because without PSS the
> state in session will not be optimally used.
>
> regards,
>
> Leonardo Uribe
>
> 2013/2/16 Nicolas Labrot <nithril@gmail.com>:
> > Hello,
> >
> > I'm glad to post my first message on this ml ;)
> >
> > I have the infamous but well known duplicate id behaviour with the
> > following code:
> >     <h:form>
> >         <p:commandButton action="#{sessionBean.add}" value="add"
> > update=":myForm"/>
> >         <p:commandButton action="#{sessionBean.reset}" value="reset"
> > update=":myForm"/>
> >     </h:form>
> >
> >     <h:form id="myForm">
> >         <c:forEach items="#{sessionBean.values}" var="value">
> >             <ui:include src="#{value}"/>
> >         </c:forEach>
> >     </h:form>
> >
> > At the beginning "sessionBean.values" is empty.
> > Action 1 : User clicks on "add", the add action adds "form0.xhtml" to
> > "sessionBean.values".
> > Action 2 : User clicks on "add", the add action adds "form1.xhtml" to
> > "sessionBean.values".
> >
> > *form0.xhtml contains : *
> > <p:fileUpload auto="false"  mode="advanced" required="true"
> >
> fileUploadListener="#{sessionBean.handleFileUpload}"/>
> > *
> > *
> > *form1.xhtml contains :*
> > <h:outputText value=""/>
> >
> > My issue is action 2 returns a duplicate id exception:<partial-response>
> >
> > <error><error-name>java.lang.IllegalStateException</error-name>
> > <error-message><![CDATA[component with duplicate id "j_id4" found]]>
> > </error-message></error></partial-response>
> >
> >
> > j_id4 is the stylesheet of the fileUpload component :
> > @ResourceDependency(library="primefaces",
> name="fileupload/fileupload.css"),
> >
> > This stylesheet is inserted with action 1. And it seems myfaces tries to
> > insert it with action 2 too.
> >
> > Do I do something wrong ?
> >
> > Thanks for your help!
> >
> > Nicolas
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message