Google App EgineでStruts 2フレームを使う


発表:http://hoverblog.appspot.com/blog?key=aglob3ZlcmJsb2dyCwsSBEJsb2cY0Q8M
 
「GAE」は以前にJava言語のサポートを発表しました.多くのJava開発者にとって、自分の熟知した文法を使って開発することができて、とても快適です.Javaの世界には多くの既存のツールとフレームワークがあります.私たちは日常の仕事ですでに熟練して使っています.そして、流行の成熟したものがあります.直接にGAEで使うことができれば、私たちの開発効率を大いに向上させます.
ここ数日はStruts 2を利用して、GAEのJavaバージョンのサポート環境の中で、簡単な博客を書きました.今はGAE+Struts 2の組み合わせの経験を記録します.
背景の紹介
Pythonは面白い言語で、作者の第二の接触の動的脚本言語です.第一は大学時代に学生のウェブサイトを作っていた時にPerlと接触しました.その後、Perlを使って会社のアプリケーション起動フレームを書き換えました.数年後、Perlの文法はあまりにも恥ずかしいので分かりにくいです.Pythonを使って起動フレームをアップグレードしました.Pythonは対象に向けたものであり、関数式プログラミングのサポートも兼ねています.また、Pythonの文法的強制インデントは読みやすいので、Pythonバージョンの起動フレームは会社のJava開発者にとっても維持しにくいです.
もちろん、これらは余談ですが、GAEが最初にPython言語のサポートを提供してくれました.しかし、私たちJava開発者にとって、Pythonを使って大きな応用開発を行うのは、まだ難しいことです.この時点で、Java言語のサポートを開始します.Java開発者全員の福音であり、当然のことです.Googleは現在の企業応用開発分野で最大の力を放棄することはできません.
Struts 2は、現在最も広く使われているWEB開発の枠組みであり、ほとんどのJava開発者が最も熟知している開発フレームでもあります.私たちのGAEアプリケーションでは、成熟したStruts 2を使うと、多くの追加的な開発作業を減らすことができます.
必要なStrutsのライブラリファイル
現在のStruts 2の安定バージョンは2.1.6で、Struts-2.1.6からの発行パッケージのいくつかを、あなたのGAEプロジェクトプロジェクトに導入します.
commons-fileupload-1.2.1.jar common-i-o-1.3.2.jar commons-loging-1.0.4.jar commons-loging-ap-11.jar freemarker-23.13.jar ognl-2.6.11.jar struts 2-core-2.16.jar xwork-2.12.jar IDEAを使ってプロジェクトを作成すれば、Strutsの2.1.6バージョンのサポートを選択すると、IDEAが自動的に必要なライブラリファイルを導入してくれます.
App EgineのためにあなたのStrutsをカスタマイズします.
GAEの中のServlet環境は一定の制限があります.スレッドを使ってはいけません.ファイルを使えません.他に注意すべき点があります.
 
まず、ServletContactext Listenerを追加して、context初期化時にOgnlRuntime.set SecurityManagerを呼び出して、StrutsをGAE環境内で正常に走ることができます.
 
package your.servlet.pkg;

import ognl.OgnlRuntime;

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

public class StrutsAppEngineAdapter implements ServletContextListener {
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        OgnlRuntime.setSecurityManager(null);
    }

    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}
このServlet Contactext Listenerをweb.xmlに配置する例:
<web-app>
  <listener>
    <listener-class>your.servlet.pkg.StrutsAppEngineAdapter</listener-class>
  </listener>
</web-app>
上の仕事を終えたら、あなたのゲームの中でStrutsの機能を使うことができます.
GAEの常用対象をカスタマイズしたCoverter
StrutsはCoverterの仕組みを提供しています.一般的な業務対象を直接ページに表示するか、またはタイプを対象とした要求データを受け取ることができます.GAEでよく使われているいくつかのオブジェクトは、対応するCoverterを定義した後、業務コードがより簡潔になります.一般的な2つのオブジェクトのCoverterコードを紹介します.
 
Text Converterは、comp.google.appine.appi.datastore.Text対象の変換器であり、TextはGAEの記憶の中で、大きなテキスト内容の保存対象であり、業務でよく使われています.まずTextConverterの大きなコードを見てみます.
package your.servlet.pkg;

import com.google.appengine.api.datastore.Text;
import ognl.DefaultTypeConverter;

import java.util.Map;

public class TextConverter extends DefaultTypeConverter {
    @Override
    public Object convertValue(Map map, Object o, Class toType) {
        if (toType == Text.class) {
            String value = ((String[]) o)[0];
            return new Text(value);
        } else if (toType == String.class) {
            Text text = (Text) o;
            return text.getValue();
        }

        return null;
    }
}
TextConverterの役割は主にWEBページにおいて、格納対象中の大きなテキスト内容を直接表示するためである.
もう一つはKeyCoverterで、comple.google.appine.appi.datastore.Key対象のコンバータです.Keyは、GAEの3つのキーの一つで、リクエストデータやページ表示を受信するときによく使います.コードを直接見る:
package your.servlet.pkg;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import ognl.DefaultTypeConverter;

import java.util.Map;

public class KeyConverter extends DefaultTypeConverter {
    @Override
    public Object convertValue(Map map, Object o, Class toType) {
        if (toType == Key.class) {
            String s = ((String[]) o)[0];
            return KeyFactory.stringToKey(s);
        } else if (toType == String.class) {
            Key k = (Key) o;
            return KeyFactory.keyToString(k);
        }

        return null;
    }
}
ソースコードのルートディレクトリで、xwork-conversion.propertiesファイルを作成します.内容は以下の通りです.
com.google.appengine.api.datastore.Text=your.servlet.pkg.TextConverter
com.google.appengine.api.datastore.Key=your.servlet.pkg.KeyConverter
上の仕事が全部終わったら、あなたのアクションの中で直接Keyタイプの変数を使うことができます.手でStringとKeyの切り替えをする必要がありません.
コンベンションPluginは使用できません.
Struts 2の中で最もよく使われているPluginはCovertionであるべきです.「ゼロプロファイル」は配置ファイルを書く手間を減らしています.コードの組織構造もかなりはっきりしています.
しかし、GAEではファイルシステムを読み込めません.現在のバージョンは正常に動作していません.とても残念です.ただし、あなたのGAEアプリケーションでは、アクションとJSPファイルは、やはりCovertion Pluginの組織方式によって保存されることを提案します.一方で、後のアップグレードと移転に有利です.一方で、あなたのアプリケーションのファイルもより鮮明に見えます.
 
HoverBlog by 
ホーバーRual is licensed under a 
Creative Commons署名2.5中国大陸License.