Thanks! yes that was the problem.
I am getting a better hang of the JSF rendering framework now and it is pretty powerful!
Thanks again.
-Rajiv
On 11/05/06, Volker Weber <[EMAIL PROTECTED]> wrote:
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.