@いう間にWebアプリを作れる「Struts 2」入門


【特集】Strutsは“2”を使えば、サルでも幸せに

ヤスダネットワーク
関川 晶子
2009/1/8


4種類のResultアノテーションを使い分ける

 ここからは、Webアプリケーション開発においてよく使われるであろう4種類の@Resultについて説明していきます。以下のような画面(index.jsp)から、4つの画面に遷移するサンプルを解説しながら、Struts 2の強力さを見ていきます。

図8 サンプルのスタート画面
図8 サンプルのスタート画面

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
  <s:property value="hello"/>
  <s:form theme="simple">
    <s:submit method="hello1" value="こんにちは 1"/>
    <br class="clear">
    <s:submit method="hello2" value="こんにちは 2"/>
    <br class="clear">
    <s:submit method="recipe" value="今日のレシピ"/>
    <br class="clear">
    <s:submit method="download" value="今日のレシピのダウンロード"/>
    <br class="clear">
  </s:form>
</body>
</html>

【1】表示するページをファイル名で指定


@Result(name = "hello1", value = "index.jsp")

 最初の@Resultは、表示するページをファイル名で指定するものです。nameとvalue属性だけを設定すると、指定のページでメソッドの実行結果を表示します。「こんにちは1」を押すと、「index.jsp」に「こんにちは!」を表示させるメソッド「hello1」を実行しています。

図8 「こんにちは1」ボタンの実行結果
図8 「こんにちは1」ボタンの実行結果

 以下のコードはindexAction.javaから一部抜粋したものです。

package test;

//…【省略】…

@Results({
    @Result(name = "hello1", value = "index.jsp"),

    //…【省略】…

    public class indexAction {

        public String hello;

        //…【省略】…

        public String hello1() {
            hello = "こんにちは!";
            return "hello1";
        }

        //…【省略】…
    }

【2】ほかのページにリダイレクトしたい場合


@Result(name = "hello2", value = "jump.jsp",
    type = ServletRedirectResult.class)

 単純に、ほかのページにリダイレクトしたい場合は、typeにServletRedirectResult.classを指定します。「こんにちは2」を押すと、jump.jspに遷移します。

図9 「こんにちは2」ボタンの実行結果
図9 「こんにちは2」ボタンの実行結果

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
  こんにちは。<br>
  <s:iterator value="%{data}">
  <s:property/><br>
  </s:iterator>
</body>
</html>

 以下のコードはindexAction.javaから一部抜粋したものです。

package test;

@Results({

    //…【省略】…

    @Result(name = "hello2", value = "jump.jsp", type =         ServletRedirectResult.class),

    //…【省略】…

    public class indexAction {

        //…【省略】…

        public String hello2() {
            return "hello2";
        }

        //…【省略】…
    }

【3】リダイレクトした後、さらにActionクラスで処理を行う場合


@Result(name = "recipe", value = "jump!recepi",
    type = ServletActionRedirectResult.class)

 ちょっと複雑に、リダイレクトした後、さらにActionクラスで処理を行う場合はtypeに「ServletActionRedirectResult.class」を指定します。「今日のレシピ」を押すと、jumpAction.java内のrecepiメソッドを実行し、その結果を表示します。

図10 「今日のレシピ」ボタンの実行結果
図10 「今日のレシピ」ボタンの実行結果

package test;
import org.apache.struts2.config.Result;

@Result(name = "success", value = "jump.jsp")
public class jumpAction {
    public String[] data;

    public String recipe(){
        data = new String [7];
        data[0]="今日のレシピ";
        data[1]="強力粉 180cc";
        data[2]="薄力粉 大さじ1";
        data[3]="砂糖 大さじ1";
        data[4]="塩 適量";
        data[5]="ドライイースト";
        data[6]="ぬるま湯 80cc";
        return "success";
    }
}

 以下のコードはindexAction.javaから一部抜粋したものです。

@Results({

    //…【省略】…

    @Result(name = "recipe", value = "jump!recipe", type =         ServletActionRedirectResult.class),

    //…【省略】…

    public class indexAction {

        //…【省略】…

        public String recipe() {
        return "recipe";
    }

【4】ファイルをダウンロードさせたい場合


@Result(name = "download", value = "inputStream",
    params = {
        "contentType",
        "text/plain",
        "contentLength",
        "${ contentLength }",
        "contentDisposition",
        "attachment; filename=recepi.txt" },
    type = StreamResult.class)

 ページ遷移以外にも、ファイルをダウンロードさせたい場合もあります。そのようなときは、typeに「StreamResult.class」を指定すると、設定したパラメータに従ってストリームをダウンロードできます。

 Value属性に設定する値は、ストリームを保管しているフィールド名を指定します。Getterが定義されていれば、getterを参照してくれるので、ここではvalue値に「inputStream」を設定し、getInputStreamを定義しています。そのほかのパラメータは、contentTypeでファイル形式、contentDispositionでダウンロードするときのファイル名を指定しています。

 contentLengthの指定は、ちょっと変則的ですがOGNL式を利用して、indexActionのcontentLengthフィールドの中身を参照するように指定しています。

コラム 「式言語OGNLとは?」

OGNL(Object Graph Navigation Language)は、Javaオブジェクトのフィールドを取得/設定するための式言語です。直接メソッドを呼び出すこともできることが特徴です。

図11 「今日のレシピのダウンロード」ボタンの実行結果
図11 「今日のレシピのダウンロード」ボタンの実行結果

 以下のコードはindexAction.javaから一部抜粋したものです。

package test;

//…【省略】…

@Results({

    //…【省略】…

    @Result(name = "download", value = "inputStream",
        params = {
            "contentType",
            "text/plain",
            "contentLength",
            "${ contentLength }",
            "contentDisposition",
            "attachment; filename=recepi.txt" },
        type = StreamResult.class) })
    public class indexAction {

        //…【省略】…

        public int contentLength;
        public InputStream inputStream;

        //…【省略】…

        public String download() throws Exception{

            String[] data = {"今日のレシピ","強力粉 180cc",
                "薄力粉 大さじ1","砂糖 大さじ1","塩 適量",
                "ドライイースト","ぬるま湯 80cc"};
            String txt = "";

            for (int i=0; i<data.length; i++){
                txt = txt+data[i] + System.getProperty(
                    "line.separator");
            }
            //dataからbyte配列に変換
            byte buffer[] = txt.getBytes();
            InputStream inputStream
                = new ByteArrayInputStream(buffer);
            this.inputStream = inputStream;
            this.contentLength = buffer.length;

            return "download";
        }
    }

@Resultサンプルの動き

 このサンプルの@Resultの挙動を図示すると、以下のようになります。

図12 @Resultサンプルの動き
図12 @Resultサンプルの動き

潜在的な可能性を秘めたStruts 2

 Struts 2は、まだまだ日本語の資料が乏しい状態ですが、インストール手順もシンプルでさまざまなほかのフレームワークとの連携も積極的に行われていて、潜在的な可能性を秘めています。ぜひ皆さんもStruts 2で幸せな開発を体験してみてください。

 今回のサンプルはこちらからダウンロードできます。

※編集部注:URLは小文字の方が見やすいため、本稿のクラス名は先頭が小文字で表記していますが、Javaの文法上クラス名は先頭が大文字でないと警告メッセージが出ますので、ご注意ください。

@IT関連記事


Strutsを使うWebアプリケーション構築術
ステップ・バイ・ステップの解説で誰にも分かるStruts講座。効率の高いWebアプリケーション開発をマスターしよう
Webアプリの常識をJSPとStrutsで身につける
JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です。初心者・中堅・ベテランも大歓迎!
Java初心者が超俊敏にWebアプリを作る方法
Eclipseプラグイン「Dolteng」のScaffoldという自動生成機能やSeasar 2.4のHOT deploy機能を利用して、DBの参照・更新・削除ができるSAStrutsのWebアプリを作ります。Java初心者だけでなくStrutsに慣れた開発者も必見です
オープンソースTERASOLUNAで作るWebアプリ
WebアプリをStrutsで構築する際の種々の問題点。そして、それを解決するSpring、iBATIS連携のオープンソースフレームワークTERASOLUNAのさまざまな機能を紹介していく


1-2-3

 INDEX
  Page1
  Strutsに“2”が存在することを知ってましたか?
コラム 「サルが知りたいStruts 2の疑問」
Struts 2をインストールしてみよう
  Page2
  @(あっと)いう間に「こんにちは! Struts 2」
「こんにちは! Struts 2」の動作原理
Page3
  4種類のResultアノテーションを使い分ける
コラム 「式言語OGNLとは?」
潜在的な可能性を秘めたStruts 2


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間