Apache Wicket > Framework Documentation > Reference library > How to do things in Wicket > General Application > AJAX update and file download in one blow
Added by Ernesto Reinaldo Barreiro, last edited by Sven Meier on Oct 24, 2009  (view change) show comment

Following example shows how to use an AJAX request to refresh some components and at the same time make the browser ask back for a file to be downloaded:

	final AJAXDownload download = new AJAXDownload()
	{
		@Override
		protected IResourceStream getResourceStream()
		{
			return createResourceStream(item.getModelObject());
		}
	};
	item.add(download);

	item.add(new AjaxLink<Void>("link") {
		@Override
		public void onClick(AjaxRequestTarget target)
		{
			// do whatever with the target, e.g. refresh components
			target.addComponent(...);

			// finally initiate the download
			download.initiate(target);
		}
	});

We have to add a custom behavior which enables us to initiate the download after the AJAX request has been completed. The overridden hook method provides an IResourceStream (e.g. a FileResourceStream) to serve the actual content.

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AbstractAjaxBehavior;
import org.apache.wicket.request.target.resource.ResourceStreamRequestTarget;
import org.apache.wicket.util.resource.IResourceStream;

/**
 * @author Sven Meier
 * @author Ernesto Reinaldo Barreiro (reiern70@gmail.com)
 */
public abstract class AJAXDownload extends AbstractAjaxBehavior
{
	/**
	 * Call this method to initiate the download.
	 */
	public void initiate(AjaxRequestTarget target)
	{
		CharSequence url = getCallbackUrl();

		target.appendJavascript("window.location.href='" + url + "'");
	}

	public void onRequest()
	{
		getComponent().getRequestCycle().setRequestTarget(
				new ResourceStreamRequestTarget(getResourceStream(), getFileName()));
	}

	/**
	 * @see ResourceStreamRequestTarget#getFileName()
	 */
	protected String getFileName()
	{
		return null;
	}

	/**
	 * Hook method providing the actual resource stream.
	 */
	protected abstract IResourceStream getResourceStream();
}