2012-08-10 141 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 
}