2010/02/09

Wicket on GoogleAppEngine

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

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


2. web.xml
web.xmlの内容は以下の通りです。
  1. <!--xml version="1.0" encoding="utf-8"?-->  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <brbr="">    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
  4. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">  
  5.     <filter>  
  6.         <filter-name>wicket.yonko</filter-name>  
  7.         <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>  
  8.         <init-param>  
  9.             <param-name>applicationClassName</param-name>  
  10.             <param-value>net.masa.wicket.YonkoWicketApplication</param-value>  
  11.         </init-param>  
  12.     </filter>  
  13.     <filter-mapping>  
  14.         <filter-name>wicket.yonko</filter-name>  
  15.         <url-pattern>/*</url-pattern>  
  16.     </filter-mapping>  
  17. </web-app>  


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

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

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

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


Wicketのデフォルト設定では、セッションオブジェクトをファイルに保存します。が、GAEではファイルの作成は制限されていますので、HttpSessionに保存するように設定します。
次にWicketのdevelopmentモードではThreadを生成してリソースの更新チェックを行いますが、GAEではThreadの生成を制限しているため、deploymentモードで動作させる必要があります。これにより、Threadの生成を停止できます。
上記のポイントを踏まえ、実際のソースは以下の通りとなります。
  1. /** 
  2.  * GAE/j用WicketApplicationクラスです。 
  3.  *  
  4.  * @author namiki 
  5.  *  
  6.  */  
  7. public class YonkoWicketApplication extends WebApplication {  
  8.   
  9.     /** リクエスト・レスポンスおよびHTMLのエンコードです。 */  
  10.     private static final String ENCODE = "UTF-8";  
  11.   
  12.     /** HTMLテンプレートファイルのベースフォルダです。 */  
  13.     private static final String RESOURCE_FOLDER = "WEB-INF";  
  14.   
  15.     /** HTMLテンプレートファイルの本来の階層から除去するパスです。 */  
  16.     private static final String PAGES_PATH = "net/masa/wicket";  
  17.   
  18.     /** 
  19.      * コンストラクタです。 
  20.      */  
  21.     public YonkoWicketApplication() {  
  22.     }  
  23.   
  24.     /* 
  25.      * (non-Javadoc) 
  26.      *  
  27.      * @see org.apache.wicket.Application#getHomePage() 
  28.      */  
  29.     @Override  
  30.     public Class<!-- extends Page--> getHomePage() {  
  31.         return HelloWicketPage.class;  
  32.     }  
  33.   
  34.     /** 
  35.      * Wicketの動作モードを設定します。 
  36.  
  37.      * WicketをGAE/jで動作させる場合、{@link org.apache.wicket.Application.DEPLOYMENT} 
  38.      * モードで動作する必要があります。 
  39.      *  
  40.      * @see org.apache.wicket.protocol.http.WebApplication#getConfigurationType() 
  41.      */  
  42.     @Override  
  43.     public String getConfigurationType() {  
  44.         return Application.DEPLOYMENT;  
  45.     }  
  46.   
  47.     /** 
  48.      * 初期化処理です。 
  49.      *  
  50.      * @see org.apache.wicket.protocol.http.WebApplication#init() 
  51.      */  
  52.     @Override  
  53.     protected void init() {  
  54.         super.init();  
  55.         // リクエスト・レスポンスの文字コード設定  
  56.         getRequestCycleSettings().setResponseRequestEncoding(ENCODE);  
  57.         // HTMLテンプレートの文字コード設定  
  58.         getMarkupSettings().setDefaultMarkupEncoding(ENCODE);  
  59.         // リソースの更新チェックを停止  
  60.         getResourceSettings().setResourcePollFrequency(null);  
  61.   
  62.         // テンプレートファイルの場所を指定  
  63.         getResourceSettings().addResourceFolder(RESOURCE_FOLDER);  
  64.         getResourceSettings().setResourceStreamLocator(  
  65.                 new ResourceStreamLocator() {  
  66.                     @SuppressWarnings("unchecked")  
  67.                     @Override  
  68.                     public IResourceStream locate(Class clazz, String path) {  
  69.                         if (path.indexOf(PAGES_PATH, 0) != -1) {  
  70.                             IResourceStream located = super.locate(clazz, path  
  71.                                     .substring(PAGES_PATH.length() + 1));  
  72.                             if (located != null) {  
  73.                                 return located;  
  74.                             }  
  75.                         }  
  76.                         return super.locate(clazz, path);  
  77.                     }  
  78.                 });  
  79.   
  80.     }  
  81.   
  82.     /** 
  83.      * セッションストアを生成します。 
  84.  
  85.      * WicketをGAE/jで動作させる場合、セッション情報を{@link javax.servlet.http.HttpSession} 
  86.      * に格納する必要があります。 
  87.      */  
  88.     @Override  
  89.     protected ISessionStore newSessionStore() {  
  90.         return new HttpSessionStore(this);  
  91.     }  
  92. }  

上記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です。
  1. /** 
  2.  * 初回表示用画面クラスです。 
  3.  *  
  4.  * @author namiki 
  5.  *  
  6.  */  
  7. public class HelloWicketPage extends WebPage {  
  8.     public HelloWicketPage(final PageParameters params) {  
  9.         add(new Label("messages""Hello, wicket world!!"));  
  10.     }  
  11. }  

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

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

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

0 件のコメント:

コメントを投稿