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のコンソールに表示されていたログが表示されなくなります

0 件のコメント:

コメントを投稿