如何在Wicket 1.5中模仿HybridUrlCodingStrategy?

问题描述

| 我们有一个现有的Java Wicket 1.4应用程序,该应用程序广泛使用HybridUrlCodingStrategy:
mount(new HybridUrlCodingStrategy(\"/myurl\",MyPage.class));
这导致我们的URL看起来像:
http://host/myurl/paramName1/paramValue1/paramName2/paramValue2
我想在Wicket 1.5中维护此URL格式,但是HybridUrlCodingStrategy已被删除。在小门1.5中,页面安装为:
mountPage(\"/myurl\",MyPage.class);
产生传统网址,例如:
http://host/myurl?paramName1=paramValue2&paramName2=paramValue2
我已经读到我们应该使用MountedMapper类,但是看看Wicket 1.5示例,api文档和源代码,我仍然不清楚如何通过MountedMapper获得与HybridUrlCodingStrategy相同的行为。 有谁知道如何做到这一点?     

解决方法

        也许是这样的:
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());
    ,        无需自定义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}。     ,        注意:为了向后兼容1.4样式URL编码,向Wicket 1.5.2添加了一个新类。它称为UrlPathPageParametersEncoder-如果要将wicket 1.4应用程序迁移到1.5,并且具有以下样式的可收藏页面链接,请使用该名称: www.mysite.com/name1/value1/name2/value2 从1.4迁移到1.5时,我们遇到了完全相同的问题。任何运行了1.4年的1.4应用程序都可能会从网络上的外部站点收集指向该应用程序的链接。您确实希望应用程序的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;
    }
}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...