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

Posted

技术标签:

【中文标题】Wicket 重定向:如何传递参数并使 URL 保持“漂亮”?【英文标题】:Wicket redirect: how to pass on parameters and keeps URLs "pretty"? 【发布时间】:2011-05-08 12:32:02 【问题描述】:

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

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

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

setResponsePage(new AnotherPage(parameters));

但是,当像这样创建一个新的 Page 对象时,我最终会得到一个 URL,例如 /?wicket:interface=:1::::,而不是干净的 /another。另一个页面定义为:

@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 的路径),并且 我刚刚意识到我真的应该从一开始就提到,如果它这样做也没关系(只要它“漂亮”并且参数传递)!

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

很抱歉,如果这对其他人来说很奇怪、不清楚或无用。如果您对重命名有任何建议,请随时发表评论。

【问题讨论】:

【参考方案1】:

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

IndexedHybridUrlCodingStrategy IndexedParamUrlCodingStrategy MixedParamUrlCodingStrategy QueryStringUrlEncodingStrategy

【讨论】:

【参考方案2】:

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

下一步是确定使用哪种 URL 编码策略。除非明确指定,否则默认使用BookmarkablePageRequestTargetUrlCodingStrategy。在上面的示例中,条款页面使用默认值。

我认为您需要安装另一个 url 编码策略,可能类似于 HybridUrlCodingStrategy

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

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

【讨论】:

谢谢!快速测试了@MountMixedParam,但它似乎没有帮助(或者我没有正确使用它)。但是现在必须冲刺;我明天会调查一下。 对不起;事实证明我没有表达我真正想要的,因为完全省略重定向实际上实现了这一点(请参阅更新的问题)。那好吧。 :)【参考方案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 发生相同的事情。 不,等等,它确实有效!我也需要从我的代码中删除setRedirect(true)。所以+1。在接受答案之前,我会调查其他建议。 省略setRedirect(true) 就足以得到我实际想要的东西(请参阅更新的问题),但我会接受这一点,至少现在是这样,因为getRequestCycle().setResponsePage(class, params)是我一直在寻找的东西(即使您想传递参数,也无需自己创建 Page 对象)。【参考方案4】:

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

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

【讨论】:

我刚试过这个,但不幸的是它不起作用;至少不是没有其他一些变化。 (对我来说,这会产生一个空页面,url 变成了 /another/param1/value1/param2/value2 之类的东西。) 与mfunk's answer 一样,在删除setRedirect(true) 之后,这确实 工作。所以+1;在决定接受什么之前,我会进行更多调查。

以上是关于Wicket 重定向:如何传递参数并使 URL 保持“漂亮”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个页面上重定向并从表中传递 url 中的参数?

将数组作为url参数传递并重定向到新页面

如何在Vue中提交表单,重定向到新路由并传递参数?

使用 PageParameters 时将信息消息传递到 Wicket 页面

关于sendRedirect重定向 参数的传递方式?

JS:如何通过重定向功能将url传递给登录功能