You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Julien Ruchaud <ju...@codelutin.com> on 2009/06/12 14:33:51 UTC

Tapestry working with ZK component

Hi,

I played a little bit with ZK and Tapestry this morning and I achieved
something quite nice : I succeeded in inserting a ZK component in
Tapestry page, and this component can call Tapestry actions.

Here is how to do it :
1) Install ZK :
2) The Tapestry Component that allows including any ZK component :
public class ZkComponent {
	
	@Parameter(required = true, defaultPrefix = BindingConstants.LITERAL)
	private String name;

    @Inject
    private RequestGlobals requestGlobals;
    
    @Inject
    private ComponentResources resources;
    
    boolean setupRender(MarkupWriter writer) throws ServletException, IOException {
    	HttpServletRequest request = requestGlobals.getHTTPServletRequest();
    	HttpServletResponse response = requestGlobals.getHTTPServletResponse();
    	
    	request.setAttribute("resources", resources);
    	request.setAttribute("id", resources.getId());
    	
    	CharResponseWrapper body = new CharResponseWrapper(response);
    	request.getRequestDispatcher(name + ".zul").include(request, body);
    	
    	writer.writeRaw(body.toString());
		return true;
	}

    public class CharResponseWrapper extends HttpServletResponseWrapper {
        private CharArrayWriter output;

        public String toString() {
            return output.toString();
        }
          
        public CharResponseWrapper(HttpServletResponse response) {
            super(response);
            output = new CharArrayWriter();
        }

        public PrintWriter getWriter() {
            return new PrintWriter(output);
        }
    }
}

3) Use in Tapestry page :

<t:ZkComponent t:id="testId" name="test"/>

This will insert the test.zul component

4) ZK component with the Tapestry call :
This component is a button. When you click on it, it fires an event to call the Tapestry action displaying a JSONArray("This is a test : ", param); param beeing the button name.

<zk>
    <button id="${id}" label="Try" onClick="sendEventOnAction()"/>
    <zscript>
        import org.apache.tapestry5.ComponentEventCallback;
        import org.apache.tapestry5.ComponentResources;
        import org.apache.tapestry5.internal.util.Holder;

        ComponentResources resources = execution.getAttribute("resources");
        
        // Get button with id
        String id = execution.getAttribute("id");
        Button btm = spaceOwner.getFellow(id);
        
        void sendEventOnAction(){
            Object result = onAction();
            alert("result = " + result);
            btm.label="ok";
        }
        
        Object onAction() {
            // Manage trigger result
            final Holder holder = Holder.create();
            ComponentEventCallback callback = 
                new ComponentEventCallback() {
                    public boolean handleResult(Object result) {
                        holder.put(result);
                        return true;
                    }
            };
            
            // Run event 
            resources.triggerEvent("action", new Object[] {btm.label}, callback);
            return holder.get();
        }
    </zscript>
    
</zk>

5) Tapestry action

Object onAction(String param) {
		return new JSONArray("This is a test : ", param);
	}

I also tried with different ZK components, it seems to work pretty fine.

I hope this can help some people.

Best Regards,

Julien & Jean for translating :D

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org


Re: Tapestry working with ZK component

Posted by "Thiago H. de Paula Figueiredo" <th...@gmail.com>.
Nice!

One suggestion: instead of injecting RequestGlobals, you can inject
HttpServletRequest directly. ;)

-- 
Thiago

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tapestry.apache.org
For additional commands, e-mail: users-help@tapestry.apache.org