2012-01-04 41 views
0

我真的很喜歡GWT中可以在常規html頁面中定義「div」,「span」等的方法,然後在GWT入口點只需按下按鈕或div內的其他組件。gwt;將html頁面與java代碼混合

所以小例子,這裏是一個GWT HTML頁面的一個片段:

<body class='page'> 
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position: absolute; width: 0; height: 0; border: 0"></iframe> 

    <div> 
     Query Terms: <span id="txtQuery"></span>&nbsp; 
     <span id="btnQuery"></span><br> 
     ... 
    </div> 
</body> 

這裏是包含在GWT入口點一個小的Java代碼片斷:

ClickHandler clickHandler = ... 
TextBox txtQuery = new TextBox(); 
Button btnQuery = new Button("Query", clickHandler); 

RootPanel.get("txtQuery").add(txtQuery); 
RootPanel.get("btnQuery").add(btnQuery); 

的原因之一我喜歡這種方法,它允許非java編碼器設計/編寫html的東西,我也喜歡GWT/java代碼和html代碼之間的分離。

但是...這對於一個簡單的網頁可能效果不錯,但是如何將這種方法擴展到許多網頁?據我所知,做事的「GWT方式」是有一個網頁和使用歷史來隱藏和顯示各種GWT組件。我已經使用這種標準技術在GWT中構建了2個項目,但最近發現您可以執行上面顯示的事情。

有沒有什麼方法可以將上述2個片段擴展爲多個html頁面,其中GWT將其組件插入標準html頁面?

回答

1

如果目標是讓設計師使用HTML而不是Java,那麼UiBinder?它會給你你想要的東西(單獨的HTML--或者說,來自Java代碼的XHTML-like-代碼)裏面的是一個GWT項目。

+0

謝謝,這看起來好像可能會訣竅! – user85116 2012-01-05 16:29:03

2

這裏是否GWT方式。至少在GWT的使命宣言中沒有。如果你想追求你的想法,你可以通過多種方式來做到這一點。

每頁GWT應用程序。 (例如,在每個頁面上都包含一個特定於此頁面的gwt應用程序)。您只需爲每個需要某種GWT功能的頁面編譯一個新的GWT模塊。您可以在一個頁面上使用它們中的幾個,或者不使用它們。如果你的GWT應用程序非常簡單,並且你不需要在每一個頁面上使用GXT Grid這樣的東西並且設置不同,否則你會浪費用戶瀏覽器將不得不下載大量的JS代碼一遍又一遍,如果你有很多頁面,這將是一個大問題。

所有頁面的一個大GWT應用程序。只需將所有內容放入單個GWT應用程序中,創建某種開關(某些js變量),以便應用程序知道它需要創建的內容。可能會使用某些代碼分割,因此在每個頁面上只會下載真正需要的東西。由於每個頁面都會使用相同的JS,所以緩存應該可以解決一遍又一遍下載應用程序代碼的問題(但是在用戶更改頁面時,實際解析/運行代碼仍存在問題)

第三種方法也是最有效的,但也是最困難的。只要用戶加載其中一個頁面,就沒有更多的導航,gwt模塊只需將模板用於用戶想要導航的頁面,並用新生成的模板替換當前的html代碼。如果你將使用ClientBundle和HTMLPanel的TextResource,這很容易實現。問題在於地址欄中的導航(GWT應用程序必須負責更改地址,因此用戶可以創建書籤或將鏈接發送給他們的朋友)。您將爲此使用一個GWT腳本,並推薦一些代碼分割。

這三種方法都是完全有效的,這取決於您的要求,您可以選擇其中任何一種。此外,如果您只想提供人們使用HTML來佈局GWT屏幕的能力,您可能需要考慮使用HtmlPanel和ClientBundle的TextResource的組合。

+0

感謝您的詳細解答;稍後我會詳細介紹一些這方面的內容,但現在我想我會按照Thomas的建議嘗試UiBinder。 – user85116 2012-01-05 16:28:15