【问题标题】:Wicket redirect: how to pass on parameters and keeps URLs "pretty"?Wicket 重定向:如何传递参数并使 URL 保持“漂亮”?
【发布时间】: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 访问。我试图将问题表述为尽可能通用和简约,但由于我遗漏了相关信息,结果出现了问题。 :-/

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

【问题讨论】:

    标签: java redirect wicket friendly-url


    【解决方案1】:

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

    【讨论】:

      【解决方案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;在决定接受什么之前,我会进行更多调查。
      猜你喜欢
      • 1970-01-01
      • 2013-01-18
      • 2021-03-22
      • 2021-03-21
      • 2016-04-19
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多