users@woodstock.java.net

Re: Table + AJAX

From: Dan Labrecque <Dan.Labrecque_at_Sun.COM>
Date: Thu, 29 Nov 2007 10:18:36 -0500

stuartr wrote:
> Dan you have mis understood me entirely
>
> Forget the table example . As I said I put in a simple example to try out
> the JSF dynamic aspect
> 1 label 1 text field 1 radio button
>
> radio button set to onclick, call javascript.
> document look up on the text field and label . All ok
> refresh executed, the backing bean gets invoked ( meaning that everything is
> set up ok ).
> The get method , to update the label on the screen definitely gets invoked,
> but when JSF tries to
> return the value, thats when the exception occurs. Not within my get method,
> but within the JSF renderer
> ( as listed in previous threads ).
>

I want to help, but don't know what else to tell you. Unless you can
provide an example for me to look at? I need to compare your code
against our own examples.
> I take on board all your points but I knew about them already, and had
> ensured that none of these were causing me a problem . So the table is a red
> herring in this case.
> How about just getting a better exception message in place to see the actual
> class that is being sent to the renderer. By saying that UIComponent is
> expected tells us nothing other than a class incompatability with a
> parameter being passed.
>

The exception is thrown by JSF extensions partial life cycle (aka.
Dynamic Faces). JSF didn't find your component, so the Woodstock code is
never invoked.

Dan

>
>
>
> Dan Labrecque wrote:
>
>> It is very difficult to debug over e-mail, but there may be a couple
>> simple tests you can run. For example, add your hidden fields directly
>> in the "<webuijsf:form" body -- this takes the subview and table out of
>> the equation. If your code still does not function, then there may be a
>> problem with JSF and Facelets.
>>
>> If JSF is saying there is no UIComponent, there are only a couple cases
>> I can think of where this might happen.
>>
>> 1. You have not provided the correct component ids to the refresh
>> function. I'm suspicious because the tableRowGroup should output an id
>> like so:
>>
>> "form1:table1:rowGroup1:2:col1:j_id_id27"
>>
>> You're calling:
>>
>> columnDomNode.refresh("toplevelform:j_id26:var3");
>>
>> Note that there is no row index here, so it doesn't seem as if you're
>> working with a table. Perhaps this thread has the wrong subject???
>>
>> 2. You have not provided an id to all tags. If the page changes at all
>> (e.g., a component is hidden/added/removed), JSF will generate different
>> ids. This would result in JSF not being able to locate your subview.
>>
>> Using "toplevelform:j_id26:var3" as an example, I can see that you have
>> not provided an id for the subview. I suspect this may be your problem
>> -- these ids are not maintained and generated dynamically during each
>> request.
>>
>> 3. The component does not exist in the JSF component tree. This could
>> happen if you create components dynamically (e.g., via Java) and have
>> not assigned a parent or added the component as a child.
>>
>> 4. The component tree may not have been reconstituted. This could be an
>> issue with Facelets and JSF. It may also a problem with the web
>> container you're using. What are you using as a web container?
>>
>> 5. The table cannot find the component associated with the id given to
>> the refresh function. This could be due to #4 or #3, but moving the
>> hidden fields outside the table (in the test above) will prove that.
>>
>> Sorry I cannot be more helpful,
>> Dan
>>
>> stuartr wrote:
>>
>>> yes they belong to the parent . They are defined within my xhtml file(s)
>>>
>>> The hierachy is something like
>>>
>>> myform:mysubview:componentX
>>>
>>>
>>> The items belong to a <f:subview id="mysubview"
>>>
>>> which belongs to the top level view .
>>>
>>>
>>> Any way of tracing at the server side ( log4j logger ??? debug levels ???
>>> )
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> Dan Labrecque wrote:
>>>
>>>
>>>> That would explain why the component isn't updated client-side. I don't
>>>> know what JSON properties you previously saw in Firebug, but it seems
>>>> the response may not be generated correctly. In order to update
>>>> client-side, the response must have JSON properties containing an id,
>>>> value, etc.
>>>>
>>>> Are you're hidden fields part of the JSF component tree (i.e., did you
>>>> set a parent, add the component as a child, etc.)? All JSF based
>>>> components must have an id and parent in order to be placed in the JSF
>>>> component tree. When an Ajax request is generated, Dynamic Faces will
>>>> attempt to locate the given ids (execute params) in the JSF component
>>>> tree in order to decode/validate/update and ultimately render.
>>>>
>>>> Dan
>>>>
>>>> stuartr wrote:
>>>>
>>>>
>>>>> getting an error from Httprequest on ajax.
>>>>> basically, when I look at firebug I get
>>>>>
>>>>>
>>>>> <pre>java.lang.IllegalStateException: Class returned from
>>>>> AsyncResponse.getPartialTraversalViewRoot
>>>>>
>>>>> must be a UIComponent
>>>>>
>>>>>
>>>>> com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.render(PartialTraversalLifecycle
>>>>>
>>>>> .java:132)
>>>>>
>>>>> javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
>>>>>
>>>>> </pre></p><p>note <u>The full stack trace of the root cause is
>>>>> available
>>>>> in
>>>>> the Apache Tomcat
>>>>>
>>>>>
>>>>> I will forward on details on error in tomcat however, the request
>>>>> actually
>>>>> does get sent to the server, its the response that is in error.
>>>>>
>>>>> Any ideas. ????
>>>>> ( really need this working, deadline approxing )
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Dan Labrecque wrote:
>>>>>
>>>>>
>>>>>
>>>>>> stuartr wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Dont understand you dan ?
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> If the backing bean is request scoped, subsequent refresh calls will
>>>>>> not
>>>>>> retain local values as you might expect. Local variables will be set
>>>>>> for
>>>>>> the current request, but unless the bean is session scoped, any values
>>>>>> you previously set will be lost. Therefore, I have to ask again; is
>>>>>> your
>>>>>> backing bean session scoped?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> The backing bean is being invoked based on the refresh, I can see the
>>>>>>> getMethods getting invoked , however, nothing is updated at the
>>>>>>> client
>>>>>>> side.
>>>>>>> I have debug at the backing end to show me what is being returned to
>>>>>>> the
>>>>>>> client.
>>>>>>> I see the actual value being returned
>>>>>>> such as
>>>>>>>
>>>>>>> public String getVar1Value() {
>>>>>>>
>>>>>>> if ( cachedRowSetListener == null ) {
>>>>>>> rtn="initialvalue";
>>>>>>> } else {
>>>>>>>
>>>>>>> .....do some work ....
>>>>>>> rtn = blablbal
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> logger.debug("The value being returned to client is "+rtn);
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> return rtn;
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> I just sent the example to simplify what I was doing.
>>>>>>>
>>>>>>> Within the logger line I see the value changes. I also see the JSON
>>>>>>> response
>>>>>>> to the client within firebug, but nothing happens on screen. And when
>>>>>>> I
>>>>>>> do
>>>>>>> any alerts in my code in the client to check the values of the local
>>>>>>> dom
>>>>>>> object ( ie the hidden fields/text fields whatever ) they still have
>>>>>>> their
>>>>>>> old value.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> Looking at the "logger" output may not be enough. The table iterates
>>>>>> over many rows, so I cannot be certain which component you're actually
>>>>>> dealing with. Looking at the response in Firebug may be your best bet.
>>>>>> If you can see the desired value being returned, via JSON properties,
>>>>>> then we can go from there. What does the response look like?
>>>>>>
>>>>>> Dan
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Dan Labrecque wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> Considering your code is based on a local "firstTime" variable, is
>>>>>>>> your
>>>>>>>> bean session scoped? If the bean is request scoped, "firstTime" will
>>>>>>>> be
>>>>>>>> initialized similarly during each request.
>>>>>>>>
>>>>>>>> FYI, instead of refreshing each hidden field separately, you could
>>>>>>>> use
>>>>>>>> the following code, instead. Note that when the component id is not
>>>>>>>> provided, the refresh function acts as a reset. That is, the
>>>>>>>> component
>>>>>>>> will be redrawn only using values set server-side.
>>>>>>>>
>>>>>>>> newurlNode.refresh("toplevelform:j_id26:var1,
>>>>>>>> toplevelform:j_id26:var2,
>>>>>>>> toplevelform:j_id26:var3");
>>>>>>>>
>>>>>>>> Dan
>>>>>>>>
>>>>>>>> stuartr wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>> Sure
>>>>>>>>>
>>>>>>>>> What happens is that I generate a table using a binding and within
>>>>>>>>> the
>>>>>>>>> table
>>>>>>>>> there is a column
>>>>>>>>> which is a hyper link.
>>>>>>>>> I have defined an onclick to invoke a javascript function.
>>>>>>>>>
>>>>>>>>> I also have 3 hidden variables as
>>>>>>>>> <webuijsf:hidden id="var1" value="#{backingBean.var1Value}" />
>>>>>>>>> <webuijsf:hidden id="var2" value="#{backingBean.var2Value}" />
>>>>>>>>> <webuijsf:hidden id="var3" value="#{backingBean.var3Value}" />
>>>>>>>>>
>>>>>>>>> function linkClicked(row,data) {
>>>>>>>>>
>>>>>>>>> alert("User has pressed something on row "+row+" Data item
>>>>>>>>> "+data);
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> newurlNode=document.getElementById("toplevelform:j_id26:var3");
>>>>>>>>> alert("Present value is "+newurlNode.text);
>>>>>>>>>
>>>>>>>>> // okay we have a drilldown on data within a panel of
>>>>>>>>> reports.
>>>>>>>>>
>>>>>>>>> rowDomNode=document.getElementById("toplevelform:j_id26:va1");
>>>>>>>>> rowDomNode.value=row;
>>>>>>>>>
>>>>>>>>> columnDomNode=document.getElementById("toplevelform:j_id26:var2");
>>>>>>>>> columnDomNode.value=data;
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> rowDomNode.refresh("toplevelform:j_id26:var1,toplevelform:j_id26:var2");
>>>>>>>>>
>>>>>>>>> // now refresh the actual new urlnode to having a new
>>>>>>>>> value.
>>>>>>>>>
>>>>>>>>> columnDomNode.refresh("toplevelform:j_id26:var3");
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> newurlNode=document.getElementById("toplevelform:j_id26:var3");
>>>>>>>>>
>>>>>>>>> newurlNode.refresh(); // get the value from the back end.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> alert("THe value should have changed by now
>>>>>>>>> "+newurlNode.value);
>>>>>>>>>
>>>>>>>>> popupWin = window.open(newurlNode.value,'View File
>>>>>>>>> Link','scrollbars,resizable,width=700,height=900,top='+((screen.height
>>>>>>>>> -
>>>>>>>>> (screen.height/1.618)) - (500/2))+',left='+((screen.width-650)/2)
>>>>>>>>> );
>>>>>>>>>
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Now I now that the backing bean is being called as by log4j output
>>>>>>>>> shows
>>>>>>>>> that the setter method is being invoked
>>>>>>>>>
>>>>>>>>> public String getVar3Value() {
>>>>>>>>> String rtn="INITIALVALUE";
>>>>>>>>>
>>>>>>>>> if ( !firstTime ) {
>>>>>>>>> .....do some work...
>>>>>>>>> rtn="value from doing work";
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> return rtn;
>>>>>>>>> }
>>>>>>>>>
>>>>>>>>> Everything works all the way to the return statement. However the
>>>>>>>>> new
>>>>>>>>> value
>>>>>>>>> never gets reflected in the client.
>>>>>>>>> The client just stays at the initial value which was set within
>>>>>>>>> getVar3Value
>>>>>>>>> the first time the code was called.
>>>>>>>>> I have debug within the if block so I can see exactly what is
>>>>>>>>> getting
>>>>>>>>> called, the client just never updates the value .
>>>>>>>>>
>>>>>>>>> Also, I tried a hyperlink on the screen as per the examples within
>>>>>>>>> woodstock
>>>>>>>>> and I expected to see the hyperlink change however, nothing
>>>>>>>>> happens.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Anyhelp appreciated.
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>>
>>>>>>>>> ( Ps Im using nearly all of the woodstock components within this
>>>>>>>>> application
>>>>>>>>> so im quite used to the syntax and model )
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Venkatesh Babu-5 wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> Could you show the code snippet for the ajax refresh you are
>>>>>>>>>> doing.
>>>>>>>>>> How are you updating the server side data and doing the label
>>>>>>>>>> refresh.
>>>>>>>>>>
>>>>>>>>>> -Venky
>>>>>>>>>>
>>>>>>>>>> stuartr wrote:
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>> Guys
>>>>>>>>>>> Im having a problem with any of the textfield, hidden , hyperlink
>>>>>>>>>>> etc
>>>>>>>>>>> to
>>>>>>>>>>> allow for ajax refresh.
>>>>>>>>>>> My code has an onclick which updates the server side, and then
>>>>>>>>>>> invokes
>>>>>>>>>>> a
>>>>>>>>>>> refresh on a label
>>>>>>>>>>> I have on the screen. Basically, the code at the back end bean
>>>>>>>>>>> gets
>>>>>>>>>>> invoked
>>>>>>>>>>> to get the new value
>>>>>>>>>>> for the label, and using firebug I can see the request.
>>>>>>>>>>> However, nothing happens at the client side. the label just never
>>>>>>>>>>> changes
>>>>>>>>>>> its value.
>>>>>>>>>>>
>>>>>>>>>>> Im using facelets along with my woodstock components.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Stu
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Dan Labrecque wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> The prototype was available in the Woodstock milestone builds,
>>>>>>>>>>>> but
>>>>>>>>>>>> is
>>>>>>>>>>>> disabled for the official 4.1 release. It will be enabled again
>>>>>>>>>>>> in
>>>>>>>>>>>> the
>>>>>>>>>>>> 4.2 milestone builds as we complete the widget.
>>>>>>>>>>>>
>>>>>>>>>>>> Dan
>>>>>>>>>>>>
>>>>>>>>>>>> Lking wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks Dan.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Is this "table2" available for trying?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Nov 21, 2007 6:46 PM, Dan Labrecque <Dan.Labrecque_at_sun.com
>>>>>>>>>>>>> <mailto:Dan.Labrecque_at_sun.com>> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>> Not all components support this API -- please see the TLD
>>>>>>>>>>>>> for
>>>>>>>>>>>>> supported
>>>>>>>>>>>>> JavaScript features. There is a table2 component in the
>>>>>>>>>>>>> works
>>>>>>>>>>>>> which is
>>>>>>>>>>>>> fully Ajax enabled and supports the refresh feature.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Dan
>>>>>>>>>>>>>
>>>>>>>>>>>>> Lking wrote:
>>>>>>>>>>>>> > How can I get a client-side update with the Table
>>>>>>>>>>>>> component?
>>>>>>>>>>>>> > I was trying something like...
>>>>>>>>>>>>> >
>>>>>>>>>>>>> >
>>>>>>>>>>>>>
>>>>>>>>>>>>> onChange="document.getElementById('form1:table1').refresh('form1:textfield1');"
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > but it doesn't work.
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > thanks.
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>>> users-unsubscribe_at_woodstock.dev.java.net
>>>>>>>>>>>>> <mailto:users-unsubscribe_at_woodstock.dev.java.net>
>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>> users-help_at_woodstock.dev.java.net
>>>>>>>>>>>>> <mailto:users-help_at_woodstock.dev.java.net>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe_at_woodstock.dev.java.net
>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> users-help_at_woodstock.dev.java.net
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
>