Как я имитирую HybridUrlCodingStrategy в Wicket 1.5?
У нас есть существующее приложение 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¶mName2=paramValue2
Я читал, что мы должны использовать класс MountedMapper, но, глядя на примеры Wicket 1.5, документы API и исходный код, мне все еще не ясно, как получить такое же поведение с MountedMapper, как мы получаем с HybridUrlCodingStrategy.
Кто-нибудь знает, как это сделать?
Ответы
Ответ 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());
Ответ 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}.
Ответ 3
ПРИМЕЧАНИЕ. Новый класс был добавлен в Wicket 1.5.2 для обратной совместимости с кодировкой URL в стиле 1.4. Он называется UrlPathPageParametersEncoder - используйте это, если вы переносите приложение калитки 1.4 на 1.5 и у вас есть закладки для ссылок страницы стиля:
www.mysite.com/name1/value1/name2/value2
У нас была такая же проблема при переходе с 1.4 на 1.5. Любое приложение 1.4, которое было вживую какое-то время, скорее всего, будет иметь набор ссылок, указывающих на него с внешних сайтов в Интернете. Вы действительно хотите, чтобы версия вашего приложения Wicket 1.5 могла обрабатывать эти существующие гибридные ссылки без возникновения ошибки.
При переходе на 1.5 без реализации совместимого с IP-совместимым реализацией IPageParametersEncoder вам нужно включить полную спецификацию параметров в каждый монтирующий файл, если вы хотите избежать внесения изменений в каждый отдельный класс страницы, который считывает параметры. Ниже приведена реализация, которая больше не нужна. Просто установите страницу, как показано выше.
Я представляю этот .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;
}
}