0

GoogleWebToolkitとJavaGoogleAppEngineを使用してアプリを作成しています。私は次のことが非常に予想通りに起こる状況を見つけました。app.yamlエントリのサーブレットがあります。これは次のようになります。

handlers:

- url: /foo/*
  name: FooServlet
  servlet: com.waga.server.FooServlet
  login: required

このサーブレットは、ユーザーがログインしていることを確認し(冗長、私は知っています)、データベースでユーザーを探します。見つかった場合は、GWTモジュールをロードするためのjavascriptを含むHTMLページをレンダリングするためのBar.jspファイルが含まれます。このBar.jspファイルとGWTモジュールはしばらくの間機能しており、サーブレットがBar.jspをレンダリングする前にチェックできるようにするための最近のマイナーな変更と、Bar.jspファイルの先頭に追加されたコードがあります。ページに含めるいくつかの文字列を計算します。

log.infoをサーブレットの上部、Bar.jspファイルの上部、およびBar.jspファイルの下部に配置しました。GWT devmodeを使用してサーブレットに移動すると、ログメッセージが次の順序で表示されます。

Foo servlet top
Bar.jsp top
Bar.jsp bottom
Foo servlet top
Foo servlet top
Bar.jsp top
Bar.jsp bottom
Bar.jsp top
Bar.jsp bottom

つまり、サーブレットはブラウザによって3回アクセスされており、同期していないようです(最後の2つは重複していることに注意してください)。これは私がそれを実行するたびに起こります。

さらに、Bar.jspファイルにはページがレンダリングされていると記載されていますが、GWTjavascriptがクライアント側アプリを読み込んでレンダリングすることはありません。過去にあったので、それはうまくいくはずです。つまり、GWTクライアント側のコードが機能していて、URLをサーブレットにマップする方法とサーブレットに.jspファイルを含める方法を再調整しているところです。さらに、devmodeがクライアントに送信する前にサーバー上でJavaをJavaScriptにコンパイルしているとき、ラップトップファンが起動し、これを行うためにJavaがCPUの大部分をかなりの数秒間使用しているのを見ることができます。今はわかりません。

サーブレットを削除して、app.yamlに.jspを直接呼び出させてみました(すでにログインしているなど、サーブレットがチェックするすべてのパスがパスするので、何も実行されません)。つまり、試してみました。 app.yamlに次のように言わせます:

handlers:

- url: /foo/*
  jsp: Bar.jsp
  login: required

今、ログはこれを言います

Bar.jsp top
Bar.jsp botton
Bar.jsp top
Bar.jsp top
Bar.jsp bottom
Bar.jsp bottom

GWTモジュールがロードされていないように見えるのと同じインターリーブと同じ症状。

4

1 に答える 1

0

この状況は、Bar.jspファイルの先頭にあるrequest.getPathInfo()を出力するとより明白になります。問題は、プロジェクトを開始したときにGWT webAppCreatorを信頼して妥当なコードを生成し、URLパスについて慎重に考えていなかったことです。特に、webAppCreatorは、次のようにWebページからコンパイルされたjavascriptクライアントを参照するHTMLを生成します。

<!--                                           -->
<!-- This script loads your compiled module.   -->
<!-- If you add any GWT meta tags, they must   -->
<!-- be added before this line.                -->
<!--                                           -->
<script type="text/javascript" language="javascript" src="waga/waga.nocache.js"></script>

絶対パスではなく、srcURLの相対パスに注意してください。私の意見では、絶対パスを生成することは、たとえば、プレフィックス付きのURLをこの.jspファイルにマップする場合に、ファイルシステム内でターゲットを誤って移動しないため、はるかに理にかなっています。これはまさに私が行ったことです。特に、生成されたjavascriptクライアントへのパスは、コンパイラが常にファイルシステム内の特定の場所に配置するため、相対パスとしては意味がありません。スラッシュを前に付けてパス(および私が使用した.cssファイルへの別の相対パス)を絶対パスにすると、問題が修正されました。

于 2012-04-17T06:12:36.217 に答える