2012-08-10 97 views
0

我有一个连接到页面的Wicket面板。我需要获取面板生成的呈现HTML代码。我需要与面板生成的相同的HTML以输出发送给浏览器的HTML。我不是整个页面的HTML。渲染一个Wicket组件

我的面板是只读的,因此输出是否重新生成并不重要。

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,情况会不同吗?不提供标记的组件。

回答

5

从检票6.7.0它可以很容易地

ComponentRenderer.render(Component c)

被acomplished从边门页:

渲染页面或组件转换为字符串

一个是不断在用户列表推高的问题是一个页面或组件呈现为一个字符串,这样就可以使用 检票呈现HTML电子邮件的 能力。现在,您可以使用 ComponentRenderer实际执行此操作,而无需诉诸其他不太明显的方法 。

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

虽然适用于邮件,你可以将它用于其他目的,当然

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 
}