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 有正确的想法,但为了完整起见,还有比BookmarkablePageRequestTargetUrlCodingStrategy
和HybridUrlCodingStrategy
更多的选项:
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 保持“漂亮”?的主要内容,如果未能解决你的问题,请参考以下文章