2009-05-30 16 views
9

同じモジュールに複数のエントリポイントがあります。複数のエントリの問題同じモジュール内のポイント

たとえば、ホームページのホームエントリポイントと管理ページの管理者 エントリポイントがあります。

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

私は今、セットアップを午前方法 - 私は がOnModuleLoad私の中でこのようsomtチェックする必要がありますために、管理者エントリポイントを実行しない

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

ホーム ページが開いて取得するときもう一方の方法で。

上記のチェックを行わないと、 で注入しているものは、ホームと管理ページの両方に同じ名前の という名前のdivがある場合は、それぞれに2回表示されます。

これは1000マイル離れており、明らかに間違っています。何が正しいのですか? 人の経験でこれを行う方法はありますか?

答えて

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

+1

divを見つけられないのはなぜですか? GWT用のjavascriptインポートを、必要なだけ多くのページに置くことができます。だからあなたはあなたの管理ページにそれを置いて、そのページの下にさらに管理部門を持っています。次に、それを通常のページに置き、通常のdivをページのさらに下に移動します。 一方、複数のモジュールがある場合は、必要なページに必要なモジュール用のjavascriptインポートを含めるだけで、それは非常に簡単です。 – rustyshelf

+0

これは素晴らしい解決策です。 – Feargal

1

管理者とホームページを別のページとして考慮しないでください。ページの概念はGWTには適用できません。単一のページ、つまり単一のエントリポイントが存在するからです。 異なるページの効果を出すには、GWTのURL書き換え機能を使用します。

異なるエントリーポイントを使用する場合は、上記のコメントで述べたように、別のモジュールを使用します。

+0

ありがとうございます - 私はURL書き換えに慣れていません(いくつかのリンクを提供することができますか?) - このモジュールと複数のモジュールの間の最良のアプローチは何ですか?あなたが記述したようなシナリオでは、最初に複数のエントリポイントを定義することが可能ですか?同じモジュール内の複数のエントリポイントを決して使用しないでください。 – JohnIdol

+0

こんにちはJohn、 URLの書き換えについては、GWTのヒストリー関連のもの全体を参照することをお勧めします。 モジュールベースのものの複数のエントリポイント - 特にエンタープライズアプリケーションの場合、多くの場合、モジュールのセットを配備し、クライアントが購入したものに基づいて他のモジュールセットを配備したくない場合があります。これがモジュールの基本概念です。個別のエントリポイントを持つことによって、各モジュールは別々に配備可能なアプリの単位です。単一モジュール内の複数のエントリポイントは、ビジネス上の観点からも技術的にも意味をなさない。 – sbidwai

1

EntryPointが1つしかないのが通常です。 1つのモジュール内の複数のEntryPointはすべて同時に開始し、時には期待していないことを行うことがあります。

個別に処理する方法には、多くのオプションがあります。 - 管理用に2つ、ホームアプリケーション用に2つの異なるコンパイルがあります。 - 管理トークンまたは履歴トークンを使用して、管理者またはホームを指定することを指定します。 - JS変数のいずれかを表示するようにチェックします。 - AdminまたはHome(RootPanel.get(id))を表示する特定のDIV IDが存在することを確認します。 - URLパラメータを使用してアプリケーションを示します。 - ...など

+0

基本アプリケーションをパッケージ化して拡張しようとすると、複数のエントリーポイントが同時に開始されるというあなたのコメントが私が経験していることです。エントリポイントが何度も呼び出される理由について私の疑惑を確認してくれてありがとう。 – Stevko

0

私のブログではこれを解決する方法があります。複数のエントリポイントを持ち、url-rewritingを使用するサンプルのMavenプロジェクトをダウンロードできます。見てください:http://zenoconsulting.wikidot.com/blog:16

4

私はGWTおもちゃアプリで複数のページを使いたいと思っていました。デプロイメント記述子(myApp.gwt.xml)のマッサージが必要でしたが、ここで行ったことがあります。

  • 別のクラスでEntryPointを実装し、新しいページでのみdivに追加したコードを追加しました。
  • は、元gwt.xmlをコピーして、二つのことを変更:
    • モジュールリネーム-に - 私は
    • エントリポイントは新しいクラスを指定し、「anothergwtapp」に変更しました。
  • 私がプロジェクトをコンパイルすると、 "war"というフォルダに(another for ...) "anothergwtapp"という別のディレクトリがあります。それはGWTの魔法である "anothergwtapp.nocache.js"を含んでいました。
  • 最後に元のHTMLページをコピーし、 "stockwatcher/stockwatcher.nocache.js"を "anothergwtapp/anothergwtapp.nocache.js"に置き換えました(はい、私は非常に新しいです - このチュートリアルはまだ私のマシン上にあります)
    • 新しいHTMLを少し変更しました(新しいエントリポイントの読み込み用の新しいdivが作成されます)。最初のページの新しいページに単純なhrefを追加しました。

それは働きました。 gwt.xmlを複製して、モジュールの新しい名前を付けて、新しいアプリページに合わせてください。私は他のリンクのいくつかを見て、実際に何が記述されているのかもしれないが、言葉やリダイレクトなどが多すぎる(つまり、何も読まなかった)。私はガリレオのための最新のGWTプラグインを使用していますので、今はおそらくIJWです。

+0

私はこれを探してきました!ありがとうございました。 – McTrafik

0

このフレームワークをまだ試しましたか? http://gwtmultipage.org/ クラウディウスこれを達成するための簡単な(トリッキー)方法はあり

+1

リンクが壊れています。 – rmtheis

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

関連する問題