渲染Wicket组件

时间:2012-08-10 07:25:03

标签: html rendering wicket

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

2 个答案:

答案 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
}