0

我有一个附加到页面的 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,情况会有所不同吗?不提供标记的组件。

4

2 回答 2

5

从 Wicket 6.7.0 可以轻松完成

ComponentRenderer.render(Component c)

从检票口页面:

将页面或组件呈现为字符串

用户列表中一直存在的问题之一是将页面或组件呈现为字符串的能力,以便您可以使用 Wicket 呈现 HTML 电子邮件消息。现在您可以使用 ComponentRenderer 来实际执行此操作,而无需求助于其他不太明显的方法。

ComponentRenderer 公开了两个方法:renderComponent 和renderPage,它们完全按照它们的名字所暗示的那样工作。快乐的电子邮件!

虽然是用于邮寄的,当然您也可以将其用于其他目的

于 2014-05-14T11:53:27.690 回答
0

根据 jordeu 的回答和 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
}
于 2012-08-10T09:18:16.170 回答