ラベル struts の投稿を表示しています。 すべての投稿を表示
ラベル struts の投稿を表示しています。 すべての投稿を表示

2014年12月23日火曜日

SastrutsのInterceptor機能を試してみる

概要

前回のチュートリアルでは主に「Action」と「Form」と「Dto」という機能について学びました
今回は「Interceptor」という機能について学んで行きます
Interceptorは共通処理を実行させるのに適した機能になります

環境

  • Windows7 64bit
  • Eclipse Luna 4.4.1
  • Apache Tomcat 7.0.56(設定はデフォルト)
  • JDK 1.8.0_25

サンプルコード

前回やったチュートリアル用のプロジェクトを使って話を進めていきます

パッケージを作る

tutorial.interceptorというパッケージを作成します
これは必須ではないですが今回はInterceptorクラスをこのパッケージで管理します

Actionクラスの確認

前回使ったtutorial.action.TestAction.javaをそのまま使います
特に拡張はしませんが動作することを確認しておいてください

Interceptorクラスを作成する

先ほど作成したtutorial.interceptorパッケージ配下にTestInterceptor.javaを作成します
TestInterceptor.javaはAbstractInterceptorクラスを継承してください
AbstractInterceptorクラスを継承すると自動的にinvokeメソッドを実装する必要があります

invokeメソッド内で引数のinvocationオブジェクトを使ってinvocation.proceed();をコールします
すると、Actionクラスのindex()メソッドが実行されます
つまりinvocation.proceed();の前後に処理を書くことでAction実行前後で決められた処理を自動的にコールすることができるようになります

package tutorial.interceptor;

import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.interceptors.AbstractInterceptor;

public class TestInterceptor extends AbstractInterceptor {

    /**
     * 識別番号
     */
    private static final long serialVersionUID = 1L;

    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("before");
        // これが実行されるとAction.index()メソッドが実行される
        Object object = invocation.proceed();
        System.out.println("after");
        return null;
    }

}

app.diconに追記する

作成したTestInterceptorを有効にするにはapp.diconに定義を追加する必要があります
<components>...</components>タグ内に以下の1行を追加してください

<component name="testInterceptor" class="tutorial.interceptor.TestInterceptor"/>

customizer.diconに追記する

面倒ですがもう1つのdiconファイルに設定を追記します
先ほどのapp.diconはcomponentを定義してcustomizer.diconでそのcomponentをどこで使うかの定義を記載する感じです
追加する部分は<component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">...</component>内に記載します

<initMethod name="addCustomizer">
    <arg>
        <component class="org.seasar.framework.container.customizer.AspectCustomizer">
            <property name="interceptorName">"testInterceptor"</property>
            <property name="useLookupAdapter">false</property>
            <initMethod name="addClassPattern">
                <arg>"tutorial.action"</arg>
                <arg>"TestAction"</arg>
            </initMethod>
        </component>
    </arg>
</initMethod>

addClassPatternを使うことで特定のパッケージのクラスにのみInterceptorを適用することができます
addClassPatterは内部的にはメソッドとして扱われており<arg>で引数を2つ取ります
1つ目の引数がパッケージ名で2つ目の引数がクラス名になります、この2つの引数は必須になります
クラス名やパッケージにはワイルドカードが使えるほか、複数指定する場合はカンマ区切りで指定してください

動作を確認する

Tomcatを一旦再起動しましょう

http://localhost:8080/sa-struts-tutorial/test/?message=helloにアクセスしてみましょう
ブラウザ上ではメッセージが表示されますがEclipse側のコンソールに「before, after」が表示されていると思います

紹介は以上です
Interceptorのだいたいの動きがわかったかと思います
メインロジックであるActionの前後で実施したい処理がある場合には重宝される機能だと思います

2014年12月5日金曜日

SAStrutsのチュートリアルをやってみた

sastruts

概要

SAStrutsの理解を少しでも深められればと思っていたら公式のチュートリアルがあったのでやってみました
大変なのはコーディングより環境構築かもしれません

環境

  • Windows7 64bit
  • Eclipse Luna 4.4.1
  • Apache Tomcat 7.0.56(設定はデフォルト)
  • JDK 1.8.0_25

設定

環境構築

過去の記事で紹介しているのでそれを参考に構築してみてください
ポイントはプラグインのインストールの部分です
Eclipseのバージョンよってはエラー地獄にハマるかもしれません
一応環境に記載されているバージョンでは問題なくインストールできました
サラーっと流していますがたぶんここが一番大変です。。。

サンプルを動かしてみる

基本はチュートリアルのページを参考に進めていきます

チュートリアルのソースコードのダウンロードとEclipseへのインポート

http://sastruts.seasar.org/download/2011-08-13/sa-struts-tutorial-1.0.4-sp9.zip
をダウンロードします
ダウンロードできたらEclipseに解凍したプロジェクトをインポートします
PackageExplorerから

Import -> Existing Projects into Workspace -> Select root directory -> Projects > Finish

と必要な箇所を入力してインポートします
「Select root directory」はダウンロードして解凍したディレクトリを選択します
インポートが完了したらTomcatを起動します
起動が完了したらプロジェクトをTomcatに認識させます

Properties -> Tomcat -> Tomcatプロジェクトにチェック -> Apply -> OK

認識されるとEclipseのコンソールにデプロイされたログが出ると思います
この状態で http://localhost:8080/sa-struts-tutorial/ にアクセスするとサンプルを確認することができます

インポートが完了してサンプルが動作した状態のPackage Explorerは以下のような感じです
sas_sample_project.png

サンプルの簡単な説明

まず http://localhost:8080/sa-struts-tutorial/ にアクセスするとtutorial.action.IndexAction.javaが実行されます
src/main/resources/convention.diconというファイルがありここにルートパッケージと呼ばれる宣言がされています

<initMethod name="addRootPackageName">
    <arg>"tutorial"</arg>
</initMethod>

tutorialをルートパッケージとしてその配下にあるactionパッケージがアクセスしたURIに合わせて自動的に呼び出されます
例えば/sa-struts-tutorial/addにアクセスするとtutorial.action.AddAction.javaが実行されます

そしてこのActionクラスの中で@Executeアノテーションがついたメソッドが自動で呼ばれます
@Executeがついたメソッドは引数なしの戻り値がStringでなければなりません
この動きがSAStrutsのアクセスしてからレスポンスが返却されるまでの王道的な一連の流れになります

パッケージの命名規則はその他の機能にも紐付いておりdtoやentityパッケージを使うとモデルデータへの自動バインドみないなことをやってくれます
またアノテーションも@ActionFrom@Resourceなどがありこれらを駆使することでコーディング量を大幅に削減することができます

では、一応サンプルは動くようになったのサンプルの話はこれくらいにして実際に自分でサンプルを作ってみたいと思います

簡単な自作アプリを作ってみる

受け取ったデータを表示する簡単なアプリを作ってみます

データ表示するためにDtoという仕組みがあります
DtoはData Transfer Objectの略でサブシステム間でデータを転送するのに使うデザインパターンです(Wikipediaより)
SAStrutsでDtoを使うとレスポンスのデータが簡単に作成できます
(今回の例だとそこまで恩地を受けれている感がありませんが、せっかくなんで使ってみます)

まずDto用のクラスを作成します
Dtoはtutorial.dto配下に作成する必要があります
今回はTestDto.javaというファイルを作成してください
クラスの内容は以下の通りです、メッセージを表示するためのフィールドと値をセットするためのコンストラクタ
それとをメッセージを表示するためのメソッドを用意します

package tutorial.dto;

public class TestDto {

    public String message;

    public TestDto() {
    }

    public TestDto(String message) {
        super();
        this.message = message;
    }

    public String showMessage() {
        return "<h3>" + message + "</h3>";
    }

}

次にリクエストのデータを受け取るためのクラスを準備します
データ受け取るための仕組みはformという仕組みがありこれを利用します
Formはtutorial.form配下に作成する必要があります
FormTest.javaというクラスを作成してください、内容は以下の通りです
リクエストのmessageを受けとるためのフィールドを用意します
あとで説明しますが、このフィールドにリクエストされたデータが勝手にバインドされます

package tutorial.form;

import org.seasar.struts.annotation.Required;

public class TestForm {

    @Required
    public String message;

}

次にこれらのFormとDtoを使うためのActionを作成します
tutorial.action.TestActoin.java を作成してください
内容は以下の通りです

package tutorial.action;

import javax.annotation.Resource;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ResponseUtil;

import tutorial.dto.TestDto;
import tutorial.form.TestForm;

public class TestAction {

    @ActionForm
    @Resource
    protected TestForm testForm;

    public TestDto testDto;

    @Execute(validator=false)
    public String index() {
        TestDto dto = new TestDto(testForm.message);
        ResponseUtil.write("message is " + dto.showMessage());
        return null;
    }

}

Fromは@ActionFrom@Resourceアノテーションが必要です
レスポンス用のTestDtoのオブジェクトをフィールドとして管理します
そしてアクセスが来た時に処理を開始するindexメソッドを@Executeアノテーション付きで作成します

ここでポイントなのがTestFormのオブジェクトで
Servletのrequestオブジェクトを操作していないのにTestFormのフィールドにリクエストされた値をバインドしてくれます
これがSAStrutsを使うと嬉しい点でリクエストのパラメータ名とFormクラスのフィールド名を紐付けて勝手にオブジェクトを作成してくれます
なのでソースコード中でいきなりtestForm.messageとやっても怒られないのです

実行してみる

Tomcatを再起動してもいいですが、SAStrutsはソースコードを書き換えるとそのままデプロイしてくれます
http://localhost:8080/sa-struts-tutorial/test?message=hello
にアクセスしてみましょう

message is <h3>aaa</h3>

と表示されると思います、HTMLがうまく解釈されていません
TestAction.javaのwriteしている部分を以下に修正してください

ResponseUtil.write("message is " + dto.showMessage(), "text/html");

再度URLにアクセスするとうまくHTMLが解釈されていると思います
?message=hogehogeの部分を変更するとブラウザに表示されるメッセージも変わると思います

だいぶ簡単なアプリでしたが紹介は以上です

最近はPlayとかSpring.ioとかもうちょっとモダンなフレームワークがあり同じようなことができます
SAStruts自体はまだStruts1を使っているようです
Struts自体はまだメンテされていて2.3まで進んでいるようです
触ってみて感じましたが構築が大変なのと仕組みも複雑でブラックボックスな部分が多い印象です(OSSなんでソース読めって感じですが。。)
あとはドキュメントがもう少し充実していると嬉しいかなと思いました
ググればある程度情報は出ましたが昔の記事が多かったかな

Tips

  • src/main/webapp/WEB-INF/classes/log4j.properties のDEBUGをINFOにするとEclipseのコンソールに表示されていたログが表示されなくなります

2014年6月5日木曜日

EclipseでSAStrutsの開発環境構築をしてみた

■環境
Windows7 64bit
Eclipse 4.3.1 Kepler
SAStruts 1.0.4 sp9
Apache Tomcat 6.0.20

■Doltenプラグインのインストール
まずEclipseのプラグインをインストールします
これをインストールしなくても環境構築できますが入れたほうが簡単なのでインストールします

Eclipse MarketPlaceでは公開されていないのでプラグインの公開サイトを追加してインストールします

Help -> Install New Software
を開き
  • http://eclipse.seasar.org/updates/3.2
  • http://eclipse.seasar.org/updates/3.3
を追加します
追加するとURLに存在するプラグイン一覧が下ペインに表示されると思いますので

3.2では
  • DbLauncher
  • Dolteng
  • Sysdeo/SQLI Tomcat Launcher
3.3では
  • Dolteng
  • SAStrutsPlugin
のチェックボックスをONにしてインストールします(以下は3.3にあるプラグインをインストールする場合のウィザード)



requires 'bundle org.eclipse.jst.jsp.ui 0.0.0' but it could not be found
となってインストールエラーとなる場合には

Help -> Install New Software
を開き
  • Kepler - http://download.eclipse.org/releases/kepler
を選択し「Web, XML, Java EE and OSGi Enterprise Development」を選択しインストールします
結構量が多いのでインストールには時間がかかります

■SAStrutsサンプルプロジェクトの作成
プラグインをインストールできたらサンプルプロジェクトを作成してみます

  1. Package Explorerで右クリック -> New -> Other を選択
  2. プロジェクト作成ウィザードで Dolteng -> Dolteng Project を選択しNextをクリック
  3. プロジェクトに必要な情報を入力(プロジェクト名、パッケージ名は必須です、PresentationにはSAStrutsを選択します)
  4. 入力が完了したらNextをクリック
  5. 各種ファイルのパスを設定をっ実施(基本はデフォルトのままでOKです)
  6. 確認が完了したらFinishをクリック

これでプロジェクトの作成が完了です
次はこのサンプルプロジェクトを動作させてみます

■サンプルプロジェクトを動作させる
Tomcatで動作させるので事前にeclipse上のTomcatの設定を済ませてください
またTomcatはバージョン6系を使用しました(7だとSysdeo/SQLI Tomcat Launcherがうまく動作しませんでした)
eclipse上のTomcatの設定が完了したらプロジェクトとTomcatを連携します

  • プロジェクトを右クリック -> Tomcatプロジェクト -> コンテキスト定義を更新
をするとeclipseで開発したソースがリアルタイムでtomcatにデプロイされて開発しながらブラウザで確認できるようになります
コンテキストを更新したらツールバーにあるTomcatのアイコンからTomcatを起動してください

Tomcatの起動が完了したら、src/main/java 配下の
  1. com.sample.sas.action.IndexAction.java を右クリックし
  2. SAStruts -> View on Server をクリック
すると、eclipseに内蔵されているブラウザでサンプルの動作を確認できるかと思います
※この段階でTomcatが起動していなかったり、Sysdeo/SQLI Tomcat LauncherでeclipseとTomcatの連携ができていないと「このページは表示できません」という404エラーが画面になります

■参考サイト

この開発環境構築が大変なのはいかにもJavaという感じですね
せっかく環境構築できたので次はちょっとサンプルでも動かしてみたいです

P.S 20141027
以下のエラーが出る場合は「Web, XML, Java EE and OSGi Enterprise Development」を先にインストールしてから各種Sastruts用のプラグインをインストールしてください
Cannot complete the install because one or more required items could not be found.
Software currently installed: SAStrutsPlugin 0.0.14 (org.seasar.sastrutsplugin.feature.feature.group 0.0.14)
Missing requirement: SAStrutsPlugin 0.0.14 (org.seasar.sastrutsplugin 0.0.14) requires 'bundle org.eclipse.jst.jsp.ui 0.0.0' but it could not be found
Cannot satisfy dependency:
From: SAStrutsPlugin 0.0.14 (org.seasar.sastrutsplugin.feature.feature.group 0.0.14)
To: org.seasar.sastrutsplugin [0.0.14]
Web, XML, Java EE and OSGi Enterprise Developmentのインストール方法は
Help -> Install New Software -> Work with -> Luna
を選択すればその下の一覧に表示されるのでチェックボックスをONにしてインストールしてください
Lunaの部分は各Eclipseのバージョンごとに提供されているリポジトリ名なので適宜変更してください