jordeu's answer と Wicket wiki に基づいて、これを作成しました。コンポーネント コンポーネントの階層を変更する必要はありませんが、私の場合、パネルは既にページの一部になっています。
ただし、アプリケーションの設定を変更したり、Wicket API の非公開部分を使用したりすることについて少し心配しています。
public static StringResponse getRenderedResponse(final Component container) {
// store rendered markup to different place
final Response originalResponse = RequestCycle.get().getResponse();
StringResponse stringResponse = new StringResponse();
RequestCycle.get().setResponse(stringResponse);
// disable "component must be rendered only once per request" -check
boolean originalComponentCheck = container.getApplication().getDebugSettings().getComponentUseCheck();
container.getApplication().getDebugSettings().setComponentUseCheck(false);
try {
// prepareForRender() is not part of public Wicket API!!
container.prepareForRender();
container.render();
container.afterRender();
} finally {
// restore RequestCycle and checks
container.getApplication().getDebugSettings().setComponentUseCheck(originalComponentCheck);
RequestCycle.get().setResponse(originalResponse);
}
return stringResponse;
}
使用法:
new AjaxLink() {
public void onClick(AjaxRequestTarget target) {
StringResponse response = getRenderedResponse(myPanel);
String myPanelHtml = response.toString();
// do stuff with myPanelHtml
}