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

5
考虑一个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::::的URL,而不是干净的/another。 AnotherPage的定义如下:
@MountPath(path = "another")
public class AnotherPage extends WebPage {
    // ...
}

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

所以,我的问题是:

  • 有其他传递参数的方式吗?
  • 有什么方法可以保持URL的美观性?上述限制是否是Wicket Stuff特定的限制而不是核心Wicket?

更新

嘿,事实证明,任何建议的方法都有效,而且我最初尝试的setResponsePage(new AnotherPage(parameters))也有效,只要我删除setRedirect(true)。在这种情况下,URL确实保持不变(指向SomePage的路径),并且我刚刚意识到,如果它能够“漂亮”地传递参数,那么即使URL保持不变也没关系!

该页面(“SomePage”)根据查询参数分派请求到几个可能看起来不同但通过相同URL访问的结果页面。我试图将问题尽可能通用和简约地表达,但由于我遗漏了相关信息,导致出现了问题。:-/

如果这个问题对别人来说很奇怪、不清楚或者没有用,请原谅。如果您对重命名有建议,请随时评论。

4个回答

5

4

我认为参考页面上的关键短语是:

下一步是确定要使用哪种URL编码策略。除非有明确指定,否则默认使用的是BookmarkablePageRequestTargetUrlCodingStrategy。在上面的示例中,Terms页面使用了默认设置。

我认为你需要挂载另一个URL编码策略,可能类似于HybridUrlCodingStrategy

编辑:你可能只需要添加此注释来实现:

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

谢谢!我快速测试了@MountMixedParam,但似乎没有帮助(或者我没有正确使用它)。但是现在得走了,明天我会再研究这个问题。 - Jonik
抱歉,事实证明我没有表达出我真正想要的,因为完全省略重定向实际上可以实现这一点(请参见更新的问题)。哦,好吧。 :) - Jonik

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);
}

谢谢,但是仅仅调用 getRequestCycle().setResponsePage(cls, parameters) 并不适合我。和 Tim's answer 一样会发生同样的事情。 - Jonik
不,等等,它确实有效!我也需要从我的代码中删除 setRedirect(true)。所以+1。在接受答案之前,我会调查其他建议。 - Jonik
忽略 setRedirect(true) 就足以得到我实际想要的结果(请参见更新的问题),但是至少现在我会接受这个答案,因为 getRequestCycle().setResponsePage(class, params) 是我正在寻找的东西(即使您想传递参数,也不需要自己创建页面对象)。 - Jonik

1

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

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

我刚试了一下,但不幸的是它不能正常工作;至少不仅需要这些更改。(对我而言,它会生成一个空页面,并且 URL 会变成类似于 /another/param1/value1/param2/value2 的东西。) - Jonik
mfunk 的回答 一样,只要移除 setRedirect(true),这个方法确实可以正常工作。所以点赞;在决定接受什么之前,我会再进行一些调查。 - Jonik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接