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

#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