Comments
Matt McLarty wrote: For more info... Follow me on Twitter See our website
Cloud Expo on Google News


2008 West
DIAMOND SPONSOR:
Data Direct
SOA, WOA and Cloud Computing: The New Frontier for Data Services
PLATINUM SPONSORS:
Red Hat
The Opening of Virtualization
GOLD SPONSORS:
Appsense
User Environment Management – The Third Layer of the Desktop
Cordys
Cloud Computing for Business Agility
EMC
CMIS: A Multi-Vendor Proposal for a Service-Based Content Management Interoperability Standard
Freedom OSS
Practical SOA” Max Yankelevich
Intel
Architecting an Enterprise Service Router (ESR) – A Cost-Effective Way to Scale SOA Across the Enterprise
Sensedia
Return on Assests: Bringing Visibility to your SOA Strategy
Symantec
Managing Hybrid Endpoint Environments
VMWare
Game-Changing Technology for Enterprise Clouds and Applications
Click For 2008 West
Event Webcasts

2008 West
PLATINUM SPONSORS:
Appcelerator
Get ‘Rich’ Quick: Rapid Prototyping for RIA with ZERO Server Code
Keynote Systems
Designing for and Managing Performance in the New Frontier of Rich Internet Applications
GOLD SPONSORS:
ICEsoft
How Can AJAX Improve Homeland Security?
Isomorphic
Beyond Widgets: What a RIA Platform Should Offer
Oracle
REAs: Rich Enterprise Applications
Click For 2008 Event Webcasts
SYS-CON.TV
Top Links You Must Click On


Using RichFaces a4j:jsFunction Send an Ajax Request From Any JavaScript
For Power and Flexibility

There are four components in the a4j: tag library which enable you to send an Ajax request. They are a4j:commandButton, a4j:commandLink, a4j:support, and a4j:poll. All provide rather specific functionality. For example, a4j:commandButton will generate an HTML button that fires an Ajax request. a4j;commandLink will do the same but generates a link. a4j:support is always attached to another JSF component to enable sending an Ajax request based on some event supported by the parent component. a4j:poll which allows sending Ajax requests periodically. There is one more tag called a4j:jsFunction. This tags gives you a lot of power and flexibility. a4j:jsFunction lets you send an Ajax request from any user-defined JavaScript function. It can be a custom function or from any component-event as well. The good news is that it works just like any other tags I listed above, it has all the same attributes such as reRender, action, actionListener, bypassUpdates, ajaxSingle and so on.

Suppose you would like to send an Ajax request when the mouse moves over some plain HTML content on the page, in other words, when mouseover event occurs. We can’t use a4j:support because it can only be attached to another JSF component. One option is to write a custom JavaScript function that would fire an Ajax request, include any parameters from the page and of course participate in JSF life cycle. It’s probably not something we want to, right? We don’t do it with a4j:commandButton, so why would be suddenly write such JavaScript function? Well, as it turns out we don’t need to do it because a4j:jsFunction provides exactly what we need.

When we place a4j:jsFunction on a page, a JavaScript function will be rendered that fires a regular Ajax request, not much different than we use a4j:commandButton or a4j:support tags. All we need to do is just call this function.

<h:form> 
<table>
<tr>
<td onmouseover="setdrink('Espresso','grey')"
onmouseout="setdrink('','')">Espresso</td>
<td onmouseover="setdrink('Cappuccino', 'brown')"
onmouseout="setdrink('','')">Cappuccino</td>
<td onmouseover="setdrink('Tea', 'green')"
onmouseout="setdrink('','')">Tea</td>
</tr>
</table>
<a4j:jsFunction name="setdrink" reRender="drink" >
<a4j:actionparam name="param1" assignTo="#{bean.drink}"/>
<a4j:actionparam name="param2" assignTo="#{bean.bgColor}"/>
</a4j:jsFunction>
<h:outputText id="drink" value="#{bean.drink}"
style="BACKGROUND-COLOR: #{bean.bgColor};"/>
</h:form>

In above code we call what appears to be a regular JavaScript function named setdrink(..). In fact it is a regular JavaScript function. It’s defined via a4j:jsFunction tag. This is what the tag rendered on the page:

<script id="j_id2:j_id4" type="text/javascript">
//<![CDATA[setdrink=function(param1,param2)
{A4J.AJAX.Submit('j_id2',null,
{'similarityGroupingId':'j_id2:j_id4',
'parameters':{'param1':param1,'param2':param2,'j_id2:j_id4':'j_id2:j_id4'} } )};
//]]>
</script>

Notice that setdrink(..) takes two parameters. These parameters are passed to the server using a4j:actionparam tag. The name in a4j:actionparam is not important but should be set to something. The order is important. In other wordds, the value of the first parameters to the JavaScript function will be set into #{drink.bean} property in backing bean. Finally reRender attribute is used in the same way as with any other tag.

The managed bean looks like this:

public class Bean {
private String drink;
private String bgColor;
// getters and setters
}

Here is one more example:

<h:form> 
<h:inputText value="#{bean.drink}" />
<input type="button" value="Submit" onclick="fireAjax();"/>
<h:outputText id="drink" value="#{bean.drink}" />
<a4j:jsFunction name="fireAjax" reRender="drink"/>
</h:form>

Nothing is stopping us from doing something like this:

<script>
function sendAjaxForm(){
// custom code here
fireAjax();
}
</script>
<h:form>
<h:inputText value="#{bean.drink}" />
<input type="button" value="Submit" onclick="sendAjaxForm();"/>
<h:outputText id="drink" value="#{bean.drink}" />
<a4j:jsFunction name="fireAjax" reRender="drink"/>
</h:form>

If there was an action you wanted to invoke, then a4j:jsFunction would look like this:

<a4j:jsFunction name="fireAjax"  action="#{bean.someAction}" reRender="drink"/>

Let’s look at another example.

<h:form> 
<h:panelGrid columns="2">
<rich:pickList value="#{bean.selection}"
sourceListWidth="100px"
targetListWidth="100px"
onlistchanged="sendAjax();">
<f:selectItem itemLabel="Espresso" itemValue="Espresso"/>
<f:selectItem itemLabel="Cappuccino" itemValue="Cappuccino"/>
<f:selectItem itemLabel="Tea" itemValue="Tea"/>
</rich:pickList>
<rich:dataList id="selection" value="#{bean.selection}" var="drink">
<h:outputText value="#{drink}" />
</rich:dataList>
</h:panelGrid>
<a4j:jsFunction name="sendAjax" reRender="selection"/>
</h:form>

In above example, when the list changes an Ajax request is fired and rich:dataList component is updated to show the new list. This is just an example to illustrate how a4j:jsFunction works. I’m guessing that most developers would just nest a4j:support tag to achieve the same result:

<rich:pickList value="#{bean.selection}" 
sourceListWidth="100px"
targetListWidth="100px">
<f:selectItem itemLabel="Espresso" itemValue="Espresso"/>
<f:selectItem itemLabel="Cappuccino" itemValue="Cappuccino"/>
<f:selectItem itemLabel="Tea" itemValue="Tea"/>
<a4j:support event="onlistchanged" reRender="selection"/>
</rich:pickList>

If you were not sure how a4j:jsFunction tag works, I hope this posts makes it all clear. The tag is actually very simple, it works just like all other tags that fire an Ajax request but also provides a lot of flexibility. It’ s now possible to fire an Ajax request from any custom JavaScript function or client event without having to write a single line of JavaScr

Read the original blog entry...

About Max Katz
Max Katz is a Senior Systems Engineer at Exadel. He has been helping customers jump-start their RIA development as well as providing mentoring, consulting, and training. Max is a recognized subject matter expert in the JSF developer community. He has provided JSF/RichFaces training for the past four years, presented at many conferences, and written several published articles on JSF-related topics. Max also leads Exadel's RIA strategy and writes about RIA technologies in his blog, http://mkblog.exadel.com. He is an author of "Practical RichFaces" book (Apress). Max holds a BS in computer science from the University of California, Davis.

Enterprise Open Source Magazine Latest Stories . . .
Cloud computing is creating the new Wall Street boom, according to NIA. The only industry that is as bright as cloud computing on Wall Street is social networking, NIA said in a recent report. 2012 will be known as the year cloud computing became widely adopted worldwide. Cloud comput...
The impact of Big Data is extremely broad for business, information management and technology. Being able to analyze your growing mountain of data can give you a distinct competitive advantage, but Big Data can be more than traditional tools can handle. In his session at the 10th Int...
In this CTO Power Panel at the 10th International Cloud Expo, moderated by Cloud Expo Conference Chair Jeremy Geelan, industry-leading CTOs & VPs of Technology will discuss such topics as: Which do you think is the most important cloud computing standard still to tackle? Who should...
China’s antitrust regulators gave Google’s $12.5 billion acquisition of Motorola Mobility the nod Saturday provided Google’s Android operating system remains open and free-of-charge for the next five years. The “free” stipulation apparently doesn’t apply to applications or services...
Citrix has acquired Virtual Computer, a little Massachusetts outfit with enterprise-scale management solutions for client-side virtualization. It means to combine the acquisition’s NxTop widgetry with its XenClient hypervisor to create a new Citrix XenClient Enterprise edition that c...
In the wake of the Facebook IPO fiasco, Nasdaq CEO Robert Greifeld beat his breast and told the Wall Street Journal along with other press Sunday that Nasdaq’s “acknowledged design problems” bungled the social network’s landmark lPO Friday. Reporters were told on a conference call ...
Subscribe to the World's Most Powerful Newsletters
Subscribe to Our Rss Feeds & Get Your SYS-CON News Live!
Click to Add our RSS Feeds to the Service of Your Choice:
Google Reader or Homepage Add to My Yahoo! Subscribe with Bloglines Subscribe in NewsGator Online
myFeedster Add to My AOL Subscribe in Rojo Add 'Hugg' to Newsburst from CNET News.com Kinja Digest View Additional SYS-CON Feeds
Publish Your Article! Please send it to editorial(at)sys-con.com!

Advertise on this site! Contact advertising(at)sys-con.com! 201 802-3021


SYS-CON Featured Whitepapers
ADS BY GOOGLE