#java #wicket #wicket-1.5
#java #wicket #wicket-1.5
Вопрос:
В первый раз я перехожу к своему приложению по следующему URL:
…/домашняя страница/?0amp;user=x
В режиме отладки я вижу, что wicket прекрасно создает экземпляры моих панелей и тому подобное (очевидно).
если я изменю URL на:
…/домашняя страница/?0amp;user=y
затем ничего не происходит, панели не инициализируются повторно (для нового пользователя => по-прежнему отображаются данные пользователя x) и не вызываются LoadableDetachable -или другие модели.
Однако, если я изменю URL на:
…/домашняя страница/?1amp;user=y
затем все панели хорошо инициализируются для пользователя y
Еще один шаг, если вы измените URL обратно на
…/homepage/?0amp;user=y
затем снова отображаются данные для пользователя x.
Похоже, что Wicket не волнует, что аргументы изменились в URL, чтобы решить, следует ли перезагружать компоненты. AFAIK, это нормально работало в Wicket 1.4. Я думаю, что понимаю логику такого поведения, но не уверен. Кроме того, я хотел бы знать, как принудительно перезагрузить Wicket при изменении пользовательских параметров и как удалить это «уродливое» значение?0 из URL (если возможно)?
Комментарии:
1. Я могу воспроизвести это поведение в своем собственном приложении. RequestLogger выводит новый запрос со старым идентификатором страницы, но с измененным параметром страницы. Я предполагаю, что такое поведение предназначено, поскольку вы все еще запрашиваете тот же старый pageID. Однако я также заинтересован в удалении уродливого pageID из URL…
2. Попробовал развернуть мое приложение как «deployment»-build, все еще получил идентификаторы страниц. Думал, что это будет только для разработки.
3. @Rotsch спасибо, что попробовали; я сам об этом еще не подумал.
4. Только что заметил кое-что в AbstractBookmarkableMapper.MapRequest: если есть pageId (?0), то он вызовет processHybrid, упоминает javadoc: «если в URL есть информация об экземпляре страницы, нам нужно попытаться повторно использовать существующий экземпляр страницы.
Ответ №1:
Такова природа Wicket с сохранением состояния. Экземпляр страницы создается один раз, параметры анализируются и так далее. Позже вы передаете другие параметры уже созданной странице, но на этот раз ее конструктор вообще не вызывается и, следовательно, параметры страницы не обновляются. Изменение на ?1 запрашивает у Wicket страницу с идентификатором 1, и поскольку такой Wicket нет, создает экземпляр нового экземпляра и передает новые параметры. Если вы хотите всегда иметь последние параметры запроса, тогда используйте GetRequest().getRequestParameter(«пользователь»), который даст вам то, что вам нужно. Имеет смысл?
Комментарии:
1. Имеет смысл, но где я должен вызвать GetRequest().getRequestParameter(«пользователь»), если Wicket вообще не вызывает мой конструктор?
2. Мне также не нравятся новые идентификаторы страниц в закладках, для конечного пользователя поведение wicket 1.4 было более логичным.
3. @TheStijn: onConfigure()/onBeforeRender().
4. @bert: это как с HybridUrlCodingStrategy в 1.4
5. @Martin-g; tx, я попробую это.
Ответ №2:
Чтобы изменить ответ martin-g: вы должны получить параметр запроса в вашей модели и получить правильного пользователя с параметром запроса. Что-то вроде:
setModel(new LoadableDetachableModel<User>(){
public User load() {
String username = getRequest().getRequestParameter("user");
return userservice.byUsername(username);
}
}));
Когда вам нужны динамические данные, почти всегда используйте модели для решения вашей проблемы.
Ответ №3:
Я думаю, вы можете использовать onRender
или onConfigure