Archive for GWT


GWTのコンパイルを高速化する方法

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

gwt-logo

 Google I/Oのセッションの一つで、Faster apps faster: Optimizing apps with the GWT Compilerというセッションがあり、そこで公開されていたテクニックです。ここで紹介されたテクニックは、リリース用のバイナリ出力を高速化するテクニックではなく、テスト用のバイナリ出力を高速化するテクニックですので、リリース用のコンパイルは従来通り気長に待ちましょう。

 まず、コンパイルオプションに以下の2つを付けます。最初のオプションは、メタデータの出力を抑制し、2つめのオプションはいくつかの最適化をキャンセルする事でコンパイル速度を上げます。

  • -XdisableClassMetadata
  • -draftCompile

 次に、モジュール作成時に自動生成されるXxxxxx.gwt.xmlの<module>タグ内に以下の記述を追加します。この記述は、safariブラウザのみを利用することを指示します。

  • <set-property name=”user.agent” value=”safari” />

 続いて、以下の記述を追加し、safari用に最適化されたDOMコントロールのみを利用するように指示します。

 <replace-with class="com.google.gwt.user.client.impl.DOMImplSafari">
   <when-type-is class="com.google.gwt.user.client.impl.DOMImpl" />
   <when-property-is name="user.agent" value="safari" />
 </replace-with>

 これでテストするブラウザが決まっている場合は、実行するJavaScriptはそこそこ速く、なおかつコンパイル速度を上げる事ができます。user.agentにはie6, ie8, gecko, gecko1_8, safari, operaが指定できるようです。

 最後に、Internationalization(I18N)を利用している場合には、以下の記述を追加する事で、テスト対象の言語以外は利用しない事を明記する事ができます。

  • <extend-property name=”locale” values=”ja_JP” />

 これで、私の環境では従来3分かかっていたコンパイル速度が1分になりました。

  • Digg
  • del.icio.us
  • Facebook
  • Google
  • hatena
  • LinkedIn
  • Technorati
  • Tumblr
  • TwitThis

GWT 2.0のDevelopment Modeにおいて、JNDI経由でMySQLを使う方法

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

gwt-logo

 GWT1.6をお使いの方はこちらをご覧ください。

 Google Web Toolkit(以下GWT)で開発をするときに、Google Plugin for Eclipseを利用するとEclipse上からGWTのコードを実行でき非常に便利です。

 GWT2.0から新しく導入されたDevelopment Modeは、Javaで記述されたGWTのコード(正確にはJavaのbytocode)をブラウザのプラグインで直接実行させるという非常にクレイジーな方法を採用しており、このおかげでJavaのコードをJavaScriptにコンパイルせずにブラウザ上で直接実行できるようになりました。

 以下、GWT 2.0で、JNDI経由でMySQLを使う方法。ちなみに、設定ファイルをちょっと変更するだけで、PostgreSQLなど他のDBでも利用できます。

 まず、Eclipse上でGWTのプロジェクトを作成します。「Use Google Web Toolkit」にチェックが入っており、「Use Google App Engine」にチェックが入っていないことを確認して下さい。

 Google Plugin for Eclipseを導入してない方はこちらの私の記事でご確認ください

ws000000

 次に、war/WEB-INF/libにjetty-naming-6.1.11.jarjetty-plus-6.1.11.jar、さらにmysql-connector-java-5.1.12-bin.jar(これは使いたいDB用のJDBC)の3ファイルをコピーします。

 *jetty-namingやjetty-plus、mysql-connector-javaのバージョンに理由がある訳ではないので、少しぐらいバージョンが違っても動くと思います。

 war/WEB-INFの直下にjetty-web.xmlというファイルを作成して、以下のように記述します。DBのホスト名、ポート番号、ユーザ名、パスワードは適宜設定してください。

CODE:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
  3.  
  4. <configure class="org.mortbay.jetty.webapp.WebAppContext">
  5.  
  6.     <new id="logstore" class="org.mortbay.jetty.plus.naming.Resource">
  7.         <arg>java:comp/env/jdbc/mysqldb</arg>
  8.         <arg>
  9.             <new class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
  10.                 <set name="Url">jdbc:mysql://192.168.0.111:3306/DB名</set>
  11.                 <set name="User">DBのユーザ名</set>
  12.                 <set name="Password">DBのパスワード</set>
  13.             </new>
  14.         </arg>
  15.     </new>
  16.  
  17. </configure>

 GWTのサーバー側のRemoteServiceServletを拡張したServletクラス内に以下の記述を追加すると、このクラス内からds.getConnection()でSQLのJDBCコネクションが取得できます。

CODE:
  1. private static final String LOOKUP_DB = "java:comp/env/jdbc/mysqldb"; //$NON-NLS-1$
  2.  
  3.     private static DataSource ds = null;
  4.  
  5.     @Override
  6.     public void init() throws ServletException {
  7.         super.init();
  8.         try {
  9.             Context ctx = new InitialContext();
  10.             ds = (DataSource) ctx.lookup(LOOKUP_DB);
  11.         } catch (NamingException e) {
  12.             e.printStackTrace();
  13.         }
  14.     }

 良くわからない人は、Google Web Toolkit 勉強会 in 京都 (#gwt_kyoto)に来るといいよ!

  • Digg
  • del.icio.us
  • Facebook
  • Google
  • hatena
  • LinkedIn
  • Technorati
  • Tumblr
  • TwitThis

[GWT] GWTとRealm認証

add to hatena hatena.comment (0) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 0

サーブレットコンテナのRealm認証をGWTで利用したい場合、注意が必要だ。

通常、web.xmlに以下のように書いて、認証エリアを指定すると思うが、GWTで認証を利用したい場合、Ajax通信先のURLも認証エリアに指定する必要がある。URLは、web.xmlの中ののどこかに記載されているハズだ。

私の場合は、Ajax通信するまえのHTMLはちゃんと認証が掛って、正しいIDでログインしているにも関わらず、Ajax通信先のURLを認証エリアに指定していなかったために、Principal情報を取得できませんでした。

<web-resource-collection>
<web-resource-name>SobaEducationPortal</web-resource-name>
<url-pattern>/secure/*</url-pattern>
<!-- ↓この指定を忘れるとうまくいかない -->
<url-pattern>/ajax/*</url-pattern>
</web-resource-collection>

この設定さえできてしまえば、Servlet側のプログラムは簡単だ。

RemoteServiceServletの拡張クラスで、getThreadLocalRequest()を利用しHttpServletRequestのインスタンスを取得すると後は、通常通りPrincipal情報を取得する事ができる。

HttpServletRequest request = this.getThreadLocalRequest();
Principal principal = request.getUserPrincipal();

  • Digg
  • del.icio.us
  • Facebook
  • Google
  • hatena
  • LinkedIn
  • Technorati
  • Tumblr
  • TwitThis