Вместо этого используйте механизм событий Wicket 1.5 для обновления компонентов с использованием Ajax. Таким образом, вы будете отделять издателя и подписчика. См., Например, мою презентацию о новых функциях в Wicket 1.5, представленную на JavaZone'11 (пропустите примерно до 51 минуты разговора).
Взято из заметок о выпуске Wicket 1.5:
Межкомпонентные события
Wicket 1.5 предлагает простой, но гибкий способ взаимодействия компонентов друг с другом в несвязной манере. Два основных интерфейса, которые облегчают это:
/**
* Objects that can send events
*/
public interface IEventSource {
<T> void send(IEventSink sink, Broadcast broadcast, T payload);
}
и
/**
* Objects that can receive events
*/
public interface IEventSink
{
/**
* Called when an event is sent to this sink
*/
void onEvent(IEvent<?> event);
}
Классы, которые реализуют эти интерфейсы и могут, таким образом, участвовать в механизме событий: Component
, RequestCycle
, Session
и Application
.
Механизм допускает различные методы трансляции событий, определенные здесь:
/**
* Defines the event broadcast type.
*/
public enum Broadcast {
BREADTH,
DEPTH,
BUBBLE,
EXACT;
}
В wicket-examples есть пример , который демонстрирует использование этого.
Приложения могут регистрировать пользовательские диспетчеры событий в FrameworkSettings; диспетчеры могут быть использованы для создания пользовательских механизмов доставки событий. Например, пользовательский механизм IEventDispatcher может направлять события в аннотированные методы, например:
public class MyComponent extends Component {
@OnEvent
private void onUserAdded(UserAddedEvent event) {...}
}
, где UserAddedEvent
- объект полезной нагрузки события.
Будет вызываться метод по умолчанию Component#onEvent
, даже если пользовательские диспетчеры зарегистрированы.
Событие по умолчанию вызывается всякий раз, когда Wicket начинает создавать ответ AJAX. Полезная нагрузка события - AjaxRequestTarget, используемая для события. Пример реализации:
// component that always adds itself to the ajax response
public class MyComponent extends Component {
public void onEvent(IEvent event) {
if (event.getPayload() instanceof AjaxRequestTarget) {
((AjaxRequestTarget)event.getPayload()).add(this);
}
}
}