Как имитировать HybridUrlCodingStrategy в Wicket 1.5? - PullRequest
11 голосов
/ 27 мая 2011

У нас есть приложение Java Wicket 1.4, которое широко использует HybridUrlCodingStrategy:

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

В результате наш URL выглядит следующим образом:

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

Я бы хотел сохранить этот формат URL в Wicket 1.5, однако HybridUrlCodingStrategy был удален. В калитке 1.5 страницы смонтированы как:

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

Что приводит к традиционным URL-адресам, таким как:

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

Я прочитал, что мы должны использовать класс MountingMapper, но, глядя на примеры Wicket 1.5, документы API и исходный код, мне все еще не ясно, как получить то же поведение с MountingMapper, что и с HybridUrlCodingStrategy.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Нет необходимости в настраиваемом 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.

Также поддерживаются необязательные параметры - # {optionValue3}.

2 голосов
/ 27 мая 2011

Может быть, что-то вроде этого:

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

будет работать? Конечно, вам придется вручную указать свои параметры, что может потребовать гораздо больше усилий. Класс javadoc MountingMapper объясняет, как использовать параметры.

Другой вариант, о котором я могу подумать, будет ( Примечание : это не проверено):

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 голос
/ 23 сентября 2011

ПРИМЕЧАНИЕ: новый класс был добавлен в Wicket 1.5.2 для обратной совместимости с кодировкой URL в стиле 1.4.Он называется UrlPathPageParametersEncoder - используйте его, если вы переносите приложение wicket 1.4 на 1.5 и у вас есть закладки на странице в стиле:

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

У нас возникла та же проблема при переходе с 1.4 на 1.5.Любое приложение 1.4, которое работало некоторое время, вероятно, будет иметь набор ссылок, указывающих на него с внешних сайтов в сети.Вы действительно хотите, чтобы версия вашего приложения Wicket 1.5 могла обрабатывать эти существующие гибридные ссылки без генерации ошибки.

При переходе на 1.5, без реализации IPageParametersEncoder, совместимой с 1.4, вам нужновключить полную спецификацию параметров в каждое монтирование, если вы хотите избежать внесения изменений в каждый отдельный класс Page, который читает параметры.Реализация ниже означает, что больше не нужно.Просто смонтируйте страницу, как предложено выше.

Я отправляю этот файл .java в качестве патча для разработчиков Wicket - они могут включить его в Wicket в будущем, чтобы упростить реализацию обратно совместимого параметра URL.кодирование для других 1.4-миграторов.

Я взял приведенный выше пример кода luniv и внес несколько небольших изменений для его компиляции / работы.Следующее должно работать как кодировщик параметров для обеспечения кодирования параметров стиля 1.4.x в 1.5.

    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;
    }
}
...