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


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

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


@(あっと)いう間に「こんにちは! Struts 2」

 動作を確認するために、以下のようなアプリケーションを作ってみましょう。

図4 「こんにちは! Struts 2」サンプル
図4 「こんにちは! Struts 2」サンプル
  1. index.actionを表示する
  2. サブミットボタンを選択すると、index-hello.jspの内容を表示する

文字コードはUTF-8

 文字コードによるトラブルに出会わないように、作成するファイルの文字コードはすべて「UTF-8」に統一します。Eclipseの設定をしていない場合は以下の手順で、ファイルの文字コードを設定してください。

 [メニュー]の[プロジェクト]→[プロパティー]を開き、[リソース]のなかにある[テキスト・ファイル・エンコード]の[その他]で「UTF-8」を選択します。

Struts 2アプリの作り方

 Struts 2では、1画面作るのに必要なファイルは、たったの2つです。「index.jsp」「indexAction.java」を作成します。[メニュー]の[ファイル]→[新規]→[その他]よりJSPを選択し、WebContentフォルダに、index.jspを作成します。

※編集部注:URLは小文字の方が見やすいため、本稿のクラス名は先頭が小文字で表記していますが、Javaの文法上クラス名は先頭が大文字でないと警告メッセージが出ますので、ご注意ください。
<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
  <s:form>
    こんにちは。
    <s:submit method="hello" value="こちらこそこんにちは"/>
  </s:form>
</body>
</html>

 JSPファイルには以下のコードを追加して、Struts 2のカスタムタグを使えるようにしています。

<%@ taglib prefix="s" uri="/struts-tags" %>

 カスタムタグを使わないでもStruts 2の開発は可能ですが、ほかのカスタムタグと違い、Struts 2のカスタムタグはシンプルで使い勝手が良いので、すぐに習得でいるでしょう。ここでは、FORMタグの替わりに使う<s:form>タグと、サブミットボタンを表す<s:submit>タグを利用します。<s:submit>タグでは、実行するActionクラスのメソッドを、method属性で指定しています。

 次は、ActionクラスindexAction.javaを作ります。Actionクラスとは、JSPに記述されている入力フォームの値を設定/取得したり、データベースへの操作を行ったりする役割を持ったクラスのことです。testパッケージを追加し、indexAction.javaを作成します。

import com.opensymphony.xwork2.ActionSupport;

public class indexAction extends ActionSupport {

    public String execute() throws Exception {
        return "success";
    }

    public String message;
    
    public String hello() throws Exception {
        message = “いえいえこちらこそこんにちは。”;
        return "hello";
    }
}

 Actionクラスは、POJOで書くこともできますが、実際にはリクエストパラメータやセッションの取得、バリデーション機能の有効化のためにActionSupportクラスを継承する形になります。

 最後に、サブミットボタンを押されたときに表示されるJSPページindex-hello.jspを作成します。

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
  <s:property value=”%{message}”/>
</body>
</html>

 このJSPは、Actionクラスから渡されたメッセージを表示するだけの簡単なファイルです。

動かしてみよう

 サーバを起動し、「http://localhost:8080/sample/index.action」にアクセスします。以下のような画面が出れば、成功です(拡張子が.actionであることに注意しましょう)。

図5 「こんにちは! Struts 2」サンプルの実行結果
図5 「こんにちは! Struts 2」サンプルの実行結果

「こんにちは! Struts 2」の動作原理

 このサンプルでは、indexActionクラスは以下のように動作します。

図6 index.actionにアクセスしたときの動作
図6 index.actionにアクセスしたときの動作

 ユーザーからindex.actionの表示要求を受けて、Struts 2はindexActionのインスタンスを生成します。特に実行するメソッドの指定がない場合は、executeメソッドを実行することになっているので、executeメソッドを実行し、結果「success」を得ます。

 すると、後述のStruts 2の機能により、結果を表示するページをindex-success.jsp→index.jspの順で探します。index-success.jspは今回作成していないので、次の候補index.jspを結果として表示します。

図7 サブミットボタンを押したときの動作
図7 サブミットボタンを押したときの動作

 次に、ユーザーがサブミットボタンを選択して、helloメソッドを呼び出すと、Strus 2の内部では、再度indexActionのインスタンスを生成し、helloメソッドを実行します。結果として「hello」を得るので、先ほどと同様、index-hello.jsp→index.jspの順で表示するページを探します。今回は、index-hello.jspが存在するので、index-hello.jspの内容が表示されます。

注意

 Struts 2では、リクエストがあるたびにActionクラスが再生成されることを、しっかり覚えておきましょう。再生成されるということは、図6で行ったActionクラス内のフィールドへの変更は、(何も対処しなければ)初期化されているのです。

Struts 2の新機能「CodeBehind」による画面遷移のルール

 この、一見不思議な画面遷移のルールは、「コードビハインド(CodeBehind)」と呼ばれるStruts 2の新しい機能です。この機能によって、CodeBehindのシンプルなルールを覚えるだけで画面遷移の設定ファイルを書く必要がなくなります。

 1つのActionクラスに多くの遷移先が存在する場合、それを設定ファイルに記述するのも、メンテナンスするのもわずらわしくなることがあります。複数の遷移先がある場合は、以下のようなルールに沿って遷移先を探してくれます。

  1. 「/」+【名前空間】+「/」+【Actionクラス名からActionを除いたもの】+「-」+【メソッド実行時に返される文字列】+「.jsp」、または「.vm」、または「.ftl」
  2. 「/」+【名前空間】+「/」+【Actionクラス名からActionを除いたもの】+「.jsp」、または「.vm」、または「.ftl」

 サンプルを例にすると、上記の【】で指定した値は、以下になります。

表 サンプルの場合
【名前空間】 test
【Actionクラス名からActionを除いたもの】 index
【メソッド実行時に返される文字列】 success

 よって、サンプルでは以下のような順番でファイルを検索します。

  1. /test/index-success.jsp
  2. /test/index.jsp
  3. /test/index-success.vm
  4. /test/index.vm
  5. /test/index-success.ftl
  6. /test/index.ftl

 遷移先は、明示的に指定したい場合は後述するResultアノテーションを利用することでも制御できます。

 なんと、一番最初のサンプルで、画面遷移を伴うWebアプリケーションを作る必要な機能を説明できてしまいました。簡単な遷移であれば、設定ファイルも何もいりません。

 しかし、遷移先を自分で指定したい場合や、JSP以外のコンテンツに遷移したい場合もあります。このようなときは、Resultアノテーション(以下、@Result)を使って、設定ファイルのわずらわしさから解放されます。次ページでは、@Resultを使ったサンプルについて説明します。

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 記事ランキング

本日 月間