如何在Wicket 1.5中模仿HybridUrlCodingStrategy?

时间:2011-05-27 15:28:13

标签: java wicket

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

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

这导致我们的网址如下:

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

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

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

这导致传统的网址如:

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

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

有谁知道怎么做?

3 个答案:

答案 0 :(得分:2)

也许是这样的:

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

会奏效吗?当然,您必须手动指定参数,这可能需要更多工作。 MountedMapper类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());

答案 1 :(得分:2)

无需自定义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}。

答案 2 :(得分:1)

注意:Wicket 1.5.2中添加了一个新类,以便向后兼容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实现时,如果要避免对读取参数的每个单独的Page类进行更改,则需要在每个安装中包含完整的参数规范。下面的实现意味着不再需要。只需按照上面的livid建议安装页面。

我将此.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;
    }
}