Today I was working with a "Facebook interface" to an application being rewritten with Wicket. I needed to do a redirect, and as you probably know, a "normal" redirect does not work if the Facebook app is running in the "FBML mode".
Facebook provides a custom tag to accomplish a redirect within the Facebook canvas - Fb:redirect (http://wiki.developers.facebook.com/index.php/Fb:redirect
).
I ended up doing a custom IRequestTarget implementation for this purpose, and thought I'd share what I came up with here. Please bear with my very limited experience with Wicket, I was just happy to get it working for my simple need. Feel free to edit/add to this as you see fit.
This is how I use it in my code, relevant code below:
page.getRequestCycle().setRequestTarget(new FBRedirectRequestTarget(SomeCanvasPageToRedirectTo.class));
Custom request target:
import org.apache.wicket.Page;
import org.apache.wicket.PageParameters;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.request.IRequestCycleProcessor;
import org.apache.wicket.request.target.component.BookmarkablePageRequestTarget;
public class FBRedirectRequestTarget extends BookmarkablePageRequestTarget
{
public FBRedirectRequestTarget(Class pageClass)
{
this(pageClass, null);
}
public FBRedirectRequestTarget(Class pageClass,
PageParameters pageParameters)
{
super(null, pageClass, pageParameters);
}
public void respond(RequestCycle requestCycle)
{
IRequestCycleProcessor processor = requestCycle.getProcessor();
String redirectUrl = processor.getRequestCodingStrategy().encode(
requestCycle, this).toString();
Page page = new RedirectPage(redirectUrl);
page.renderPage();
}
}
Simple page for the FBML markup:
import org.apache.wicket.markup.html.WebPage;
public class FBRedirectPage extends WebPage
{
public FBRedirectPage(String url)
{
add(new FBRedirectTag("redirect", url));
}
}
Markup for the above page (FBRedirectPage.html):
<fb:redirect wicket:id="redirect" url="" class="code-quote">"#" />
Component for the <fb:redirect> tag:
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
public class FBRedirectTag extends Label
{
public FBRedirectTag(String id, String url)
{
super(id);
add(new SimpleAttributeModifier("url", url));
}
}