Thanks Andrew,
It does help a lot.

Guy.

-----Original Message-----
From: Andrew Robinson [mailto:[EMAIL PROTECTED] 
Sent: Sunday, June 08, 2008 12:32 AM
To: MyFaces Discussion
Subject: Re: Datatable binding problem

Hey Guy,

You inspired me to write a blog on the dataTable which I have been
meaning to do for a while. Hope it helps:

http://andrewfacelets.blogspot.com/2008/06/understanding-datatable.html

-Andrew

On Sat, Jun 7, 2008 at 2:07 PM, Volker Weber <[EMAIL PROTECTED]> wrote:
> Hi Guy,
>
> seems like you also don't know how UIData works. I can't believe you
> getComponents ever return more than one component in the list?
>
>
> guessing the htmlDataTableDayParts is the UIData, try this:
>
>
> private boolean validateDayParts()
>  {
>   boolean isOk = true;
>   HtmlSelectOneMenu htmlSelectOneMenuFrom =
> htmlDataTableDayParts.findComponent(''hourFrom");
>   HtmlSelectOneMenu htmlSelectOneMenuTo =
> htmlDataTableDayParts.findComponent(''hourTo");
>
>   for (int i = 0; i < htmlDataTableDayParts.getRowCount(); i++) {
>     htmlDataTableDayParts.setRowIndex(i);
>     if (htmlSelectOneMenuFrom.getValue().equals(-1) ||
> htmlSelectOneMenuTo.getValue().equals(-1))
>     {
>       isOk = false;
>       htmlSelectOneMenuFrom.setValid(false);
>
FacesUtil.addErrorMessage(htmlSelectOneMenuFrom.getClientId(FacesUtil.getFac
esContext()),
>           "#{bundle['cmp_targeting.time.fromTo.required']}");
>     }
>
>  }
>  htmlDataTableDayParts.setRowIndex(-1); //  this is important
>  return isOk;
> }
>
>
> But i still dont understand why you need this having the values in the
model.
>
>
> Regards,
>    Volker
>
>
>
> 2008/6/7 Guy Bashan <[EMAIL PROTECTED]>:
>> Hi Volker,
>>
>> Here are both methods I am using:
>>  private List<UIComponent> getComponents(UIComponent rootComponent,
String id)
>>  {
>>    List<UIComponent> components = rootComponent.getChildren();
>>    List<UIComponent> result = new ArrayList<UIComponent>();
>>    for (UIComponent component : components)
>>    {
>>      if (component.getId().equals(id))
>>      {
>>        result.add(component);
>>      }
>>
>>      result.addAll(getComponents(component, id));
>>    }
>>
>>    return result;
>>  }
>>
>>  private boolean validateDayParts()
>>  {
>>    List<UIComponent> hoursFrom = getComponents(htmlDataTableDayParts,
"hourFrom");
>>    List<UIComponent> hoursTo = getComponents(htmlDataTableDayParts,
"hourTo");
>>
>>    boolean isOk = true;
>>    for (int i = 0; i < hoursFrom.size(); i++)
>>    {
>>      HtmlSelectOneMenu htmlSelectOneMenuFrom =
(HtmlSelectOneMenu)hoursFrom.get(i);
>>      HtmlSelectOneMenu htmlSelectOneMenuTo =
(HtmlSelectOneMenu)hoursTo.get(i);
>>
>>      if (htmlSelectOneMenuFrom.getValue().equals(-1) ||
htmlSelectOneMenuTo.getValue().equals(-1))
>>      {
>>        isOk = false;
>>        htmlSelectOneMenuFrom.setValid(false);
>>
FacesUtil.addErrorMessage(htmlSelectOneMenuFrom.getClientId(FacesUtil.getFac
esContext()),
>>            "#{bundle['cmp_targeting.time.fromTo.required']}");
>>      }
>>    }
>>
>>    return isOk;
>>  }
>>
>> I call the method "validateDayParts" from a saveAction method that is
activated when pressing a command link.
>>
>> Thanks,
>> Guy.
>>
>>
>> -----Original Message-----
>> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Volker Weber
>> Sent: Saturday, June 07, 2008 9:41 PM
>> To: MyFaces Discussion
>> Subject: Re: Datatable binding problem
>>
>> Hi Guy,
>>
>> could you post your loop code?
>>
>>
>> Regards,
>>    Volker
>>
>>
>>
>> 2008/6/7 Guy Bashan <[EMAIL PROTECTED]>:
>>> Hi again,
>>>
>>>
>>>
>>> In order to validate set of dropdowns in a datatable, I wrote a method
to
>>> extract all components with a specific id (under that datatable), then
scan
>>> the returned values in a loop an and make sure values are properly set.
>>>
>>> The method is activated in the save action.
>>>
>>> It seems like the drop down component properties: "value" and
>>> "submittedValue" are  null.
>>>
>>> (The data is passed to the bean objects properly and saved to database,
but
>>> when getting it directly from the component it returns a null value).
>>>
>>>
>>>
>>> Am I missing something?
>>>
>>>
>>>
>>> Thanks,
>>>
>>> Guy.
>>>
>>>
>>>
>>>
>>>
>>> From: Andrew Robinson [mailto:[EMAIL PROTECTED]
>>> Sent: Saturday, June 07, 2008 4:50 PM
>>> To: MyFaces Discussion
>>> Subject: Re: Datatable binding problem
>>>
>>>
>>>
>>> You are not understanding how JSF databinding works. I'll give you a
brief
>>> overview, but I would strongly recommend that you stop development and
read
>>> some articles on control binding before continuing.
>>>
>>>
>>>
>>> The binding happens at component construction time, not render time. If
this
>>> does not click, then read my blog at http://andrewfacelets.blogspot.com.
>>>
>>>
>>>
>>> In your case, the binding happens when the component tree is built.
Which
>>> means that the data table has no data, no var that is set, etc. A data
table
>>> has only one set of components that are re-rendered for each value.
There
>>> are not new components for each value. Think of it as a swing tree that
has
>>> a node rendered that is called to render every node - there is only one.
>>>
>>> Sent from my iPod
>>>
>>> On Jun 7, 2008, at 2:53 AM, Guy Bashan <[EMAIL PROTECTED]> wrote:
>>>
>>> Hi All,
>>>
>>>
>>>
>>> I am having a little problem with datatable and binding.
>>>
>>>
>>>
>>> Here is the code:
>>>
>>>         <t:dataTable id="dayParts"
>>> value="#{targetingParam.cmpTargetDayParts}"
>>>
>>>                      var="dayPart" cellpadding="0" cellspacing="0"
>>> rowIndexVar="rowIndex">
>>>
>>>           <t:column style="height:30px" rendered="#{!dayPart.deleted}">
>>>
>>>             <h:selectOneMenu value="#{dayPart.startHour}"
>>> onchange="updateTargetingActivity(#{rowIndexParam});"
>>>
>>>                              id="hourFrom" styleClass="mform"
>>> style="width:75px;" converter="ByteConverter">
>>>
>>>               <f:selectItems value="#{cmp_targeting.dayPartHoursFrom}"/>
>>>
>>>             </h:selectOneMenu>
>>>
>>>             <div>
>>>
>>>               <h:message for="dayParts" errorClass="error_message" />
>>>
>>>             </div>
>>>
>>>           </t:column>
>>>
>>>   </t:dataTable>
>>>
>>>
>>>
>>> It works all fine, and I see a table with values on the screen. Now,
when I
>>> add binding to the dropdown:
>>>
>>> binding="#{dayPart.htmlSelectOneMenuDaypartFrom}"
>>>
>>>
>>>
>>> I get the following exception:
>>>
>>> org.apache.jasper.el.JspPropertyNotFoundException:
>>> /cmp_targeting.jsp(593,12) '#{dayPart.htmlSelectOneMenuDaypartFrom}'
Target
>>> Unreachable, identifier 'dayPart' resolved to null
>>>
>>>                 at
>>>
org.apache.jasper.el.JspValueExpression.setValue(JspValueExpression.java:91)
>>>
>>>                 at
>>>
org.apache.myfaces.application.ApplicationImpl.createComponent(ApplicationIm
pl.java:315)
>>>
>>>                 at
>>>
javax.faces.webapp.UIComponentELTag.createComponent(UIComponentELTag.java:91
)
>>>
>>>                 at
>>>
javax.faces.webapp.UIComponentClassicTagBase.findComponent(UIComponentClassi
cTagBase.java:1101)
>>>
>>>                 at
>>>
javax.faces.webapp.UIComponentClassicTagBase.doStartTag(UIComponentClassicTa
gBase.java:431)
>>>
>>>                 at
>>>
org.apache.jsp.cmp_005ftargeting_jsp._jspx_meth_h_005fselectOneMenu_005f1(cm
p_005ftargeting_jsp.java:5394)
>>>
>>>                 at
>>>
org.apache.jsp.cmp_005ftargeting_jsp._jspx_meth_t_005fcolumn_005f4(cmp_005ft
argeting_jsp.java:5343)
>>>
>>>                 at
>>>
org.apache.jsp.cmp_005ftargeting_jsp._jspx_meth_t_005fdataTable_005f3(cmp_00
5ftargeting_jsp.java:5290)
>>>
>>>                 at
>>>
org.apache.jsp.cmp_005ftargeting_jsp._jspService(cmp_005ftargeting_jsp.java:
1042)
>>>
>>>                 at
>>> org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
>>>
>>>                 at
>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>>>
>>>                 at
>>>
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:3
93)
>>>
>>>                 at
>>> org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
>>>
>>>                 at
>>> org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
>>>
>>>                 at
>>> javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:290)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:206)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.
java:654)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDis
patcher.java:445)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatch
er.java:379)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher
.java:292)
>>>
>>>                 at
>>>
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(Servl
etExternalContextImpl.java:338)
>>>
>>>                 at
>>>
org.apache.myfaces.application.jsp.JspViewHandlerImpl.buildView(JspViewHandl
erImpl.java:481)
>>>
>>>                 at
>>>
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHand
lerImpl.java:334)
>>>
>>>                 at
>>>
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseEx
ecutor.java:41)
>>>
>>>                 at
>>>
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:140)
>>>
>>>                 at
>>>
org.apache.myfaces.custom.ppr.PPRLifecycleWrapper.render(PPRLifecycleWrapper
.java:84)
>>>
>>>                 at
>>> javax.faces.webapp.FacesServlet.service(FacesServlet.java:152)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:290)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:206)
>>>
>>>                 at
>>>
com.todacell.ui.view.filter.OpenSessionInViewFilter.doFilterInternal(OpenSes
sionInViewFilter.java:149)
>>>
>>>                 at
>>>
com.todacell.ui.view.filter.OncePerRequestFilter.doFilter(OncePerRequestFilt
er.java:61)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:235)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:206)
>>>
>>>                 at
>>>
org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.
java:147)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Application
FilterChain.java:235)
>>>
>>>                 at
>>>
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterCh
ain.java:206)
>>>
>>>                 at
>>>
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.ja
va:233)
>>>
>>>                 at
>>>
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.ja
va:175)
>>>
>>>                 at
>>>
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128
)
>>>
>>>                 at
>>>
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102
)
>>>
>>>                 at
>>>
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java
:109)
>>>
>>>                 at
>>>
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
>>>
>>>                 at
>>>
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
>>>
>>>                 at
>>>
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http
11Protocol.java:584)
>>>
>>>                 at
>>> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
>>>
>>>                 at java.lang.Thread.run(Thread.java:619)
>>>
>>>
>>>
>>> In the bean I have the following code:
>>>
>>> private transient HtmlSelectOneMenu htmlSelectOneMenuDaypartFrom;
>>>
>>>
>>>
>>>   public HtmlSelectOneMenu getHtmlSelectOneMenuDaypartFrom()
>>>
>>>   {
>>>
>>>     return htmlSelectOneMenuDaypartFrom;
>>>
>>>   }
>>>
>>>
>>>
>>>   public void setHtmlSelectOneMenuDaypartFrom(HtmlSelectOneMenu
>>> htmlSelectOneMenuDaypartFrom)
>>>
>>>   {
>>>
>>>     this.htmlSelectOneMenuDaypartFrom = htmlSelectOneMenuDaypartFrom;
>>>
>>>   }
>>>
>>>
>>>
>>> i:embed'>  {
>>>
>>>     this.htmlSelectOneMenuDaypartFrom = htmlSelectOneMenuDaypartFrom;
>>>
>>>   }
>>>
>>>
>>
>>
>>
>> --
>> inexso - information exchange solutions GmbH
>> Bismarckstraße 13 | 26122 Oldenburg
>> Tel.: +49 441 4082 356 |
>> FAX: +49 441 4082 355 | www.inexso.de
>>
>>
>
>
>
> --
> inexso - information exchange solutions GmbH
> Bismarckstraße 13 | 26122 Oldenburg
> Tel.: +49 441 4082 356 |
> FAX: +49 441 4082 355 | www.inexso.de
>

Reply via email to