Как удалить или скрыть номер версии в URL, введенном в Wicket 1.5?
Установка страницы не помогает.
http://localhost/MyPage/SubPage?0
Как удалить или скрыть номер версии в URL, введенном в Wicket 1.5?
Установка страницы не помогает.
http://localhost/MyPage/SubPage?0
В приложении Application.init():
mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class));
со следующим классом Mapper:
public class MountedMapperWithoutPageComponentInfo extends MountedMapper {
public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) {
super(mountPath, pageClass, new PageParametersEncoder());
}
@Override
protected void encodePageComponentInfo(Url url, PageComponentInfo info) {
// do nothing so that component info does not get rendered in url
}
@Override
public Url mapHandler(IRequestHandler requestHandler)
{
if (requestHandler instanceof ListenerInterfaceRequestHandler ||
requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) {
return null;
} else {
return super.mapHandler(requestHandler);
}
}
}
Если вам не нужен номер версии, тогда ваша страница должна быть полностью без гражданства, номер версии предназначен для страниц с сохранением состояния. Например, если ваша страница содержит форму, то вы должны использовать вариант без состояния для компонента Form, то есть org.apache.wicket.markup.html.form.StatelessForm. Если ваша страница уже полностью без гражданства, вы можете дать подсказку подсказки, вызвав метод org.apache.wicket.Page # setStatelessHint.
Решение с использованием самоподготовленного класса MountedMapperWithoutPageComponentInfo не работает для Wicket 6.13+, страница не будет реагировать на действия пользователя обратного вызова. (Обратите внимание, что в Интернете существует несколько версий MountedMapperWithoutPageComponentInfo.)
Решение для 6.13+ (испытано с 6.15) можно найти здесь:
http://apache-wicket.1842946.n4.nabble.com/Delete-version-number-in-url-td4665752.html
// Put this code in your WebApplication subclass
import org.apache.wicket.core.request.mapper.MountedMapper;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
import org.apache.wicket.request.mapper.info.PageComponentInfo;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.core.request.handler.BookmarkableListenerInterfaceRequestHandler;
private static class NoVersionMapper extends MountedMapper {
public NoVersionMapper(final Class<? extends IRequestablePage> pageClass) {
this("/", pageClass);
}
public NoVersionMapper(String mountPath, final Class<? extends IRequestablePage> pageClass) {
super(mountPath, pageClass, new PageParametersEncoder());
}
@Override
protected void encodePageComponentInfo(Url url, PageComponentInfo info) {
//Does nothing
}
@Override
public Url mapHandler(IRequestHandler requestHandler) {
if (requestHandler instanceof ListenerInterfaceRequestHandler || requestHandler instanceof BookmarkableListenerInterfaceRequestHandler) {
return null;
} else {
return super.mapHandler(requestHandler);
}
}
}
Затем вы можете монтировать страницы, используя:
// Put this in the init() method of your WebApplication subclass
getRootRequestMapperAsCompound().add(new NoVersionMapper("urlPatternOfAPage", YourPage.class));
Используйте следующий экран для установки страниц, это должно работать на любой странице, обозначенной книгой, кроме главной страницы.
Здесь, как использовать mapper в Application.init()
mount(new MountedMapperWithoutPageComponentInfo("/subpage", MyPage.class));
Здесь отобразитель.
import org.apache.wicket.request.Url;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.mapper.MountedMapper;
import org.apache.wicket.request.mapper.info.PageComponentInfo;
import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
public class MountedMapperWithoutPageComponentInfo extends MountedMapper {
public MountedMapperWithoutPageComponentInfo(String mountPath, Class<? extends IRequestablePage> pageClass) {
super(mountPath, pageClass, new PageParametersEncoder());
}
@Override
protected void encodePageComponentInfo(Url url, PageComponentInfo info) {
// does nothing so that component info does not get rendered in url
}
}
Для меня решение с setStatelessHint
не работает. Было выполнено следующее:
class MyApplication extends WebApplication {
@Override protected void init() {
getRequestCycleSettings().setRenderStrategy(
IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER);
....
}
}
Обходные пути, предложенные до сих пор, могут работать с конкретными релизами и иметь побочные эффекты. Их следует считать хаками. Я использовал эти хаки, и они были разбиты новыми выпусками. Поэтому я создал запрос на поддержку общих фреймов здесь (просьба прокомментировать/проголосовать): setVersioned (false) должен принудительно выполнить одиночную версию страницы.
Еще один пример побочного эффекта: Page Reload on Отправить не-версию страницы