2009-05-30 91 views
9

我在同一個模塊中有多個入口點。多個入口點在同一模塊中的問題

例如,我有主頁的入口點和管理頁面的Admin入口點。

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

我現在設置的方式 - 我需要檢查SOMT像這樣在我 OnModuleLoad:當家庭 頁面獲取開放

if((RootPanel.get("someHomeWidget")!=null)&& 
    (RootPanel.get("someOtherHomeWidget")!=null)) 
{ 
    // do the stuff 
} 

,以便在管理員入口點不執行反之亦然。

不做上面的檢查也涉及,如果我有一個在家庭和管理頁面 相同名稱的div無論我在 注射它顯示每個人兩次。

這個臭味千里之外,顯然是錯誤的:什麼是正確的 方式在人們的經驗做到這一點?

任何幫助表示讚賞!

回答

8

正確的方法是讓每個模塊一個單一入口點,那支在適當的div相應的部件:

RootPanel panel = RootPanel.get("someHomeWidget"); 
if (panel) panel.add(new HomeWidget()); 

panel = RootPanel.get("adminWidget"); 
if (panel) panel.add(new AdminWidget()); 

它只是掃描找你有任何的div的頁面,並插入這樣適當的部件。因此,您的HTML頁面確定何時顯示哪些小部件,並且GWT代碼已準備好處理任何情況。沒有什麼關於上述那些臭味,這是你的入口點應該寫的方式。

另一種方法是,如果您的管理區域和通常區域完全不同(例如:您想在不同的時間加載它們),那麼它們應該是單獨的模塊,並具有單獨的入口點。

+0

在我的情況下,主頁和管理頁面需要在不同的時間加載(它們是不同的頁面!) - 即使只有一個入口點,它也不會找到div,它會拋出異常。另一方面,不清楚使用不同模塊的是如何配置哪一個應該用哪個頁面觸發。 – JohnIdol 2009-05-31 00:33:00

+1

爲什麼不能找到div?你意識到你可以將GWT的javascript導入放在儘可能多的頁面上。所以你會把它放在你的管理頁面上,並讓管理員進一步在頁面下方。然後你也可以把它放在普通頁面上,並在頁面的下方放置正常的div。 另一方面,如果你有多個模塊,你只需在你想要的頁面上包含你想要的模塊的javascript導入,那真的很簡單。 – rustyshelf 2009-06-02 00:27:54

+0

這是一個不錯的解決方案。 – Feargal 2011-01-25 10:45:23

1

不要將管理員和主頁視爲不同的頁面。頁面的概念不適用於GWT,因爲只有一個頁面,即單個入口點。 如果您想要賦予不同頁面的效果,請使用GWT的URL重寫功能。

如果您確實想要使用不同的入口點,那麼就像上面的註釋中所說的那樣,使用不同的模塊。

+0

謝謝 - 我不是很熟悉URL重寫(你能提供一些鏈接嗎?) - 這個和多個模塊之間最好的方法是什麼?在你描述的情況下,爲什麼首先可能定義多個入口點?你是說永遠不要使用同一模塊中的多個入口點嗎? – JohnIdol 2009-06-01 11:39:18

1

通常只有一個入口點更好。一個模塊中的多個入口點都在同一時間開始,有時可以做你沒想到的事情。

如何單獨處理它有很多選項: - 針對管理員和家庭應用程序有兩種不同的編譯方式。 - 使用歷史標記,以表明您想聯繫或家庭 - 檢查JS變量顯示一個或其他 - 檢查特定的DIV ID的存在表明管理員或家庭(RootPanel.get(ID)) - 使用URL參數來指示應用程序。 - ...等

4

我也想在一個GWT玩具應用程序中使用多個頁面,我想我想通了。這需要部署描述符(myApp.gwt.xml)的一些按摩功能,但這是我所做的。

  • 製造另一個類實現入口點,並添加一些代碼,只有在新的頁面添加到一個div。
  • 複製的原gwt.xml,改變了兩件事情:
    • 的模塊重命名 - - 我改爲「anothergwtapp」
    • 入口點指定的新類。
  • 當我編譯項目時,在「war」文件夾中有另一個目錄叫做(等待它......)「anothergwtapp」。它包含了GWT魔術的「anothergwtapp.nocache.js」。
  • 最後,我複製了原始HTML頁面,並將「stockwatcher/stockwatcher.nocache.js」替換爲「anothergwtapp/anothergwtapp.nocache.js」(是的,我很新 - 教程仍在我的機器上)
    • 我換了新的HTML是有點不同(新div的新切入點的onload填充),我在第一頁添加了一個簡單的href到新頁面。

它工作。只需複製gwt.xml併爲該模塊提供一個新名稱以與新的應用程序頁面一起使用。我查看了其他一些鏈接,實際上我可能已經完成了所描述的內容,但是有太多的單詞和重定向等等(即我沒有真正閱讀任何內容)。我爲伽利略使用最新的GWT插件,所以現在可能是IJW。

1

有一個簡單的(技巧)的方式來實現這一目標:

做一個主類的切入點。

<module rename-to='gwt'> 
    <inherits name='com.google.gwt.user.User'/> 
    <entry-point class='com.example.client.Main'/> 
    <source path='client'/> 
    <source path='shared'/> 
</module>;<br/> 

創建此Main.java像一個調度員的工作:

package com.example.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.RootPanel; 

public class Main implements EntryPoint { 

    public void onModuleLoad() { 

    String url = Window.Location.getHref(); 
    if (url.indexOf("?install")>-1) { 
     Install install = Install.getInstance(); 
     RootPanel.get().add(install);  
    else if (url.indexOf("?admin")>-1) { 
     Admin admin = Admin.getInstance(); 
     RootPanel.get().add(admin);  
    } else { 
     Application app = Application.getInstance(); 
     RootPanel.get().add(app);  
    } 
    } 
} 

現在不同類別的應用程序,管理和安裝 工作像單獨的單位。

這裏是例如簡單的安裝:

package comexample.client; 

import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.HTML; 

public class Install extends FlowPanel { 

    /** Singleton stuff - to access Main from all subclasses! */ 
    private static Install singelton; 
    public static Install getInstance() { 
    if (singelton == null) {singelton = new Install();} 
    return singelton; 
    } 

    /** Constructor - called by Main.onModuleLoad() */ 
    private Install() { 
    this.add(new HTML("<h1>Do whatever You have to do!</h1>")); 
    } 
} 

你不需要的東西辛格爾頓(的getInstance),但它是在大的應用非常方便。

現在在/戰爭目錄中創建一個名爲安裝目錄和管理,並非常人創建一個HTML頁面是這樣的:因此,當用戶指引他布勞爾到http://www.example.com/install,他將被重定向到

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="refresh" content="0; URL=/index.html?install"> 
</head> 
<body></body> 
</html> 

http://www.example.com/index?install和index.html綁定到Main.java,它將調度請求並加載Install。java