Java 如何模仿Wicket 1.5中的杂交编码策略?

Java 如何模仿Wicket 1.5中的杂交编码策略?,java,wicket,Java,Wicket,我们现有的Java Wicket 1.4应用程序广泛使用HybridUrlCodings策略: mount(new HybridUrlCodingStrategy("/myurl", MyPage.class)); 这导致我们的URL看起来像: http://host/myurl/paramName1/paramValue1/paramName2/paramValue2 我希望在Wicket 1.5中保持此URL格式,但是HybridUrlCodings策略已被删除。在wicket 1.5中

我们现有的Java Wicket 1.4应用程序广泛使用HybridUrlCodings策略:

mount(new HybridUrlCodingStrategy("/myurl", MyPage.class));
这导致我们的URL看起来像:

http://host/myurl/paramName1/paramValue1/paramName2/paramValue2
我希望在Wicket 1.5中保持此URL格式,但是HybridUrlCodings策略已被删除。在wicket 1.5中,页面的安装方式如下:

mountPage("/myurl", MyPage.class);
这会产生传统的URL,如:

http://host/myurl?paramName1=paramValue2&paramName2=paramValue2
我已经读到我们应该使用MountedMapper类,但是看看Wicket 1.5示例、API文档和源代码,我仍然不清楚如何使用MountedMapper获得与HybridUrlCodingStrategy相同的行为


有人知道怎么做吗?

可能是这样的:

mountPage("/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}", MyPage.class)
行吗?当然,您必须手动指定参数,这可能需要更多的工作。 类javadoc解释了如何使用参数

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

类MyPageParametersEncoder实现IPageParametersEncoder(){ 公共页面参数decodePageParameters(请求) { PageParameters=新的PageParameters(); int i=0; for(迭代器段=request.getUrl().getSegments().Iterator();段.hasNext()){ 字符串键=段。下一步(); 字符串值=段。下一步(); 参数。添加(键、值); } 返回参数。isEmpty()?null:参数; } 公共Url encodePageParameters(PageParameters PageParameters) { Url=新Url(); 对于(PageParemeters.NamedPair对:pageParameters.getAllNamed(){ url.getSegments().add(pair.getKey()); url.getSegments().add(pair.getValue()); } 返回url; } } mount(新mountedapper(“/myurl/”,MyPage.class,新MyPageParametersEncoder());
无需定制IPageParametersEncoder

使用mountPage(“/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}”,MyPage.class)时,URL将与1.4中的URL类似,但可以通过StringValue value1=parameters.get(“paramValue1”)访问这些值。与value2类似

对于mountPage(“/myurl/${paramValue1}/${paramValue2}”,MyPage.class)根据提取的值是相同的,只会使用更短的URL


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

注意: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实现,您需要在每次装载中包含完整的参数规范,以避免对读取参数的每个页面类进行更改。下面的实现意味着不再需要这样做。只需按照livid的建议装载页面即可e

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

我在上面使用了luniv的示例代码,并对其进行了一些小的更改以使其能够编译/工作

    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;
    }
}
package org.apache.wicket.request.mapper.parameter;
导入java.lang.*;
导入org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
导入java.util.Iterator;
导入org.apache.wicket.request.request;
导入org.apache.wicket.request.Url;
导入org.apache.wicket.request.mapper.parameter.PageParameters;
公开的
类HybridPageParametersEncoder实现IPageParametersEncoder
{
/**
*将URL编码为以下格式:
* 
*/mountpoint/paramName1/paramValue1/paramName2/paramValue2
* 
*(即使用pre-wicket 1.5混合URL策略的URL)
*/
公共Url encodePageParameters(PageParameters PageParameters)
{
Url=新Url();
对于(PageParameters.NamedPair对:PageParameters.GetAllName())
{
url.getSegments().add(pair.getKey());
url.getSegments().add(pair.getValue());
}
返回url;
}
/**
*解码以下格式的URL:
* 
*/mountpoint/paramName1/paramValue1/paramName2/paramValue2
* 
*(即使用pre-wicket 1.5混合URL策略的URL)
*/
公共页面参数decodePageParameters(请求)
{
PageParameters=新的PageParameters();
int i=0;
for(迭代器段=request.getUrl().getSegments().Iterator();段。hasNext();)
{
字符串键=段。下一步();
字符串值=段。下一步();
参数。添加(键、值);
}
返回参数。isEmpty()?null:参数;
}
}

自定义编码器是一个避免为每个页面手动构建整个URL的想法。但除此之外,您所说的:)如果没有自定义编码器,您必须手动将页面装载到所有可能的参数排列中,并处理先前生成的URL。@biziclop-没错。幸运的是,Wicket 1.5.2中添加了一个名为UrlPathPageParametersEncoder的自定义编码器,因此不再需要自定义编码器。这基本上实现了客户编码器的功能上面有,但有一些修正来处理一些特殊情况。@Volksman Th
    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;
    }
}