레이블이 seasar2인 게시물을 표시합니다. 모든 게시물 표시
레이블이 seasar2인 게시물을 표시합니다. 모든 게시물 표시

2009년 11월 28일 토요일

s2Fisshplate

009-10-09

[]S2Fisshplateを使ってみる 17:08 S2Fisshplateを使ってみる - 抜かれるならド肝だよね を含むブックマーク はてなブックマーク - S2Fisshplateを使ってみる - 抜かれるならド肝だよね Add Star

今の案件では,Excelを帳票として出力する機能があるんですが,POIでポイポイするのは結構大変・・・。しかも,何だかズイブンと複雑なExcel帳票を依頼されたので,何とか工数を削減出来ないものかと,id:gokingさんにヘルプを頼んでみました。

そこで候補として上がったのがFisshplateで,S2Fisshplateなんてものまであったんで,導入してみようと思いホゲホゲしてみた(実際にホゲホゲしたのはgokingさんなんですけどねw)

そもそもFisshplateって何じゃらホイ?

Fisshplateとは,Excelテンプレート式を記述して,テンプレート式を元に動的にデータを出力しちゃおうというライブラリです。

埋め込みデータ

動的に値をテンプレートに出力するには,

${hoge}
${foo.hoge}

プログラム側からは,Mapで渡してキー文字列がテンプレートのバインド変数となり,値を参照する事が出来ます。JavaBeansの場合はプロパティを参照(ネストもOKっぽい)出来るようです。(getterが必要)

テンプレート

文法(テンプレート式)には,以下のようなものがあります。

独自タグテンプレート式)

独自にタグも作成できるらしく,「要素クラス」と「パースクラス」のペアを作成して,「FPTemplate」クラスにaddしてあげればOKみたい。

S2Fisshplate

S2Fisshplateは,S2とFisshplateを連携させて,インタフェースを定義するだけでFisshplateの機能を使う事が出来ます。S2FisshplateはS2Containerに非依存との事。

基本的には,Fisshplateと利用方法は一緒なんですが,規約に沿った形で作らないと処理されません。(インターフェースExcelテンプレートのファイル名とか)

テンプレートに埋め込むDtoプロパティは,「プロパティのsetter、getterを必ず作って下さい。publicフィールドの動作は確認していません。」との事でしたが,サンプルで動かしたDtoはpublicフィールドでも動作しました。ただ,確認していないとの事なので,setter/getterは用意した方が良いかも。

何となく思った事

Fisshplateは決まりきったテンプレートに対して,値を動的に出力する場合には威力を発揮すると思います。ただ,複雑怪奇なテンプレートに対して適用すると返って大変になりそうなので,複雑なテンプレートに対しては,Fisshplateを部分的に利用して,後は素のPOIでポイポイした方が良いような気がします。

また,縦方向の繰り返しには強いんですが,横方向の繰り返しはちょっと弱いようなので,そういった部分でも利用には注意が必要かもです。

2009년 11월 7일 토요일

SAStrutsでJSONを返す

SAStrutsでJSONを返すAdd Star

| 14:17 | はてなブックマーク - SAStrutsでJSONを返す - wataの日記

SAStrutsDBから取得した情報をJSON形式で返したいと思ったのでJSON-libを使ってみた。単純に取得したEntityを変換してやれば終わりだろうと思っていたらJSON-libがpublicフィールドに対応していない。だからといってgetter、setterを追加するのも馬鹿らしいと思ったのでMapに変換してからJSON形式に変換して回避。

ソースは以下のような感じになった。

	private static final String JSON_RES_HEADER = "application/json";

	@Resource
	protected EntityService entityService;

	@Execute(validator = false)
	public String index() {
		Map<String, Object> user = newHashMap();
		// ここでMapに変換
		BeanUtil.copyProperties(entityService.findById("entity"), user);
		ResponseUtil.write(JSONObject.fromObject(user).toString(), JSON_RES_HEADER, "utf-8");
		return null;
	}

publicフィールドは楽だが外部ライブラリを使うとなったときにまだまだ不便だなぁ。クラスロード時に動的にgetter、setterをつけるようにすればいいのだろうか。でもどれをつける、つけないが問題になったり、そのためにアノテーションや設定を書くのもなんだかなぁということになりそう

2009년 11월 6일 금요일

ServletException when SAStruts is executed on SDLoader-jsp21

SAStrutsをSDLoaderで動かそうとしたら ServletException。

javax.servlet.ServletException: javax.servlet.jsp.tagext.TagAttributeInfo.<init>(Ljava/lang/String;ZLjava/lang/String;ZZLjava/lang/String;ZZLjava/lang/String;Ljava/lang/String;)V
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:275)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:688)
	at sdloader.javaee.impl.FilterChainImpl.doFilter(FilterChainImpl.java:50)
	at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:79)
	at sdloader.javaee.impl.FilterChainImpl.doFilter(FilterChainImpl.java:48)
        ~略~

エラーメッセージの内容が、TagAttributeInfoのコンストラクタで何かあったらしいので、調べると。

SAStrutsが同梱している geronimo-jsp_2.0_spec-1.0.jar は JSP2.0。

SDLoaderの中に含まれるJasperは、JSP2.1。

なので、geronimo-jsp_2.0_spec-1.0.jar をはずして起動で解決。

と思ったら、JSP2.0版のSDLoaderがあった。

なお、JSPがないもの、JSP20を使用するものは、Downloadsのタブの一覧からダウンロードできます。

sdloader - Project Hosting on Google Code

これをいれたら、geronimo-jsp_2.0_spec-1.0.jar を入れてても普通に動いた。。

以下は、SAStrutsをSDLoaderで起動するコード。

package boot;

import sdloader.SDLoader;
import sdloader.javaee.WebAppContext;
import sdloader.util.Browser;

public class Main {
    public static void main(String[] args) {
        
        String contextPath = "/sa-struts-tutorial";
        
        SDLoader loader = new SDLoader(true);
        loader.addWebAppContext(
            new WebAppContext(contextPath, "src/main/webapp"));
        loader.setPort(8080);
        
        loader.start();
        
        Browser.open("http://localhost:" + loader.getPort() + contextPath);
    }
}

FileSystemComponentAutoRegister vs JarComponentAutoRegister

seasarのFramworkを利用して、拡張共通モジュールを実装してて、
それをJARにして別のプロジェクトで使おうとしてるところ、
setter-injectionがうまくいかなかった。

問題はFileSystemComponentAutoRegisterは
diconファイルが存在するクラスパス(/WEB-INF/classes)をみるが、
jarの中にあるクラスは参照しきれなくてOUT!!

diconファイルの記述を変更し、JarComponentAutoRegister
に変更して問題解決。
修正前
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>

  <include path="convention.dicon"/>
  <include path="s2jdbc.dicon"/>
  <component
    class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.service"</arg>
      <arg>".*Service"</arg>
    </initMethod>
  </component>
  <component
    class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.helper"</arg>
      <arg>".*Helper"</arg>
    </initMethod>
  </component>
  <component
    class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@SESSION
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.dto"</arg>
      <arg>".*Dto"</arg>
    </initMethod>
  </component>

</components>
修正後
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  "http://www.seasar.org/dtd/components24.dtd">
<components>

  <include path="convention.dicon"/>
  <include path="s2jdbc.dicon"/>
  <component
    class="org.seasar.framework.container.autoregister.JarComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <property name="referenceClass">
      @hoge.hoge..framework.service.FwAbstractService@class
    </property>
    <property name="jarFileNames">"hoge-framework.*"</property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.service"</arg>
      <arg>".*Service"</arg>
    </initMethod>
  </component>

  <component
    class="org.seasar.framework.container.autoregister.JarComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <property name="referenceClass">
      @hoge.hoge..framework.helper.FwConverterHelper@class
    </property>
    <property name="jarFileNames">"hoge-framework.*"</property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.helper"</arg>
      <arg>".*Helper"</arg>
    </initMethod>
  </component>
    <property name="jarFileNames">"hoge-framework.*"</property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.dto"</arg>
      <arg>".*Dto"</arg>
    </initMethod>
  </component>
  <component
    class="org.seasar.framework.container.autoregister.JarComponentAutoRegister">
  <property name="instanceDef">
    @org.seasar.framework.container.deployer.InstanceDefFactory@SESSION
  </property>
    <property name="autoNaming">
      <component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
    </property>
    <property name="referenceClass">
      @hoge.hoge..framework.dto.LoginUserDto@class
    </property>
    <property name="jarFileNames">"hoge-framework.*"</property>
    <initMethod name="addClassPattern">
      <arg>"hoge.hoge..framework.dto"</arg>
      <arg>".*Dto"</arg>
    </initMethod>
  </component>


</components>

Seasar2のconvention.diconに複数のルートパッケージを追加

Seasar2のconvention.diconに複数のルートパッケージを追加

スズキです。

Seasar2でjarファイルにあるDAO(別パッケージ)をDI/AOPしようとしたときに、
今までは、JarComponentAutoRegisterをapp.diconに書くことによって
実現していました

近頃、SmartDeployを覚えて、同様のことを試すと、
例外が発生してしまいます。(どのような例外かは忘れてしまいました)

で、途方にくれていたら、ふと、
ルートパッケージを定義しているconvention.diconの、
実際にルートパッケージを追加するメソッドは
addRootPackageName
だったなー。
"add"!?、
"set"じゃないんだ!
ということで、下記を試してみたら、見事にjarのほうのパッケージも
ルートパッケージとして認識して、SmartDeployを通して、
DAOもDI/AOPされるようになりました。

--------convention.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC
    "-//SEASAR//DTD S2Container 2.4//EN"
    "http://www.seasar.org/dtd/components24.dtd">
<components>
  <component
      class="org.seasar.framework.convention.impl.NamingConventionImpl">
    <initMethod name="addRootPackageName">
      <arg>"jp.co.iret.suz.user"</arg>
    </initMethod>
    <initMethod name="addRootPackageName">
      <arg>"jp.co.iret.suz.common"</arg>
    </initMethod>
  </component>
</components>
--------

2009년 10월 31일 토요일

Ymirとは

Ymirとは

2009-08-27 11:47:05
Ymir(ユミル)は、フィルタ指向のシンプルなWebアプリケーション構築フレームワークです。

元々はYmirはKvasir/SoraやTuigwaaにおいてWebアプリケーション的なプラグインを作成するためのフレームワークとして作成されましたが、組み込み用としてだけでなくStrutsのような単独のWebアプリケーション構築フレームワークとしても利用可能です。

Ymirの特徴は以下のとおりです。

フィルタ指向
デフォルトのビューテンプレートはZPT(Zope Page Template)
コンポーネント管理機構としてSeasar2.4を内蔵
Seasar2.4のHOT deployに対応
リクエスト駆動の自動生成機能
フィルタ指向

Webサーバの基本的な機能は、Webブラウザからのリクエストに応じてコンテンツを返すことです。

JavaのServletAPIを使ったWebアプリケーションでは、リクエストされたURIに対応するコンテンツをサーブレットがレスポンスとして返します。

コンテンツが静的なものであれば、サーブレットは単にURIに対応するファイルの内容をそのままレスポンスとして返します。例えばTomcatでHTMLコンテンツをリクエストした場合は、DefaultServletがリクエストに対応するHTMLファイルの内容を返します。

コンテンツが動的なものであれば、サーブレットはURIに対応するファイルの内容をレンダリングして結果をレスポンスとして返します。例えばTomcatでJSPコンテンツをリクエストした場合は、JspServletがリクエストに対応するJSPファイルの内容をレンダリングして、結果であるHTML等のコンテンツを返します。

ところでJSPやVelocityなどのページテンプレートを使って動的なコンテンツを生成させる場合、テンプレートをレンダリングするために必要なオブジェクトを予めHttpServletRequestの属性等として用意しておく必要があるケースがあります。

例えばStruts+JSPで構築されたWebアプリケーションの場合、JSPをレンダリングするために必要な前処理はStrutsのActionクラスの中で行ないます。

Ymirではページテンプレートのための前処理をより透過的に行なえるよう、サーブレットの処理をサーブレットフィルタでフックする形でJavaオブジェクトのメソッドを呼び出せるようにしています。

具体的には、

リクエストを受け取る
サーブレットがページテンプレートをレンダリングしてレスポンスを作成する
レスポンスを返す
という処理の流れの中で、2.の直前にJavaオブジェクトのメソッドを呼び出せるようになっています。すなわち、処理の流れは

リクエストを受け取る
リクエストされたURIに対応するJavaオブジェクトのメソッドを呼び出す
サーブレットがページテンプレートをレンダリングしてレスポンスを作成する
レスポンスを返す
のようになります。

Ymirがリクエストを受け取ってからレスポンスを返すまでの処理の詳細については、Ymirの処理フローを参照して下さい。

デフォルトのビューテンプレートはZPT

Ymirの中心的な処理は、MVCアーキテクチャで言うところのコントローラの処理です。ビューの処理、すなわちビューテンプレートをレンダリングして最終的なレスポンス(通常はHTML)を作成する処理については、サーブレットとして動作するテンプレートエンジンによって行なわれます。

YmirはStrutsと同様にさまざまなテンプレートエンジンと組み合わせて利用できるようになっていますが、デフォルトのテンプレートエンジンとしてZPT(Zope Page Template)エンジンを内包しています。

ZPTはPythonで書かれたWebアプリケーションサーバZopeで用いられているテンプレート形式です。ZPTの特徴は次のとおりです。

HTMLを壊さない形でレンダリング命令を埋め込めるため、WebアプリケーションサーバにデプロイしなくともWebブラウザでHTMLのデザインを確認できる
命令体系がシンプルである
複数画面のデザインを統一させたり繰り返し利用されるHTML部品を定義したりするためのマクロ機能を持っている
ZPTの詳細については「Zope Page Templates Reference」、「Zope Page Template リファレンス」、「Using Zope Page Templates」、「Page Template を使う」等を参照して下さい。また、Ymirで利用できるZPT記述の詳細については「ZPTテンプレート」を参照して下さい。

コンポーネント管理機構としてSeasar2.4を内蔵

YmirはDI+AOPコンテナであるSeasar2.4を内蔵しています。これによって、Webアプリケーションを構成するJavaオブジェクトのライフサイクル管理を簡単に行なうことができます。

Seasar2.4のHOT deployに対応

YmirはSeasar2.4のHOT deploy機能に対応しており、アプリケーションのソースコードに適用した変更が動作中のアプリケーションに即座に反映されます。これによってインタラクティブなアプリケーション開発が可能になります。

リクエスト駆動の自動生成機能

Ymirでは、ビューテンプレートとしてZPTを使った場合、ZPTテンプレートからさまざまなJavaクラスを自動生成することができます。

この自動生成処理は通常リクエスト駆動で行なわれます。すなわち、リクエストされたURIに対応するZPTテンプレートが新規に作成されたか更新されていた場合にテンプレートが解析され、解析結果に基づいてJavaクラスが生成されます。この機能によって、インクリメンタルかつインタラクティブにアプリケーションを開発することが可能になります。

自動生成機能の詳細については「自動生成機能」を参照して下さい。

2009년 10월 2일 금요일

seasar interceptor (MockInterceptor etc)

AOP(Aspect Oriented Programming)を簡単にいうと元のソースコードに手を加えることなく、透明なサービスを提供する技術といえるのではないかと思います。透明というのは、使っている側からその存在が見えないという意味です。キーとなる概念には次のようなものがあります。

Advice(MethodInterceptor)

プログラム中に挿入されるコードを表します。Interceptorと呼ばれることもあります。

Joinpoint(MethodInvocation)

対象となるクラスとAdviceを結合するポイントを表します。AdviceはJoinpointから引数やメソッドの情報を取得することができます。

Pointcut

どこにJoinpointを設定するのかを定義します。

Aspect

AdviceとPointcutを関連付けます。

S2AOPは、AOP Allianceに準拠しています。それでは、Seasarに最初からついているトレースのためのInterceptorを見てみましょう。

TraceInterceptor

package org.seasar.framework.aop.interceptors;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class TraceInterceptor implements MethodInterceptor {

    public Object invoke(MethodInvocation invocation) throws Throwable {
        StringBuffer buf = new StringBuffer(100);
        buf.append(invocation.getThis().getClass().getName());
        buf.append("#");
        buf.append(invocation.getMethod().getName());
        buf.append("(");
        Object[] args = invocation.getArguments();
        if (args != null && args.length > 0) {
            for (int i = 0; i < args.length; ++i) {
                buf.append(args[i]);
                buf.append(", ");
            }
            buf.setLength(buf.length() - 2);
        }
        buf.append(")");
        System.out.println("BEGIN " + buf);
        try {
            Object ret = invocation.proceed();
            buf.append(" : ");
            buf.append(ret);
            return ret;
        } catch (Throwable t) {
            buf.append(" Throwable:");
            buf.append(t);
            throw t;
        } finally {
            System.out.println("END " + buf);
        }
    }
}

Interceptorを実装するには、MethodInterceptorをimplementsしてinvokeメソッドを実装します。MethodInvocationのgetThis()、getMethod()、getArguments()で対象となるオブジェクト、メソッド、引数を取得できます。proceed()を呼び出すと実際のメソッドが呼び出され実行結果を取得することができます。

それでは、DateクラスにTraceInterceptorを適用します。対象となるメソッドはgetTime()とします。

Pointcut pointcut = new PointcutImpl(new String[]{"getTime"});
Aspect aspect = new AspectImpl(new TraceInterceptor(), pointcut);
AopProxy aopProxy = new AopProxy(Date.class, new Aspect[]{aspect});
Date proxy = (Date) aopProxy.create();
proxy.getTime();

PointcutImplのコンストラクタの引数で対象となるメソッド名を指定(複数可)します。AutoNumberImplのようにインターフェースを実装しているなら、new PointcutImpl(AutoNumberImpl.class)のようにクラスを指定することで、そのクラスが実装しているインターフェースのメソッドをすべて自動的に適用させることもできます。メソッド名には正規表現(JDK1.4のreqex)も使えます。

AopProxyのコンストラクタで、対象となるクラスとAspectの配列を指定します。その後、create()でAspectが適用されたProxyオブジェクトを取得できます。

ThrowsInterceptor

例外処理をCrosscutting concernとして扱えるように、S2ではorg.seasar.framework.aop.interceptors.ThrowsInterceptorが用意されています。使い方は簡単で、ThrowsInterceptorを継承し、Object handleThrowable(Throwable, MethodInvocation)を実装するだけです。ThrowableにはThrowableのサブクラスを指定することができます。例えば、handleThrowable(IOException, MethodInvocation)のようにメソッド定義すると、発生した例外がIOExceptionもしくはIOExceptionのサブクラスの場合に、 呼び出されることになります。handleThrowable()はいくつでも定義することができます。

MockInterceptor

Mockを使ったテストを簡単に行えるように、S2ではorg.seasar.framework.aop.interceptors.MockInterceptorが用意されています。例えば、次のようなインターフェースがあったとします。

public interface Hello {
    public String greeting();
    public String echo(String str);
}

このインターフェースのモックを作成します。モックの仕様として、greetingメソッドが呼び出されたときは、"Hello"を返し、echoメソッドが呼び出されたときは"Hoge"を返すことにします。そのようなモックは次のようにして作成します。

MockInterceptor mi = new MockInterceptor();
mi.setReturnValue("greeting", "Hello");
mi.setReturnValue("echo", "Hoge");
Hello hello = mi.createMock(Hello.class);

MockInterceptor#setReturnValue()の最初の引数にメソッド名、2番目の引数に1番目の引数で指定したメソッドが呼び出されたときに返す引数を指定します。setReturnValue("Hello")のようにメソッド名を省略することもできます。その場合、常に"Hello"がかえってきます。1つのメソッドしか呼び出さないことが分かっている場合に使います。上記のコードをコンポーネント定義で書くと次のようになります。

<component class="Hello">
    <aspect>
	    <component class="org.seasar.framework.aop.interceptors.MockInterceptor">
		    <initMethod name="setReturnValue">
			    <arg>"greeting"</arg>
				<arg>"Hello"</arg>
			</initMethod>
			<initMethod name="setReturnValue">
			    <arg>"echo"</arg>
				<arg>"Hoge"</arg>
			</initMethod>
		</component>
	</aspect>
</component>

また、常に"Hello"を返す場合は次のように定義します。

<component class="Hello">
    <aspect>
	    <component class="org.seasar.framework.aop.interceptors.MockInterceptor">
		    <property name="returnValue">"Hello"</property>
		</component>
	</aspect>
</component>

MockInterceptor#isInvoked(String methodName) : booleanでメソッドが呼び出されたかどうかをチェックできます。 MockInterceptor#getArgs(String methodName) : Object[]で呼び出されたメソッドの引数もチェックできます。これらのチェックを行うには次のようにします。

<component name="helloMockInterceptor" class="org.seasar.framework.aop.interceptors.MockInterceptor">
    <property name="returnValue">"Hello"</property>
</component>
<component class="Hello">
    <aspect>helloMockInterceptor</aspect>
</component>
Hello hello = container.getComponent(Hello.class);
MethodInterceptor mi = container.getComponent("helloMockInterceptor");
hello.echo("Hello");
assertEquals(true, mi.isInvoked("echo"));
assertEquals("Hello", mi.getArgs("echo")[0]);

SyncInterceptor

メソッド呼び出しをAspectを使って同期化できるように、S2ではorg.seasar.framework.aop.interceptors.SyncInterceptorが用意されています。ソースを変更することなく、メソッド呼び出しを同期化できます

2009년 9월 5일 토요일

http://s2container.seasar.org/2.4/ja/setup.html

Doltengを使う場合

Seasar2を最も簡単に試すには、Eclipseを使うのがお勧めです。 次のソフトウェアをインストールしておきます。

  • JDK5.0
  • Eclipse3.2
  • Tomcat5.5
  • Tomcat Launcher3.2.1
  • Dolteng
  • DbLauncher
  • 日本語でプロパティファイルを入力するためのプラグイン (任意)

JDK5.0をこのリンクから指示に従ってインストールします。 既にインストール済みの場合はその必要はありません。 次にJDK1.5がPCのデフォルトのJavaになっているのか確認します。 コマンドプロンプトからjava –versionを実行してください。

D:\USER\workspace2\teeda<java -version
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)
Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode, sharing)

上記のようにバージョンが1.5.0_xxxのように表示されればOKです。 もし、OKでない場合は、環境変数のJAVA_HOMEとPATHを確認してください。

Eclipseのバージョン3.2をこのリンクから指示に従ってインストールします。 既にインストール済みの場合はその必要はありません。 標準のJDKのバージョンが1.5系でない場合、Eclipseの起動引数に

eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_07\bin\javaw.exe"

のように1.5系のjavaw.exeを指定する必要があります。

Tomcat5.5.xをこのリンクから指示に従ってインストールします。 既にインストール済みの場合はその必要はありません。

DoltengとDbLauncherは、Seasarプロジェクトで開発されているEclipse用のPluginです。 Tomcat LauncherはSysdeo社が開発しているPluginですが、Seasarプロジェクトの更新サイトからインストールすることが出来ます。Eclipseのメニューから[Help] -> [Software Updates] -> [Find and Install…]を選択し、 Install/Updateのダイアログを表示させます。 [Search for new features to install]のラジオボタンをチェックして[Next]ボタンをクリックします。 [New Remote site]ボタンをクリックして[Name]を[Seasar Plugin3.2]、 [URL]に[http://eclipse.seasar.org/updates/3.2/]を入力して[OK]をクリックします。 [Finish]ボタンをクリックするとインストールする候補として、 DoltengとDbLauncher、Tomcat Launcherが出てくるので、これらをチェックしてインストールしましょう。 既にインストール済みの場合はその必要はありません。

インストールが終わったら、Tomcat Launcherの設定を行います。 メニューの[Window] -> [Preferences…] -> [Tomcat]を選択してください。 Tomcatバージョンにバージョン5.xを選択し、Tomcatホームにインストールしたディレクトリを指定します。 コンテキスト宣言モードにコンテキストファイルを選び、[OK]をクリックします。

これで、Tomcat Launcherの設定は完了しました。 早速、Tomcatを起動してみましょう。メニューから[Tomcat] -> [Tomcat起動]を選択して、Tomcatを起動します。 エラーなしに無事に起動したのを確認して、一旦、Tomcatを停止させましょう。 メニューから[Tomcat] -> [Tomcat停止]を選択します。

日本語でプロパティファイルを入力するためのプラグインとしてプロパティエディタを このリンクから指示に従ってインストールします (必須ではありません)。 既にインストール済みの場合は、その必要はありません。

すべてのインストールがうまく行ったかどうかを確認するために、Hello Worldと表示する単純な画面を作ってみましょう。 Eclipseのメニューから[File] -> [New] -> [Project]を選びます。 図1のようなダイアログが表示されるので、[Chura Project]を選択します。




[Next]のボタンをクリックしてください。 図2のように、[Project name]に[chura-tutorial]、 [Root Package Name]に[tutorial.chura]と入力し、 JREコンテナーが[Use Default JRE(1.5)]になっていることを確認します。




[Project type]に[Super Agile(Teeda + S2Dao)]を選択し、 [Finish]ボタンをクリックしてください。chura-tutorialのプロジェクトが作成されます。

プロジェクトを右クリックして、[Tomcatプロジェクト] -> [Tomcatのコンテキストを更新]を選択します。 これで開発を始めるための必要な設定は完了しました。 メニューから[Tomcat] -> [Tomcat起動]を選択して、Tomcatを立ち上げます。 HOT deployで開発するので、アプリケーションサーバを起動したままで開発することが可能です。

プロジェクトのツリーを開き、src/main/webapp/viewを右クリックして[New] -> [File]を選びます。

[Enter or select the parent folder]に[chura-tutorial/src/main/webapp/view/hello]と入力し、 [File name]に[hello.html]と入力して、[Finish]ボタンをクリックします。

ファイルが作成されたので、Package Exploreからhello.htmlを右クリックして[Open With] -> [Text Editor]を選びます。 次のようにHTMLを入力してください。

<html>
<body>
Hello World
</body>
</html>

入力が終わったら、hello.html を右クリックして、[Dolteng] -> [View on Server]を選びましょう。 http://localhost:8080/chura-tutorial/view/hello/hello.htmlにアクセスするはずです。 無事にHello Worldと表示されたらプロジェクトの設定はうまくいっています。

Doltengを使わない場合

Doltengを使わないSeasar2の設定方法は次のようになります。

S2-Framework

Seasar2の基本機能(S2Container, S2AOP)を利用する場合には、S2.4.x.zipを解凍してできたseasar2ディレクトリの以下のファイルをCLASSPATHに含める必要があります。

  • lib/s2-framework-2.4.x.jar
  • lib/aopalliance-1.0.jar
  • lib/commons-logging-1.1.jar
  • lib/javassist-3.4.ga.jar
  • lib/ognl-2.6.9-patch-20070624.jar
  • lib/geronimo-j2ee_1.4_spec-1.0.jar (オプション、非J2EE環境で使う場合)
  • lib/portlet-api-1.0.jar (オプション、Portletを使う場合)
  • lib/log4j-1.2.13.jar (オプション、Log4Jを使う場合)
  • resources/log4j.properties (オプション、Log4Jを使う場合)
  • resources/convention.dicon (オプション、「SMART deploy」を使う場合)
  • resources/creator.dicon (オプション、「SMART deploy」を使う場合)
  • resources/customizer.dicon (オプション、「SMART deploy」を使う場合)

S2-Extension

Seasar2の拡張機能(S2JTA, S2DBCP, S2JDBC, S2Unit, S2Tx, S2DataSet)を利用する場合には以下のファイルを追加でCLASSPATHに含める必要があります。

アプリケーションの実行環境により、J2EE関連Jarファイルのいずれが必要になるかが異なります。

S2JTAまたはS2Txを使う場合

アプリケーションの実行環境により、geronimo-jta_1.1_spec-1.0.jarまたはgeronimo-jta_1.1_spec-1.0-tsr.jarが必要になります。

環境geronimo-jta_1.1_spec-1.0.jargeronimo-jta_1.1_spec-1.0-tsr.jar
Servlet対応のWebコンテナ
(Tomcat等)
J2EE1.4対応のAPサーバ-
JavaEE5対応のAPサーバ--
スタンドアロン-

S2TxでEJB互換機能を使う場合

アプリケーションの実行環境により、geronimo-ejb_2.1_spec-1.0.jarが必要になります。

S2-TigerでEJB3を使う場合は必要ありません.

環境geronimo-ejb_2.1_spec-1.0.jar
Servlet対応のWebコンテナ
(Tomcat等)
J2EE1.4対応のAPサーバ-
JavaEE5対応のAPサーバ-
スタンドアロン

S2Container用のプラグインKijimunaも是非ご利用ください。

S2-Tiger

Java5対応機能を使いたい場合は、S2Tiger-2.4.x.zipを解凍してできたs2-tigerディレクトリの以下のファイルをCLASSPATHに含める必要があります。

オプションのJarファイルは、S2JDBCやEJB3、JPAのサポート機能をJavaEE5対応でない環境で使う場合に必要となります。詳細は以下の表を参照してください。

@Resourceを使う場合

アプリケーションの実行環境により、geronimo-annotation_1.0_spec-1.0.jarが必要になります。

環境geronimo-annotation_
1.0_spec-1.0.jar
Servlet2.4対応のWebコンテナ
(Tomcat5.x等)
 (JavaSE6以降は不要)
Servlet2.5対応のWebコンテナ
(Tomcat6等)
-
J2EE1.4対応のAPサーバ (JavaSE6以降は不要)
JavaEE5対応のAPサーバ-
スタンドアロン (JavaSE6以降は不要)

S2JDBC拡張機能またはJPAを使う場合

アプリケーションの実行環境により、gegeronimo-jpa _3.0_spec-1.0.jarが必要になります。

環境geronimo-jpa _3.0_spec-1.0.jar
Servlet対応のWebコンテナ
(Tomcat等)
J2EE1.4対応のAPサーバ
JavaEE5対応のAPサーバ-
スタンドアロン

EJB3を使う場合

アプリケーションの実行環境により、geronimo-ejb_3.0_spec-1.0.jar、geronimo-interceptor_3.0_spec-1.0.jarが必要になります。

環境geronimo-ejb_
3.0_spec-1.0.jar
geronimo-interceptor_
3.0_spec-1.0.jar
Servlet2.4対応のWebコンテナ
(Tomcat5.x等)
Servlet2.5対応のWebコンテナ
(Tomcat6等)
J2EE1.4対応のAPサーバ
JavaEE5対応のAPサーバ--
スタンドアロン

2009년 9월 2일 수요일

Seasar j2ee.dicon transaction type (Required, RequiredNew)

トランザクションの自動制御

S2Txの機能を使い、POJO(普通のJavaのクラス)に対して、 トランザクションの自動管理機能を組み込むことができます。

トランザクション属性

Seasar2が標準で用意しているj2ee.diconには、 トランザクション属性に対応したAdviceが定義されています。 j2ee.diconはs2-extension-x.x.x.jarに含まれているので、 開発者のほうで用意する必要はありません。

これらのAdviceは、aspectタグアスペクトの自動登録SMART deployによるトランザクション設定 を使ってコンポーネントに適用します。

属性コンポーネント名説明
Requiredj2ee.requiredTxトランザクションが開始されていなければ、自動的にトランザクションを開始します。
既にトランザクションが開始されていれば、そのトランザクションを引き継ぎます。
トランザクションを開始した場合でも引き継いだ場合でも、 このインターセプタが適用されたメソッドが例外をスローした場合は、 例外の種類に応じてトランザクションがロールバックされるようにマークします。
デフォルトでは、全ての例外に対してロールバックされるようにマークします。
トランザクションを開始した場合、 このインターセプタが適用されたメソッドが 終了 (正常終了した場合および例外をスローした場合の両方) すると、 開始したトランザクションを完了 (コミットまたはロールバック) します。
トランザクションがロールバックするようにマークされていれば、 トランザクションをロールバックします。 そうでなければ、トランザクションをコミットします。
RequiresNewj2ee.requiresNewTx常に新しいトランザクションを開始させます。
既存のトランザクションが開始されているなら、既存のトランザクションを中断し、 自分自身のトランザクションの終了後、中断したトランザクションを復帰させます。
このインターセプタが適用されたメソッドが例外をスローした場合は、 例外の種類に応じてトランザクションがロールバックされるようにマークします。
デフォルトでは、全ての例外に対してロールバックされるようにマークします。
このインターセプタが適用されたメソッドが終了 (正常終了した場合および例外をスローした場合の両方) すると、 開始したトランザクションを完了 (コミットまたはロールバック) します。
トランザクションがロールバックするようにマークされていれば、トランザクションをロールバックします。 そうでなければ、トランザクションをコミットします。
Mandatoryj2ee.mandatoryTxトランザクションが既に開始されてなければエラーにします。
このインターセプタが適用されたメソッドが例外をスローした場合は、 例外の種類に応じてトランザクションがロールバックされるようにマークします。
デフォルトでは、全ての例外に対してロールバックされるようにマークします。
NotSupportedj2ee.notSupportedTx既存のトランザクションが開始されているなら、既存のトランザクションを中断します。
コンポーネントのメソッドの終了後、中断したトランザクションを復帰させます。

例外発生時の動作

デフォルトでは、コンポーネントが例外をスローした場合はトランザクションをロールバックするようにマークされますが、 発生した例外に応じてトランザクションをロールバックするようにマークするかしないかを指定することもできます。

  • addCommitRule(Class)メソッドを使用すると、 トランザクションをロールバックするようにマークしない例外を指定することができます。
  • addRollbackRule(Class)メソッドを使用すると、 トランザクションをロールバックするようにマークする例外を指定することができます。

コンポーネントから例外がスローされると、 addCommitRule()/addRollbackRule()が設定された順番にマッチするかチェックされます。 スローされた例外がaddCommitRule()/addRollbackRule()で指定された例外またはその派生例外であれば、 その設定に従ってトランザクションをロールバックするようにマークします。 スローされた例外がaddCommitRule()/addRollbackRule()で指定された例外とマッチしない場合、 トランザクションはロールバックするようにマークされます。

EJB互換のAdvice

Seasar2が標準で用意しているejbtx.diconには、 EJBのコンテナ管理トランザクション (CMT) と同じように実行時例外 (java.lang.RuntimeException)、 リモート例外 (java.rmi.RemoteException) とその派生例外が発生した場合はロールバックし、 その他の例外 (java.lang.Exception) が発生した場合はコミットするAdviceが定義されています。 ejbtx.diconはs2-extension-x.x.x.jarに含まれているので、 開発者のほうで用意する必要はありません。

属性コンポーネント名
Requiredejbtx.requiredTx
RequiresNewejbtx.requiresNewTx
Mandatoryejbtx.mandatoryTx
NotSupportedejbtx.notSupportedTx

EJB3互換のAdvice

Seasar2が標準で用意しているejb3tx.diconには、EJB3のコンテナ管理トランザクション (CMT) と同じように、@javax.ejb.ApplicationException アノテーションの rollback 要素で true が指定されたアプリケーション例外 (java.lang.Exception) および、 実行時例外 (java.lang.RuntimeException)、 リモート例外 (java.rmi.RemoteException) とその派生例外が発生した場合はロールバックし、 その他の例外が発生した場合はコミットするAdviceが定義されています。 ejb3tx.diconはs2-tiger-x.x.x.jarに含まれているので、開発者のほうで用意する必要はありません。

属性コンポーネント名
Requiredejb3tx.requiredTx
RequiresNewejb3tx.requiresNewTx
Mandatoryejb3tx.mandatoryTx
NotSupportedejb3tx.notSupportedTx

SMART deployでの利用

SMART deploy環境でトランザクションの自動制御を利用する場合の設定については、 「DI Container」-「トランザクション制御を設定する」を参照してください。