【问题标题】:wicket 1.5 url after form submission with stateful page带有状态页面的表单提交后的wicket 1.5 url
【发布时间】:2012-07-24 20:32:26
【问题描述】:

我知道这个(另一个)网站上有很多类似的问题,但没有一个能帮助我解决我的问题。 我有 2 个检票口状态页面。页面安装如下:

mountPage(firstPath, firstPage.class);
mountPage(secondPath, secondPage.class);

第一次加载页面 firstPage 时,它​​会使用默认构造函数加载,并且 url 看起来像所需的那样。一旦 firstPage 中的表单被提交,我将转发到有状态页面 secondPage,如下所示:

Page secondPage = new secondPage(arg1, arg2);
RequestCycle().setResponsePage(secondPage);

虽然挂载了第二个页面,但生成的页面 (secondPage) 使用以下 url 呈现:

context?21-1.IFormSubmitListener-componentName-childComponentName-childComponentName-someForm

我想要的是使用我定义的安装路径呈现的 secondPage。 我知道这是一个有状态的页面,为了让 wicket 加载它的确切实例,url 必须是有状态的。我不介意在 url 中有页面版本和 id,我只是不想在 url 中有这么长的丑陋组件路径。 另外,我不明白为什么我需要从 secondPage 的 url 中的 firstPage 到表单的路径。

据我了解,wicket 1.4 HybridUrlCodingStrategy 可以做类似的事情,但我在 wicket 1.5 中找不到任何方法。 这甚至可能与检票口有关吗?

任何帮助将不胜感激,因为这真的阻碍了我,而且我已经花了太多时间试图解决它但没有运气。

【问题讨论】:

    标签: java url wicket wicket-1.5


    【解决方案1】:

    尝试替换:

    Page secondPage = new secondPage(arg1, arg2);
    RequestCycle().setResponsePage(secondPage);
    

    与:

    RequestCycle().setResponsePage(secondPage.class);
    

    应该在我的头顶上工作......

    编辑: 刚刚注意到您正在传递参数,在这种情况下,您需要将 secondPage 更改为:

    class secondPage extends WebPage
    {
        public secondPage(PageParameters params) //Instead of secondPage(Type1 arg1, Type2 arg2)
        {
            arg1Type arg1 = params.get(0).to*{arg1Type}*();
            arg2Type arg2 = params.get(1).to*{arg2Type}*();
        }
    }
    

    然后调用:

    PageParameters params = new PageParameters();
    params.set(0, arg1);
    params.set(1, arg1);
    RequestCycle().setResponsePage(secondPage.class, params);
    

    【讨论】:

    • 你的建议的问题是 arg1 和 arg2 是复杂的 java 对象,而 PageParameters 只处理 StringValue,所以每当我尝试将我的 args 添加/获取到 PageParameters 时,我都会得到一个 ClassCastException。
    • 很公平,我发现了这个:apache-wicket.1842946.n4.nabble.com/… 它基本上建议传递一个可用于重构参数的唯一 ID。如果您无法将对象持久化到数据库并检索它,请尝试对其进行序列化...不理想,您也可以尝试以下操作:stackoverflow.com/questions/8602489/…
    • 首先,您可以同时拥有两个构造函数,一个带有 parmas 的构造函数调用第二个构造函数。
    • 您仍然需要一种将 Java 对象转换为原始类型的方法,以便您可以将其传递给第二个构造函数……我刚刚有了另一个想法,您可以存储对象在请求之间的会话中。尝试调整以下内容:cwiki.apache.org/WICKET/…。虽然不确定这是否是特别好的做法,但我很确定这适用于在整个会话中持续存在的对象,而不仅仅是在页面请求中......我认为不可能重构代码以便全部在一页上?
    • 谢谢大家。我可以将参数保存到会话/数据库中,但是,我想知道是否有一个更简单的内置检票口解决方案。再次感谢,一如既往地感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多