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.

Reply via email to