Компоненты не перезагружаются при изменении URL-адреса в Wicket 1.5 (.2)?

Я перехожу к своему приложению в первый раз со следующим URL-адресом:

.../homepage/?0&user=x

В режиме отладки я вижу, что калитка прекрасно создает мои панели и тому подобное (очевидно).

если я изменю URL на:

.../homepage/?0&user=y

затем ничего не происходит, панели не инициализируются повторно (для нового пользователя => данные пользователя x все еще отображаются) и не вызываются LoadableDetachable или другие модели.

Однако, если я изменю URL-адрес на:

.../домашняя страница/?1&user=y

затем все панели правильно инициализируются для пользователя y

Еще один шаг, если вы измените URL обратно на

.../homepage/?0&user=y

затем снова отображаются данные для пользователя x.

Кажется, Wicket не волнует, что аргументы изменились в URL-адресе, чтобы решить, перезагружать компоненты или нет. Насколько я знаю, это отлично работало в Wicket 1.4. Я думаю, что понимаю логику такого поведения, но не уверен. Кроме того, я хотел бы знать, как заставить Wicket перезагружаться при изменении пользовательских параметров и как удалить этот «уродливый» ?0 из URL-адреса (если возможно)?


person Stijn Geukens    schedule 10.11.2011    source источник
comment
Я могу воспроизвести это поведение с помощью своего собственного приложения. RequestLogger распечатывает новый запрос со старым идентификатором страницы, но с измененным параметром страницы. Я предполагаю, что это поведение предназначено, поскольку вы все еще запрашиваете тот же старый идентификатор страницы. Однако я также заинтересован в удалении уродливого идентификатора страницы из URL-адреса...   -  person rotsch    schedule 10.11.2011
comment
Пытался развернуть мое приложение как сборку развертывания, все еще получил идентификаторы страниц. Думал, что это будет только для развития.   -  person rotsch    schedule 10.11.2011
comment
@Rotsch спасибо за попытку; Я сам об этом еще не думал.   -  person Stijn Geukens    schedule 10.11.2011
comment
Только что заметил кое-что в AbstractBookmarkableMapper.mapRequest: если есть pageId (?0), то он вызовет processHybrid, в javadoc упоминается: «если в URL-адресе есть информация об экземпляре страницы, нам нужно попытаться повторно использовать существующий экземпляр страницы.   -  person Stijn Geukens    schedule 10.11.2011


Ответы (3)


Это свойство Wicket с сохранением состояния. Страница создается один раз, параметры анализируются и так далее. Позже вы передаете различные параметры уже созданной странице, но на этот раз ее конструктор вообще не вызывается, и, следовательно, параметры страницы не обновляются. Изменение на ?1 запрашивает у Wicket страницу с идентификатором 1, и, поскольку такой Wicket не существует, создает новый экземпляр и передает новые параметры. Если вы хотите всегда иметь самые последние параметры запроса, используйте getRequest().getRequestParameter("user"), который даст вам то, что вам нужно. Имеет смысл ?

person martin-g    schedule 10.11.2011
comment
Имеет смысл, но где я должен вызывать getRequest().getRequestParameter(user), если Wicket вообще не вызывает мой конструктор? - person Stijn Geukens; 10.11.2011
comment
Мне также не нравятся новые идентификаторы страниц на страницах с закладками, для конечного пользователя поведение калитки 1.4 было более логичным. - person bert; 11.11.2011
comment
@TheStijn: onConfigure()/onBeforeRender(). - person martin-g; 13.11.2011
comment
@bert: это как с HybridUrlCodingStrategy в 1.4 - person martin-g; 13.11.2011
comment
@Мартин-г; tx, попробую. - person Stijn Geukens; 13.11.2011

Чтобы изменить ответ marting-g: вы должны получить параметр запроса в своей модели и получить правильного пользователя с параметром запроса. Что-то типа:

setModel(new LoadableDetachableModel<User>(){
    public User load() {
        String username = getRequest().getRequestParameter("user");
        return userservice.byUsername(username);
    }
}));

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

person Martijn Dashorst    schedule 13.11.2011

Я думаю, вы можете использовать onRender или onConfigure

person Rudi Wijaya    schedule 28.03.2013