繁体   English   中英

如何在 Wicket 1.5 中模仿 HybridUrlCodingStrategy?

[英]How do I mimic HybridUrlCodingStrategy in Wicket 1.5?

我们有一个现有的 Java Wicket 1.4 应用程序,它广泛使用 HybridUrlCodingStrategy:

mount(new HybridUrlCodingStrategy("/myurl", MyPage.class));

这导致我们的 URL 看起来像:

http://host/myurl/paramName1/paramValue1/paramName2/paramValue2

我想在 Wicket 1.5 中维护这个 URL 格式,但是 HybridUrlCodingStrategy 已被删除。 在 wicket 1.5 中,页面安装为:

mountPage("/myurl", MyPage.class);

这导致了传统的 URL,例如:

http://host/myurl?paramName1=paramValue2&paramName2=paramValue2

我已经读到我们应该使用 MountedMapper class,但是查看 Wicket 1.5 示例、API 文档和源代码,我仍然不清楚如何使用 MountedMapper 获得与使用 HybridUrlCodingStrategy 相同的行为。

有谁知道如何做到这一点?

也许是这样的:

mountPage("/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}", MyPage.class)

会工作? 当然,您必须手动指定参数,这可能需要更多工作。 MountedMapper class javadoc 解释了如何使用参数。

我能想到的另一个选择是(注意:这是未经测试的):

class MyPageParametersEncoder implements IPageParametersEncoder() {
    public PageParameters decodePageParameters(Request request)
    {
        PageParameters parameters = new PageParameters();

        int i = 0;
        for (Iterator<String> segment = request.getUrl().getSegements().iterator(); segment.hasNext()) {
            String key = segment.next();
            String value = segment.next();

            parameters.add(key, value);
        }

        return parameters.isEmpty() ? null : parameters;
    }

    public Url encodePageParameters(PageParameters pageParameters)
    {
        Url url = new Url();

        for (PageParemeters.NamedPair pair : pageParameters.getAllNamed() {
            url.getSegments().add(pair.getKey());
            url.getSegments().add(pair.getValue());
        }

        return url;
    }
}

mount(new MountedMapper("/myurl/", MyPage.class, new MyPageParametersEncoder());

无需自定义 IPageParametersEncoder。

使用 mountPage("/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}", MyPage.class) URL 看起来像在 1.4 中,但值可以通过 StringValue value1 = parameters.get("paramValue1" )。 value2 类似。

与 mountPage("/myurl/${paramValue1}/${paramValue2}", MyPage.class) 根据提取值相同,只是使用较短的 URL 。

它还支持可选参数 - #{optionalValue3}。

注意:Wicket 1.5.2 中添加了新的 class 以向后兼容 1.4 样式 URL 编码。 它被称为 UrlPathPageParametersEncoder - 如果您将 wicket 1.4 应用程序迁移到 1.5 并且您有以下样式的可收藏页面链接,请使用它:

www.mysite.com/name1/value1/name2/value2

从 1.4 迁移到 1.5 时,我们遇到了完全相同的问题。 任何已经存在一段时间的 1.4 应用程序都可能有一组从 web 上的外部站点指向它的链接。 确实希望您的应用程序的 Wicket 1.5 版本能够处理这些现有的混合链接而不会产生错误。

迁移到 1.5 时,如果没有与 1.4 兼容的 IPageParametersEncoder 实现,如果您想避免对读取参数的每个单独页面 class 进行更改,则需要在每次挂载中包含完整的参数规范。 下面的实现意味着不再需要。 只需按照上面的 livid 建议安装页面即可。

我将 this.java 文件作为补丁提交给 Wicket 开发人员 - 他们将来可能会将其包含在 Wicket 中,以便为其他 1.4 迁移器实现向后兼容的 URL 参数编码。

我采用了上面 luniv 的示例代码并进行了一些小改动以使其编译/工作。 以下应作为参数编码器在 1.5 中提供 1.4.x 样式参数编码。

    package org.apache.wicket.request.mapper.parameter;

    import java.lang.*;

    import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;

    import java.util.Iterator;

    import org.apache.wicket.request.Request;

    import org.apache.wicket.request.Url;

    import org.apache.wicket.request.mapper.parameter.PageParameters;

    public 
    class HybridPageParametersEncoder implements IPageParametersEncoder
    {
    /**
     * Encodes a URL in the form:
     * 
     * /mountpoint/paramName1/paramValue1/paramName2/paramValue2 
     * 
     * (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
     */
    public Url encodePageParameters(PageParameters pageParameters)
    {
        Url url = new Url();

        for (PageParameters.NamedPair pair : pageParameters.getAllNamed())
        {
            url.getSegments().add(pair.getKey());
            url.getSegments().add(pair.getValue());
        }

        return url;
    }

    /**
     * Decodes a URL in the form:
     * 
     * /mountpoint/paramName1/paramValue1/paramName2/paramValue2 
     * 
     * (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
     */
    public PageParameters decodePageParameters(Request request)
    {
        PageParameters parameters = new PageParameters();

        int i = 0;
        for (Iterator<String> segment = request.getUrl().getSegments().iterator(); segment.hasNext(); )
        {
            String key = segment.next();
            String value = segment.next();

            parameters.add(key, value);
        }

        return parameters.isEmpty() ? null : parameters;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM