我有一个附在页面上的Wicket面板。我需要获取面板生成的呈现的HTML代码。我需要面板生成的相同HTML以输出发送到浏览器的内容。我不是整个页面的HTML。
我的面板是只读的,因此重新生成输出无关紧要。
private MyPanel myPanel;
public void onIntialize() {
super.onInitialize();
add(myPanel = new MyPanel());
}
new AjaxLink() {
public void onClick(AjaxRequestTarget target) {
String myPanelHtml = // obtain html somehow from myPanel
// do stuff with myPanelHtml
}
}
如果我需要从不是面板的组件渲染HTML,情况会有所不同吗?一个不提供标记的组件。
答案 0 :(得分:5)
从Wicket 6.7.0可以轻松完成
ComponentRenderer.render(Component c)
从wicket页面:
将页面或组件渲染为字符串
持续支持用户列表的一个问题是 能够将页面或组件呈现给String以便您可以使用 Wicket用于呈现HTML电子邮件。现在你可以使用了 ComponentRenderer实际上是这样做的,而不必诉诸其他 不太明显的方法。
ComponentRenderer公开了两个方法:renderComponent和renderPage 他们完全按照他们的名字提出的建议。发来电子邮件快乐!
虽然是用于邮寄,但您也可以将其用于其他目的,当然
答案 1 :(得分:0)
根据jordeu的回答和Wicket维基,我做了这个。它不需要修改组件组件层次结构,但在我的情况下,面板已经是页面的一部分。
但是我有点担心更改应用程序设置和使用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
}