Hi, see inline
JSFSter Smith wrote: > Hi Volker, > > Thanks for your response! > > I attempted the forcing of the ValueBinding in the setProperties() since > setting value of the tag attribute was not passed on to the Component > Class. > > In a case like this: <my:testTag value="My message"> (or) <my:testTag> > value="#{datapanel.description}"> > > where description is a String, the contents of the 'value' attribute in the > setProperty method of the Tag class are picked up ok. > > But in the case when the the Bean member is not a string (like in the > dataTable case), the contents of the value attribute in setProperty() > are : > #{datapanel.description}. In this case, the getValue() in my Custom > Component class is null and the EL does not seem to be processed. > > My setProperties() method : > protected void setProperties(UIComponent component) > { > FacesContext context = FacesContext.getCurrentInstance(); > super.setProperties(component); > > if(value != null) > { > if (isValueReference(value)) > { > ValueBinding vb = context.getApplication > ().createValueBinding(value); > component.setValueBinding("value", vb); > } > else > ((UICustomHTMLOutput)component).setValue(value); > } > } > > > And my state and encode methods from the UICustomHTMLOutput: > @Override > public Object saveState(FacesContext context) > { > Object values[] = new Object[2]; > values[0] = super.saveState(context); > values[1] = value; > return ((Object) (values)); > } > > @Override > public void restoreState(FacesContext context, Object state) > { > Object values[] = (Object[])state; > super.restoreState(context, values[0]); > value = (String)values[1]; > } > > // component render > public void encodeBegin(FacesContext context) throws IOException > { > > ResponseWriter writer = context.getResponseWriter(); > > writer.startElement("p", this); > writer.write(value); This is the wrong part. In case of ValueBinding the value is of cause null. you need here the same if else as in setProperties(): if (value != null) { writer.write(value); } else { ValueBinding vb = getValueBinding("value"); if (vb != null) { writer.write(vb.getValue(context)); } } Regards, Volker > writer.endElement("p"); > writer.flush(); > } > > Any help is greatly appreciated. Thanks! > > -Rajiv > > On 11/05/06, Volker Weber <[EMAIL PROTECTED]> wrote: > >> >> Hi Rajiv, >> >> >> JSFSter Smith wrote: >> > >> > Firstly, kudos to the MyFaces team for the recent releases of myfaces >> > 1.1.3 and tomahawk 1.1.2! >> > >> > I am just a few weeks old with JSF and am using it for a current >> > project. So far its been great but I am still getting to know the >> > deatils. I attempted to create a simple custom JSP tag and was able to >> > get it together surprisingly quickly. But I do have a problem now. My >> > tag essentially renders the string in an attribute "value". Here is a >> > sample usage: >> > >> > <my:testTag value="My message"> (or) <my:testTag >> > value="#{datapanel.description}"> >> > >> > But the ValueBinding does not seem to work when I try to access a >> member >> > of the DataPanel bean that is a collection or another class that has >> > members. Examples of these cases are below: >> > >> > <t:dataTable value="#{datapanel.sentenceDisplayData}" var="each"> >> > <t:column> >> > <my:testTag value="#{each.part0}" /> >> > <my:testTag value="#{each.part1}" /> >> > <my:testTag value="#{each.part2}" /> >> > <my:testTag value="#{each.part3}" /> >> > </t:column> >> > </t:dataTable> >> > >> > (OR) >> > <my:testTag value="#{datapanel.summary.length"> >> > >> > I am including my setProperties method of the TagLib class. Would be >> > great if someone can point out what I am missing here. >> > >> > protected void setProperties(UIComponent component) >> > { >> > /* you have to call the super class */ >> > >> > FacesContext context = FacesContext.getCurrentInstance(); >> > super.setProperties(component); >> > >> > if(value != null) >> > { >> > if (isValueReference(value)) >> > { >> > ValueBinding vb = >> > context.getApplication().createValueBinding(value); >> > component.setValueBinding("value", vb); >> > >> >> ----- remove following ---------- >> > // forcing the value from the ValueBinding to the >> > component. >> > if(vb != null) >> > { >> > if(vb.getValue(context) != null) >> > >> > ((UIInfactHTMLOutput)component).setValue(vb.getValue >> (context).toString()); >> > } >> ----- / remove following ---------- >> >> Why this? Thats the problem! >> Here are the valueBinding evaluated at component creation time, but >> datatable needs eavluation at rendering time! >> >> just remove this an it should do. >> >> >> > } >> > else >> > ((UIInfactHTMLOutput)component).setValue(value); >> > } >> > } >> > >> >> >> or better implement your set properties using UIComponentTagUtils like >> this: >> >> protected void setProperties(UIComponent component) >> { >> super.setProperties(component); >> UIComponentTagUtils.setValueProperty(getFacesContext(), component, >> value); >> } >> >> >> >> >> Regards, >> Volker >> >> > thanks in advance! >> > >> > -Rajiv >> >> -- >> Don't answer to From: address! >> Mail to this account are droped if not recieved via mailinglist. >> To contact me direct create the mail address by >> concatenating my forename to my senders domain. >> > -- Don't answer to From: address! Mail to this account are droped if not recieved via mailinglist. To contact me direct create the mail address by concatenating my forename to my senders domain.