Приколи какой-нибудь XML для чего? Предположительно для обновления модели или вида, да?
Сила Wicket в том, что вам не нужно беспокоиться о визуализированном HTML. В терминах Model-View-Controller вы настраиваете Controller для правильного изменения модели, а Wicket заботится о представлении.
Разделение не полностью ясно: на самом деле вы можете показать / скрыть компоненты вида или затем изменить их, что можно рассматривать как изменение вида.
Но обычно вам не нужно напрямую управлять браузером или javascript. Wicket позаботится об этом, если вы позаботитесь о внесении изменений в код Java.
В Wicket Ajax вызовет метод вашего AjaxBehavior с целью AjaxRequestTarget.
В этом методе (или в вызываемых из него методах) вы делаете все, что вам нужно, обновляя модели или представления, а затем добавляете к цели любой компонент представления, который изменился. Wicket позаботится об обновлении браузера.
Вот пример. Он взят из некоторого кода, который я сделал, но сильно изменил только для того, чтобы сделать объяснение более понятным. Идея проста: «цепочечные» выпадающие варианты, где параметры в дочернем элементе изменяются при изменении параметра select в родительском элементе, как в серии [State] [County] [District].
(В реальном классе изменение модели передается дочернему элементу, который сам решает, изменился ли он, и добавляет себя к цели, если он есть, а затем передает целевой объект своему дочернему элементу. об этом, чтобы сделать более ясный пример.)
Вот ctor, который просто добавляет к себе анонимный подкласс AjaxBehavior:
public AjaxChildNotifyingDropDownChoice(...code elided for clarity...) {
this.child = child;
// Ajax won't work without this:
setOutputMarkupId(true);
//
add( new OnChangeAjaxBehavior() {
@Override
public void onUpdate(final AjaxRequestTarget target) {
// tell child to update its list
// based on newly selected value
// when the Ajax is called,
// my owning component's model
// is already updated
// note we could just type getModel()
// I'm making explicit that we're calling it
// on the enclosing class
// (which a non-static inner class has a hidden ref to)
child.setNewModelBasedOnSelectionOf(
AjaxChildNotifyingDropDownChoice.this.getModel());
// now add the child to the target
// Wicket javascript will receive the new
// options and re-render the child dropdown
target.add(child);
}
});
}
Мы могли бы также иметь скрытые или не скрытые компоненты, или добавить поведение, такое как стили CSS, или даже поменять одну панель на другую. Пока для каждого измененного компонента мы:
1) называется setOutputMarkupId (true); чтобы javascript мог его найти, и
2) добавил его в AjaxRequestTarget
Обратите внимание, что разные типы (подпункты) Ajax Behavior имеют разные функции обратного вызова, поэтому убедитесь, что вы переопределяете правильную (добавьте аннотацию @Override, чтобы компилятор мог пожаловаться, если вы неправильно указали имя).
Но, опять же, основная идея калитки заключается в том, что вместо отправки необработанных данных клиенту для анализа и обработки вы обновляете свою модель и представление и говорите Wicket повторно выполнить рендеринг того, что вы изменили, добавив chnaged. компоненты к цели.
Единственная причина, по которой я могу подумать о том, чтобы отправить прямой XML, - это передать его в не-Wicket javascript. Дайте мне знать, если это ваша цель, и я полностью упустил суть. ;)