【问题标题】:How do I mimic HybridUrlCodingStrategy in Wicket 1.5?如何在 Wicket 1.5 中模仿 HybridUrlCodingStrategy?
【发布时间】:2011-05-27 15:28:13
【问题描述】:

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

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 类,但是查看 Wicket 1.5 示例、API 文档和源代码,我仍然不清楚如何使用 MountedMapper 获得与我们获得相同的行为HybridUrlCodingStrategy。

有人知道怎么做吗?

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    可能是这样的:

    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 才能将请求参数构建为 url 的片段。如果您不使用自定义参数编码器,那么您必须事先了解所有可能的参数并将它们构建到 URL 中。
    【解决方案2】:

    无需自定义 IPageParametersEncoder。

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

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

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

    【讨论】:

    • 自定义编码器是避免为每个页面手动构建整个 URL 的想法。但除此之外,你所说的:)
    • 如果没有自定义编码器,您必须手动将页面挂载到所有可能的参数排列以及处理之前生成的 URL。
    • @biziclop - 没错。幸运的是,不再需要自定义编码器,因为 Wicket 1.5.2 中添加了一个名为 UrlPathPageParametersEncoder 的编码器。这基本上完成了上面客户编码器所做的工作,但有一些修复以处理一些特殊情况。
    • @Volksman 这是个好消息,谢谢。是时候将我的一些宠物项目转换为 1.5 以进行练习了。
    • UrlPathPageParametersEncoder 不能完全替代 HybridUrlCodingStrategy。例如,在带有 HybridUrlCodingStrategy 的 Wicket 1.4 中,url host/endpoint?param1=value1host/endpoint/param1/value1 的同义词。使用传统 URL 查询参数的 URL 无法使用 UrlPathPageParametersEncoder 正确解析。
    【解决方案3】:

    注意:为了向后兼容 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 应用程序都可能有一组从网络上的外部站点指向它的链接。您真的希望您的应用程序的 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;
        }
    }
    

    【讨论】:

    • 我在上面添加了这个作为评论,但它可能更适合放在此处:UrlPathPageParametersEncoder 不是 HybridUrlCodingStrategy 的完全替代品。例如,在带有 HybridUrlCodingStrategy 的 Wicket 1.4 中,url host/endpoint?param1=value1 与 host/endpoint/param1/value1 同义。使用传统 URL 查询参数的 URL 无法使用 UrlPathPageParametersEncoder 正确解析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多