2010/02/09

Wicket on GoogleAppEngine

GoogleAppEngine(以下、GAE)上で動作するWebアプリフレームワークを調べています。Apache Strutsに関しては特に苦労することなく動作させることができたので、次はApache Wicketに挑戦してみます。

1. appengine-web.xml
appengine-web.xmlを編集して、セッションを利用可能にします。appengine-web.xmlに以下の内容を追記します。

true


2. web.xml
web.xmlの内容は以下の通りです。


xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">

wicket.yonko
org.apache.wicket.protocol.http.WicketFilter

applicationClassName
net.masa.wicket.YonkoWicketApplication



wicket.yonko
/*




3. WicketApplication
次にWicketApplicationクラスを作成します。GAEでWicketを動作させる場合、以下のポイントがあります。

  • WicketApplication#newSessionStore()でHttpSessionStoreを返すようにさせる

  • WicketをDEPLOYMENTモードで動作させる

  • リソースの更新チェックを停止させる


Wicketのデフォルト設定では、セッションオブジェクトをファイルに保存します。が、GAEではファイルの作成は制限されていますので、HttpSessionに保存するように設定します。
次にWicketのdevelopmentモードではThreadを生成してリソースの更新チェックを行いますが、GAEではThreadの生成を制限しているため、deploymentモードで動作させる必要があります。これにより、Threadの生成を停止できます。
上記のポイントを踏まえ、実際のソースは以下の通りとなります。

/**
* GAE/j用WicketApplicationクラスです。
*
* @author namiki
*
*/
public class YonkoWicketApplication extends WebApplication {

/** リクエスト・レスポンスおよびHTMLのエンコードです。 */
private static final String ENCODE = "UTF-8";

/** HTMLテンプレートファイルのベースフォルダです。 */
private static final String RESOURCE_FOLDER = "WEB-INF";

/** HTMLテンプレートファイルの本来の階層から除去するパスです。 */
private static final String PAGES_PATH = "net/masa/wicket";

/**
* コンストラクタです。
*/
public YonkoWicketApplication() {
}

/*
* (non-Javadoc)
*
* @see org.apache.wicket.Application#getHomePage()
*/
@Override
public Class getHomePage() {
return HelloWicketPage.class;
}

/**
* Wicketの動作モードを設定します。

* WicketをGAE/jで動作させる場合、{@link org.apache.wicket.Application.DEPLOYMENT}
* モードで動作する必要があります。
*
* @see org.apache.wicket.protocol.http.WebApplication#getConfigurationType()
*/
@Override
public String getConfigurationType() {
return Application.DEPLOYMENT;
}

/**
* 初期化処理です。
*
* @see org.apache.wicket.protocol.http.WebApplication#init()
*/
@Override
protected void init() {
super.init();
// リクエスト・レスポンスの文字コード設定
getRequestCycleSettings().setResponseRequestEncoding(ENCODE);
// HTMLテンプレートの文字コード設定
getMarkupSettings().setDefaultMarkupEncoding(ENCODE);
// リソースの更新チェックを停止
getResourceSettings().setResourcePollFrequency(null);

// テンプレートファイルの場所を指定
getResourceSettings().addResourceFolder(RESOURCE_FOLDER);
getResourceSettings().setResourceStreamLocator(
new ResourceStreamLocator() {
@SuppressWarnings("unchecked")
@Override
public IResourceStream locate(Class clazz, String path) {
if (path.indexOf(PAGES_PATH, 0) != -1) {
IResourceStream located = super.locate(clazz, path
.substring(PAGES_PATH.length() + 1));
if (located != null) {
return located;
}
}
return super.locate(clazz, path);
}
});

}

/**
* セッションストアを生成します。

* WicketをGAE/jで動作させる場合、セッション情報を{@link javax.servlet.http.HttpSession}
* に格納する必要があります。
*/
@Override
protected ISessionStore newSessionStore() {
return new HttpSessionStore(this);
}
}

上記init()内でHTMLテンプレートファイルの場所を指定しています。Wicketは通常の場合クラスファイルと同じ階層からHTMLテンプレートファイルを探しますが、RESOURCE_FOLDER(=WEB-INF)から探すように指定しています。また、PAGES_PATH(=net/masa/wicket/)は、パッケージ名から除去すべきパスを定義しています。よって、これらの設定からWicketはHTMLテンプレートファイルをWEB-INF/pagesから探すようになっています。

4. HelloWicketPage
次にWicketApplicationクラスが最初に呼び出すページを作成します。最初に呼び出すページはApplication#getHomePage()で定義しますが、上記の例ではHelloWicketPage.classを呼び出していますのでそのクラスを作成します。パッケージはnet.masa.wicket.pagesです。

/**
* 初回表示用画面クラスです。
*
* @author namiki
*
*/
public class HelloWicketPage extends WebPage {
public HelloWicketPage(final PageParameters params) {
add(new Label("messages", "Hello, wicket world!!"));
}
}

ここではHTMLに表示するメッセージを定義しています。
次にこのメッセージを表示するためのHTMLテンプレートファイルを作成します。
${project}\war\WEB-INF\pagesというディレクトリを作成し、その直下にHelloWicketPage.htmlを作成します。



これで準備が整いましたのでEclipseから起動して、http://localhost:8888にアクセスしてみると、画面にはHelloWicketPage.javaで定義したメッセージが表示されます。

これでGAE上でWicketを動作させることができました。今後はこれをベースにして色々な機能を追加していこうと思います。

0 件のコメント:

コメントを投稿