Несколько путей для одного класса в Apache Wicket

У меня есть приложение Wicket, в WebApplication я делаю:

public class AppStart extends WebApplication{

    public AppStart(){
    }

    @Override
    protected void init(){
        super.init();
        mountPage("/index.html", StandardPage.class);
        mountPage("/another.html", StandardPage.class);
    }
}

но когда я обращаюсь к /index.html, меня перенаправляют на страницу /another.html. Вы думали, что в момент создания страницы StandardPage.class будет создан экземпляр, поэтому эти две страницы будут обрабатываться двумя отдельными объектами StandardPage.class?


person 1ac0    schedule 25.12.2013    source источник


Ответы (1)


Да, это правда. У Wicket есть собственный сложный механизм обработки URL-адресов и способов перенаправления браузера на конкретную цель. В Wicket использование двух и более разных путей для монтирования одного и того же класса страниц не имеет понятия (по умолчанию).

РЕШЕНИЕ 1

Если вы действительно хотите получить одинаковую функциональность для разных URL-адресов, используйте простой потомок

public class StandardPage2 extends StandardPage {
    //... define the same constructors from StandardPage
}

Ваш код

@Override
protected void init(){
    super.init();
    mountPage("/index.html", StandardPage.class);
    mountPage("/another.html", StandardPage2.class);
}

Не забывайте правильно использовать

setResposonsePage(StandardPage.class); 

or

setResposonsePage(StandardPage2.class);

РЕШЕНИЕ 2

В следующем примере показано, как можно использовать параметр страницы как часть URL-адреса. Допустим, в базе данных есть пользователи, и у каждого пользователя есть собственная страница, доступная по уникальному URL-адресу. Также каждый пользователь может выполнять некоторые необязательные операции, и имя операции всегда включается в URL-адрес, и есть некоторые другие страницы, подключенные к их собственным URI. Таким образом, URI должны выглядеть

/home 
/login 
/logout 
/martin 
/martin/edit 
/martin/detail 
/petr
/petr/edit 
/petr/detail
/
/texts/my-super-article-1
/texts/my-super-article-2
/events/actual
/fotos/from-my-first-holiday
/fotos/from-my-second-holiday

В этом случае можно использовать MontedMapper по умолчанию, который когда-либо был реализован в Wicket. Отображение

mountPage("/home", HomePage.class);
mountPage("/login", LoginPage.class);
mountPage("/logout", LogoutPage.class);
mountPage("/${nick}/${action}", UserProfilePage.class);
mountPage("/texts/${page}", TextPages.class);
mountPage("/events/${page}", EventPages.class);
mountPage("/fotos/${page}", FotoPages.class);

и вам нужно реализовать UserProfilePage и его конструктор с PageParameters

public class UserProfilePage extends WebPage {

     public UserProfilePage(PageParameters pageParameters) {
         super(pageParameters);
         StringValue nick = pageParameters.get("nick");
         StringValue action = pageParameters.get("action");
         // any code
         String nickName = nick.toString();
         boolean defaultAction = action.isEmpty(); // default action
     }

}

РЕШЕНИЕ 3

Также вы можете переопределить IRequestMapper и некоторые другие классы, но я думаю, что это слишком сложно и не нужно в вашем случае.

person Martin Strejc    schedule 25.12.2013
comment
Мартин, спасибо. Моя ситуация довольно специфична: я не знаю, сколько точек монтирования будет обрабатываться одним и тем же классом страницы. Мой код читает базу данных и монтирует данные разных записей (конкретная точка монтирования записи) в один и тот же класс страниц. Еще одно решение, которое я сейчас изучаю, - это Javassist - создание класса страницы как подкласса StandardPage на лету и монтирование их по определенному пути. На данный момент не знаю, возможно ли это. - person 1ac0; 26.12.2013
comment
@LadislavDANKO это особый случай. Объяснение немного однобокое, но см. wicket-library.com /wicket-examples-6.0.x/mappers/en_US Пользовательский преобразователь, вероятно, является лучшим решением, чем JavaSsist для создания кода на лету. - person Martin Strejc; 26.12.2013