Wicket重定向:如何传递参数并保持URL“漂亮”?

时间:2010-11-11 14:46:48

标签: java redirect wicket friendly-url

考虑一个重定向到另一个页面的Wicket WebPage(基于此处省略的一些逻辑):

public class SomePage extends WebPage {
    public SomePage(PageParameters parameters) {
        setResponsePage(AnotherPage.class);
        setRedirect(true);
    }
}

我需要将PageParameters传递给其他页面,这似乎是这样做的方法:

setResponsePage(new AnotherPage(parameters));

但是,在创建这样的新Page对象时,我最终会使用/?wicket:interface=:1::::之类的网址,而不是干净的/another。 AnotherPage定义为:

@MountPath(path = "another")
public class AnotherPage extends WebPage {
    // ...
}

(其中MountPath来自org.wicketstuff.annotation.mount包。)

所以,我的问题是:

  • 传递params的其他方法?
  • 保持网址漂亮的一些方法?上面是Wicket Stuff的具体限制而不是核心Wicket?

更新

嘿,结果任何建议的方法都有效,我最初尝试的内容 - setResponsePage(new AnotherPage(parameters)) - 只要我删除setRedirect(true) }。在这种情况下,URL确实保持不变(SomePage的路径),并且我刚刚意识到我真的应该从一开始就提到过,如果它确实没问题(只要它“非常”并且参数传递)!

页面(“SomePage”)基于查询参数将请求分派给几个看起来不同但通过相同URL访问的可能结果页面。我试图尽可能地将问题表述为通用和极简主义,但是当我遗漏相关信息时,这就出错了。 : - /

对不起,如果这对别人来说很奇怪,不清楚或无用。如果您有关于重命名的建议,请随时发表评论。

4 个答案:

答案 0 :(得分:5)

seanizer有正确的想法,但为了完整起见,除BookmarkablePageRequestTargetUrlCodingStrategyHybridUrlCodingStrategy之外还有更多选项:

答案 1 :(得分:4)

我认为this reference page上的关键词是:

  

下一步是确定要使用的URL编码策略。除非指定了一个表达式,否则使用的默认值为BookmarkablePageRequestTargetUrlCodingStrategy。在上面的示例中,“条款”页面使用默认值。

我认为您需要安装其他网址编码策略,可能类似于HybridUrlCodingStrategy

编辑:您可能只需要添加此注释即可:

@MountMixedParam(parameterNames={"param1", "param2"})

答案 2 :(得分:3)

也许Component中的其他setResponsePage方法更接近你想要的东西:

/**
 * Sets the page class and its parameters that will respond to this request
 * 
 * @param <C>
 * 
 * @param cls
 *            The response page class
 * @param parameters
 *            The parameters for this bookmarkable page.
 * @see RequestCycle#setResponsePage(Class, PageParameters)
 */
public final <C extends Page> void setResponsePage(final Class<C> cls, PageParameters parameters)
{
    getRequestCycle().setResponsePage(cls, parameters);
}

答案 3 :(得分:1)

我已成功使用onClick处理程序中的这个,但还不确定它是否也可以从构造函数中运行:

getRequestCycle().setRequestTarget(new BookmarkablePageRequestTarget(ReportPage.class, params));