Подтвердить что ты не робот

Удалить номер версии в URL-адресе

Как удалить или скрыть номер версии в URL, введенном в Wicket 1.5?

Установка страницы не помогает.

http://localhost/MyPage/SubPage?0
4b9b3361

Ответ 1

В приложении 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); 
      } 
  } 
}

Ответ 2

Если вам не нужен номер версии, тогда ваша страница должна быть полностью без гражданства, номер версии предназначен для страниц с сохранением состояния. Например, если ваша страница содержит форму, то вы должны использовать вариант без состояния для компонента Form, то есть org.apache.wicket.markup.html.form.StatelessForm. Если ваша страница уже полностью без гражданства, вы можете дать подсказку подсказки, вызвав метод org.apache.wicket.Page # setStatelessHint.

Ответ 3

Решение с использованием самоподготовленного класса MountedMapperWithoutPageComponentInfo не работает для Wicket 6.13+, страница не будет реагировать на действия пользователя обратного вызова. (Обратите внимание, что в Интернете существует несколько версий MountedMapperWithoutPageComponentInfo.)

Решение для 6.13+ (испытано с 6.15) можно найти здесь:

http://apache-wicket.1842946.n4.nabble.com/Delete-version-number-in-url-td4665752.html

https://svn.apache.org/repos/asf/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java

// 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));

Ответ 4

Используйте следующий экран для установки страниц, это должно работать на любой странице, обозначенной книгой, кроме главной страницы.

Здесь, как использовать 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
  }
}

Ответ 5

Для меня решение с setStatelessHint не работает. Было выполнено следующее:

class MyApplication extends WebApplication {
    @Override protected void init() {
        getRequestCycleSettings().setRenderStrategy(
            IRequestCycleSettings.RenderStrategy.ONE_PASS_RENDER); 
        ....
    }
}

Ответ 6

Обходные пути, предложенные до сих пор, могут работать с конкретными релизами и иметь побочные эффекты. Их следует считать хаками. Я использовал эти хаки, и они были разбиты новыми выпусками. Поэтому я создал запрос на поддержку общих фреймов здесь (просьба прокомментировать/проголосовать): setVersioned (false) должен принудительно выполнить одиночную версию страницы.

Еще один пример побочного эффекта: Page Reload on Отправить не-версию страницы