通过Wicket中的URL使操作可用

通过Wicket中的URL使操作可用,wicket,wicket-1.6,Wicket,Wicket 1.6,对于Facebook等服务的身份验证,我们重定向到Facebook,他们进行身份验证,然后重定向回。一旦他们重定向回来,我们的代码就会运行,执行一些操作,然后显示一个响应页面。显示哪个响应页面取决于许多因素 我们现在正在做的是: class RedirectTargetPage extends WebPage { @Override public void onBeforeRender() { String getParam = getRequest().getQuery

对于Facebook等服务的身份验证,我们重定向到Facebook,他们进行身份验证,然后重定向回。一旦他们重定向回来,我们的代码就会运行,执行一些操作,然后显示一个响应页面。显示哪个响应页面取决于许多因素

我们现在正在做的是:

class RedirectTargetPage extends WebPage {
    @Override public void onBeforeRender() {
        String getParam = getRequest().getQueryParameters()
            .getParamterValue("get-param");
        ......
        if (...) setResponsePage(PageOne.class);
        else if (...) setResposnePage(PageTwo.class);
        else ... // etc
    }
}
然后,我们使用查找此页面的URL,将其传递到Facebook,Facebook在验证后重定向回我们,一切正常

然而,这不是一个真正的页面?我的意思是,它只是一段位于URL后面的代码,最后调用
setResponsePage
。在我看来,我所写的只是一些处理请求的东西,似乎我可以创建一个
IRequestHandler
,并使用类似以下内容获取指向它的URL:

class RedirectTarget implements IRequestHandler {
    @Override public void respond(IRequestCycle requestCycle) {
        String getParam = requestCycle.getRequest().getQueryParameters()
            .getParameterValue("get-param");
        ....
        if (...) requestCycle.setResposnePage(..)
    }
}

唉,
urlFor(new RedirectTarget())
提供了
null
!怎么了?我能做什么?重写
onBeforeReder
是可行的,但它看起来并不优雅……

虽然您可以根据现在用于定义将使用哪个重定向页面的相同条件加载不同的组件,从而使
IRequesthandler
成为一个页面,但您也应该能够采用
IRequesthandler
的方式

从JavaDoc:

返回请求处理程序的呈现URL,如果 处理程序不可能被呈现


由于某种原因,您的处理程序似乎无法呈现。您是否已通过
urlFor
查看哪里出了问题?

您可以使用自定义请求映射器:

public class FacebookResponseMapper implements IRequestMapper {

  @Override
  public int getCompatibilityScore(Request request) {
    if (getPage(request.getUrl()) != null) {
      return Integer.MAX_VALUE;
    }
    return 0;
  }

  @Override
  public IRequestHandler mapRequest(Request request) {
    Class<? extends Page> page = getPage(request.getUrl());
    if (page != null){
      return new RenderPageRequestHandler(new PageProvider(page));
    }

    return null;
  }

  /**
   * Get a page for the given url.
   */
  protected Class<? extends Page> getPage(Url url) {
    if (!url.getPath().startsWith("from-facebook") {
      return null;
    }

    // detect proper page depending on url parameters
    ...
  }

  @Override
  public Url mapHandler(IRequestHandler requestHandler) {
    return null;
  }
}

我也有同样的问题,并且使用了
IRequestHandler
的自定义实现。不过,我不确定这是否是个好主意,因为这样的处理程序是按实例装载的,而不是按页面类型装载的

因此,与页面不同,您装载请求处理程序的单个实例,例如:

mount(新的MountMapper(“path”,CustomHandler.get())

get()方法检索CustomHandler的单例实例。然后可以生成如下链接:

CharSequence relativeUrl = RequestCycle.get().urlFor(CustomHandler.get());
String link = RequestCycle.get().getUrlRenderer().renderFullUrl(Url.parse(relativeUrl));
这对我有用


但是,我不知道如何在生成链接时指定查询参数。对于页面,您可以创建一个页面的新实例,该实例具有自己特定的参数映射,但由于我们必须使用一个已装入的实例,因此这不起作用。

我可能会误解,但为什么您需要所有额外的非页面内容

您将要对用户做一些事情,为什么不将他们发送到他们想要直接访问的页面,并使用命名参数来指导他们呢

例如:

@MountPath(value = "/handlerpage/${fromparam}")
public class MyHandlerPage extends WebPage {
    public MyHandlerPage(PageParameters parameters) {
    super(parameters);
    final StringValue fromParam = parameters.get("fromparam");
        // Do my thing with page depending on the param.
    }
}
这将允许您跳过所有时髦的请求处理程序代码。如果需要,您甚至可以使用选项参数进行设置

@MountPath(value = "/handlerpage/${fromparam}")
public class MyHandlerPage extends WebPage {
    public MyHandlerPage(PageParameters parameters) {
    super(parameters);
    final StringValue fromParam = parameters.get("fromparam");
        // Do my thing with page depending on the param.
    }
}