DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
Here is a way to render panel markup to string.
It is a bit of a tweak, I admit, but what can you do.
- Assume you have components on your page, ready to be rendered.
- In onBeforeRender, quickly switch one of your existing components to another that you want to render into a string
- Let your special component render into a string.
- Restore back to the original component that was supposed to be rendered onto the web page.
- It seems to work ok at least if your component is a panel.
Example code:
somewhere in your page hierarchy that is actually rendered
/**
* @see org.apache.wicket.Page#onBeforeRender()
*/
@Override
protected void onBeforeRender() {
System.out.println("\n-----------------------------------------\n"
+ MarkupUtils.renderToString(loginForm, new IntroductionPanel(loginForm.getId())));
super.onBeforeRender();
}
MarkupUtils.public static String renderToString(final Component parentDonorComponent, final Component component) {
if (!component.getId().equals(parentDonorComponent.getId())) {
throw new IllegalStateException("Component will try to substitute parentDonorComponent to render. Donor and string render Component id's must be equal.");
}
final Response originalResponse = RequestCycle.get().getResponse();
StringResponse stringResponse = new StringResponse();
RequestCycle.get().setResponse(stringResponse);
MarkupContainer parentComponent = parentDonorComponent.getParent();
parentComponent.remove(parentDonorComponent);
try {
parentComponent.add(component);
try {
component.prepareForRender();
component.renderComponent();
} catch (RuntimeException e) {
component.afterRender();
throw e;
}
} finally {
// Restore original component
parentComponent.replace(parentDonorComponent);
// Restore original response
RequestCycle.get().setResponse(originalResponse);
}
return stringResponse.toString();
}