「GWT」カテゴリーアーカイブ

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

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のホスト名、ポート番号、ユーザ名、パスワードは適宜設定してください。

< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">

<configure class="org.mortbay.jetty.webapp.WebAppContext">

	<new id="logstore" class="org.mortbay.jetty.plus.naming.Resource">
		<arg>java:comp/env/jdbc/mysqldb</arg>
		<arg>
			<new class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
				<set name="Url">jdbc:mysql://192.168.0.111:3306/DB名</set>
				<set name="User">DBのユーザ名</set>
				<set name="Password">DBのパスワード</set>
			</new>
		</arg>
	</new>

</configure>

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

	private static final String LOOKUP_DB = "java:comp/env/jdbc/mysqldb"; //$NON-NLS-1$

	private static DataSource ds = null;

	@Override
	public void init() throws ServletException {
		super.init();
		try {
			Context ctx = new InitialContext();
			ds = (DataSource) ctx.lookup(LOOKUP_DB);
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

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

[GWT] GWTとRealm認証

サーブレットコンテナの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();

[GWT] java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteServiceが発生する場合の対策

GWTを利用していて、「java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteService」が発生する事がある。

このエラーが発生する時は、antかmavenを利用していると思うが、多くの場合、文字通りクラスパスが正しくない。gwt-user.jarにも同じパッケージ名が存在するので、gwt-user.jarだけで十分な気がしてしまうが、実際には、gwt-servlet.jarが必要。これに結構ハマったのでメモしておく。

私の場合、mavenのリポジトリの構築時に、artifactIdを重複させていて、必要なjarが全部パッケージできていなかった。

—–以下、検索用のスタックトレース—–
java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteService
続きを読む [GWT] java.lang.ClassNotFoundException: com.google.gwt.user.client.rpc.RemoteServiceが発生する場合の対策