07.Actionクラスについて

概要

ここではActionクラスについてみていきます。

Actionクラス概要

Actionクラスの役割は、リクエストパラメタの受け取りと、画面処理です。

リクエストパラメタはActionクラスのプロパティとして保持します。

具体的には、getter/setterを用意するとStruts2が自動的にパラメタを設定してくれます。

画面処理はActionクラスのpublicメソッドを用意しておけば、Struts2の設定ファイルや、リクエストパラメタで指定されたmethodが

自動的に実行されます。

使用サンプル

package test.actions;

import javax.annotation.Resource;

import org.apache.struts2.interceptor.validation.SkipValidation;

import org.springframework.beans.factory.config.BeanDefinition;

import org.springframework.context.annotation.Scope;

import test.business.UserService;

import test.models.User;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionSupport;

/**

* ユーザ編集画面処理。

* Springのスコープはプロトタイプにすること。

*/

@Scope(BeanDefinition.SCOPE_PROTOTYPE)

public class UserEditAction extends ActionSupport {

//SpringによるDIで設定するプロパティ

@Resource

private UserService userService;

//画面情報の保持---------------------------------------------

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

//Actionの処理------------------------------------------------

//入力画面(すぐ下のアノテーションは、妥当性チェックをさせないためのものです)

@SkipValidation

public String doInput() throws Exception {

//値を取得する。

User user = this.userService.getUser();

this.user = user;

//結果コードを返す

return Action.INPUT;

}

//完了画面

public String doFinish() throws Exception {

userService.updateUser(this.user);

//結果コードを返す

return "finish";

}

}

主なコードの内容は上記のようになります。

たいていの場合はこのような記述で十分かと思います。

【Actionクラスの説明】

リクエストパラメタの受け取り:

リクエストパラメタはパラメタ名と同名のsetterを用意しておけばStruts2が自動で設定してくれます。

・パラメタ名が階層の場合

パラメタ名が"user.name"のように階層構造でも、getUser().setName("太郎")のように設定してくれます。

また、階層構造の場合、例えばgetUser()がnullのとき、自動でnew User()を実行してオブジェクトを生成します。

・配列、Listの場合

パラメタ名が"users[2].name" のような配列の場合も自動でオブジェクトを生成してくれます。

もちろん、setter/getterの型が配列やListになっていなければなりません。

画面処理:

画面処理は、publicのメソッドが行います。

上記のように複数用意することもできます。

どのメソッドを実行するかは、Struts2のJSP、s:submitタグのmethod属性で指定します。

・returnで指定するもの

Actionの処理メソッドのreturnは、処理結果コードを返します。

処理結果コードはStringで、struts.xmlで処理結果コードとViewとのマッピングを定義します。

結局、処理結果コードとマッピングされたJSPやFreeMarkerなどが実行されることになります。

セッションやリクエストオブジェクトの取得:

HttpServletRequestなどを受け取ったりしたい場合はどのようにしたらよいでしょう?

これについては、以下で見ていくことにします。

HttpServletRequestを受け取る方法

public class UserEditAction extends ActionSupport

implements ServletRequestAware {

private HttpServletRequest req;

@Override

public void setServletRequest(HttpServletRequest req) {

this.req = req;

}

上記のようにServletRequestAware をimplementsします。

Struts2はこのinterfaceをみつけると、上記setterに自動でリクエストオブジェクトを設定してくれます。

Struts2の基本的な考え方として、interfaceをimplementsすると自動でオブジェクトを設定してくれます。

セッションオブジェクト等も同じやり方をします。(参考: ServletResponseAware、SessionAware)

アノテーションでURLマッピングなどをするサンプル

Struts2では、struts.xmlで設定する内容の一部をアノテーションで記述することもできます。

以下はStrus2のHPに記述しているサンプルです。

【アノテーションの記述サンプル】

package com.example.actions; import com.opensymphony.xwork2.ActionSupport; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Actions; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; public class HelloWorld extends ActionSupport { @Action(value="/different/url", results={@Result(name="success", type="httpheader", params={"status", "500", "errorMessage", "Internal Error"})} ) public String execute() { return SUCCESS; } @Action("/another/url") public String doSomething() { return SUCCESS; } }

上記のように@ActionというアノテーションでURLのマッピングや、resultの設定ができます。

struts.xmlのactionタグの設定内容と同じです。

Interceptorの設定もできます。

また、上記では画面処理メソッドにアノテーションをつけていますが、クラス自体にもつけられるようです。

参考: ⇒http://struts.apache.org/2.x/docs/convention-plugin.html

06.struts.xmlについて

アノテーションを使用すると細かな設定が可能になります。

しかし、大勢で開発するとアノテーションの記述をし忘れる人も出たり、また、Actionクラスを見なければ設定値が分かりません。

もし不具合があって調べるときにActionクラスを探し出してチェックしなければなりません。

アノテーションを付け忘れているクラスを検索するツールがあるかどうかも分かりません。

アノテーションでstruts.xmlの設定をする場合は、よく考えて使いましょう。

Created Date: 2012/03/05