2012-01-16 21 views
0

私はGWT/GAE(Java)アプリケーションを作成しています。私は追加コンテナタグIDの名前はどのように重要ですか?

final Button sendButton = new Button("Send"); 
final TextBox nameField = new TextBox(); 
nameField.setText("GWT User"); 

:それは、このようなHTML要素にアクセス

<table align="center"> 

    <tr> 
    <td colspan="2" style="font-weight:bold;">Please enter your name:</td> 
    </tr> 

    <tr> 
    <td id="nameFieldContainer"></td> 
    <td id="sendButtonContainer"></td> 
    </tr> 

クライアント側(JavaScriptに)Javaでは:GWTが付属して自動生成されたハロー単語の例では、このようなコードを生成し、 HTML要素:someStuffContainerを使用してプログラムでリンクを追加できることを示すコンテナフィールド。また、ログアウトURLのRPCサービス(logoutUrlContainer)を呼び出すことで、別のフィールドを追加しました。 (これを行うより簡単な方法があります:GWT/GAE(Java): when combined with GAE, app.yaml/web.xml user authentication and login/logout not really working。私はそれがうまくいくかどうかを見たいと思っていました)someStuffContainerは、これを制御された実験にするためだけにありました。そのURLをサーバ側で生成されたログアウトリンクで埋めることから、これは以下に関連します。クライアント側(JavaScriptに)Javaでは

<tr colspan="2"> 
    <td id="someStuffContainer"></td> 
    </tr> 
    <tr colspan="2"> 
    <td id="logoutUrlContainer"></td> 
    </tr> 

、私はこれでした:

// make it clear that we can add something to the page 
final HTML someStuffHTML = new HTML 
    ("<a href=https://www.google.com/search?q=zap>some stuff 3</a>"); 

// provide the user with a logout URL; FIX: do this by just 
// providing a link to a generic logout servlet, rather than by 
// proactively creating the logout link here. 
final HTML userStatusHTML = new HTML(); 
GWT.log("userStatusService.getStatus()"); 
userStatusService.getStatus 
    ("/", new AsyncCallback<UserStatusServiceResponse>() { 

    public void onFailure(Throwable caught) { 
     GWT.log("userStatusService.onFailure()"); 
     LogUtil.logThrowable(caught); 
    } 

    public void onSuccess(UserStatusServiceResponse result) { 
     GWT.log("userStatusService.onSuccess()"); 
     if (result.loggedIn) { 
     userStatusHTML.setHTML("<a href=\""+ result.logOutUrl+ 
           "\">log out</a>"); 
     } else { 
     // FIX: we should actually redirect to the base page 
     userStatusHTML.setHTML("<a href=\""+ result.logInUrl+ 
           "\">log in</a>"); 
     } 
    } 
    }); 

RootPanel.get("someStuffContainer").add(someStuffHTML); 
RootPanel.get("logoutUrlContainer").add(userStatusHTML); 

をプログラム的なHTMLが現れるとログアウトURLをクリックすると、ユーザーがログに記録されているという意味で、このすべての作品でる。 (この作業を見るためには別のタブでログアウトURLを開く必要があります;別のページに行くとGWT devmodeプラグインが鳴り出します;アプリケーションを再コンパイルする必要があると不平を言っているような状態になりますさらに、あなたは再度ログオンすることを要求するためにアプリエンジンのリロードをヒットしなければならない;あなたがログアウトしていてクライアント側がまだ実行中の場合は、ユーザーを確認しているサーバー側がログインしています)。

コンテナフィールド "logoutUrlContainer"の名前はまったく重要ではないようです。したがって、チェックインする前に、コードを整理してより一般的な名前に変更することを考えました。これは、より一般的なユーザーステータスウィジェットにそのコンテナを使用する可能性があるという事実を反映しています。そこで、 "logoutUrlContainer"の名前を "userStatusContainer"に変更しました。私は.htmlとクライアント側のJava(JavaScriptにコンパイル)で名前を変更しました。今の代わりに作業のため、この行は、nullポインタ例外を取得:

RootPanel.get("logoutUrlContainer").add(userStatusHTML); 

を私はむしろ、経験豊富なコーダーだ:私は、文字列が一致するようにコピー&ペーストしてくださいました。私はemacsの検索機能を使ってチェックしました。私はアリ全体をきれいにするプロジェクトをきれいに使いました。私はgrepを使用してgrepを使用して、クラスファイルなどのバイナリファイルをプロジェクト全体に残しました。このファイルはant cleanによって見逃されていて、古い名前が含まれていました。私はサーバーを再起動し、アプリケーションを含むブラウザのタブを削除した。私はこれを繰り返した。繰り返して、私はNULLポインタ例外を取得します。私は少なくとも1時間何度も何度も何度もやったと思う。 someStuffContainerが常に働いていた時間全体に注意してください。何らかの理由でRootPanel.get()はuserStatusContainerを見つけられないうちに見つけました。最後に、私はちょうどコンテナストリングの名前をもう一度付け直しました。それはすぐに機能します。私はチェックインした。

何が起こっているの?アリクリーンなものが欠けていますか?ここで私は自分自身を拡張し、私のant cleanターゲットは、次のとおりです。

<target name="clean" description="Cleans this project"> 
    <delete dir="gwt-unitCache" failonerror="false" /> 
    <delete dir="war/myapp" failonerror="false" /> 
    <delete dir="war/WEB-INF/classes" failonerror="false" /> 
    <delete dir="war/WEB-INF/lib" failonerror="false" /> 
    <delete dir="war/WEB-INF/deploy" failonerror="false" /> 
    <delete file="war/WEB-INF/appengine-web.xml" failonerror="false" /> 
    <delete file="war/WEB-INF/web.xml" failonerror="false" /> 
    </target> 

私は戦争/ WEB-INFをすべて削除していない唯一の理由は、私は、JavaはGoogle Appを設定するには、オプションのapp.yamlを使用しているということですEngineでは、.xmlファイルを自分で編集するのではなく、

私のアリクリーンターゲットには何か不足していますか?この経験は、私がGWTを使いたくないということを本当に私にしています。


更新:JavaScriptが再コンパイルされたが、GWT開発プラグインはページがキャッシュされることを可能にするだろうと私に起こったことはありません:私は何が起こったか知っていると思います。後で私はウェルカムファイルリストを変更し、古いウェルカムファイルはまだ表示されていました。設定ファイルを勉強して、私はそれが可能であるとは思えませんでした。最後にリロードして、新しいファイルを表示しました。

とにかく、キャッシュはこの質問で報告されたエラーを説明します。私はGWTがページをキャッシュすることを許可しているのか、特にdevmodeでは何をしているのか分かりません。あなたは、Web開発者が15年間オン・オフした後、それを早期に考えていたかもしれないと思います。しかし、人々が開発効果の枠組みの中で、効果をキャッシュするのがそんなに厄介である可能性があるとは想像もできません。


最新バージョンのOS X 10.6.8(x86)を実行しています。 16.0.912.63(公式ビルド・113337) $のJava -version Javaのバージョン "1.6.0_29" のJava(TM)SEランタイム環境(ビルド1.6.0_29-b11-402-10M3527) は、Java HotSpot: 私のブラウザは、Chromeがあります(TM)64ビットサーバVM(ビルド20.4-b02-402、混合モード) 私はgwt-2.4.0を使用しています。

答えて

0

これは、あなたがいたという事実に関係してい

その状態から、それだけのアプリを再コンパイルする必要があることを訴えて保持状態に入るようだと、あなたがすることはできませんデバッグモードでは、コンパイルされたファイルのいくつかが更新されたバージョンで上書きされ、再コンパイルしていないとき(および開発モードではないアプリケーションを起動しているとき)、欠落しているファイルが検出されて停止します。 devモードを使用する場合は、新しいページのURLに?gwt.codesvr=...を追加して、そのページをdevモードでも実行します。または、アプリケーションをコンパイルし、devモードのページを使用しないでください(そのモジュールをロードする - 他のモジュールは問題ありません)。

私はあなたがURLにその接尾辞を追加した場合、あなたの全体の問題が消え疑い - RootPanel.get("some-id")がHTMLページと一致しない場合、あなたが見ているNPEが原因RootPanel.get返すnullにあり、そしてaddはヌルに呼び出されています。

関連する問題