Over a million developers have joined DZone.

Tapestry 5.3+ New Features : Part 2

DZone's Guide to

Tapestry 5.3+ New Features : Part 2

· Java Zone ·
Free Resource

The CMS developers love. Open Source, API-first and Enterprise-grade. Try BloomReach CMS for free.


This is one of the most useful feature of Tapestry 5.3. There is already a concept of Zone in Tapestry for Ajax but now it is complimented by AjaxResponseRenderer. This fills a lot of gaps at least for people coming from Wicket. It is a bit similar to AjaxRequestTarget but empowered with Zones and JSON. I have compiled a small example demonstrating most of the features.

Please Note : This is only a demonstration of how AjaxResponseRenderer is used. Obviously you should always prefer the ‘Zone way’ of doing things. Only when you need a combination of zone updates(multiple), small JavaScript callbacks and JSON callbacks, you can use this service. Also when you want to do different things(explained below) in different event handlers (may be belonging to different components), this service can be of great help.


@Import(library = "testJSON.js")
public class NewAjax {
    private AjaxResponseRenderer ajaxResponseRenderer;

    private Zone topZone;

    private Zone bottomZone;

    private JavaScriptSupport javaScriptSupport;

    private EventLink jsonCallbackLink;

    private Messages messages;

    void addJavaScript(){
        javaScriptSupport.addInitializerCall("testJSON", jsonCallbackLink.getClientId());

    void showAlert() {
        ajaxResponseRenderer.addCallback(new JavaScriptCallback() {
            public void run(JavaScriptSupport javascriptSupport) {
                    String.format("alert('%s');", messages.get("server.hello")));

    void sendJSON() {
        ajaxResponseRenderer.addCallback(new JSONCallback() {
            public void run(JSONObject reply) {
                reply.put("message", messages.get("server.message"));

    void showZones() {
        ajaxResponseRenderer.addRender("topZone", topZone).
            addRender("bottomZone", bottomZone);

    public Date getDate() {
        return new Date();

<html xmlns:t='http://tapestry.apache.org/schema/tapestry_5_1_0.xsd'>
        <title>New Ajax Features</title>

        <div t:type='zone' t:id='topZone'>
             Zone ${date}

        <a href='#' t:type='eventLink'
           t:event='multipleZoneUpdate' t:zone='topZone' t:id='multipleZoneLink'>
            Multiple Zone Update

        <div t:type='zone' t:id='bottomZone'>
            Bottom Zone ${date}


        <a t:type='eventLink' t:zone='topZone'
           t:id='javaScriptCallbackLink' t:event='serverAlert'>
            Show Feedback alert


        <a t:type='eventLink' t:id='jsonCallbackLink' t:event='sendJSON'>
            Get alert message from server!

Tapestry.Initializer.testJSON = function(elementId){
    $(elementId).observe("click", function(event){

        Tapestry.ajaxRequest($(elementId).href, function(response){

server.hello=Hello from Server!
server.message=Message from Server!!

For Multiple Zone Update

Instead of using MultiZoneUpdate, you can use AjaxRequestRenderer. The advantage is that it is now a service. You can call it from multiple event handlers present in different components handling the same event. Or imagine an event handler in a component which triggers another event that is handled by the container component. Now the component can add its internal zone and then trigger an event to which the container can respond by adding its own zone!!.

Using JavaScript callback

You can now do something on server-side and return an alert message !!

Using JSON callback

You can send a JSON response in addition to updating multiple zones !!

From http://tawus.wordpress.com/2011/10/01/tapestry-5-3-new-features-part-2/

BloomReach CMS: the API-first CMS of the future. Open-source & enterprise-grade. - As a Java developer, you will feel at home using Maven builds and your favorite IDE (e.g. Eclipse or IntelliJ) and continuous integration server (e.g. Jenkins). Manage your Java objects using Spring Framework, write your templates in JSP or Freemarker. Try for free.


Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}