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
アノテーションを使用すると細かな設定が可能になります。
しかし、大勢で開発するとアノテーションの記述をし忘れる人も出たり、また、Actionクラスを見なければ設定値が分かりません。
もし不具合があって調べるときにActionクラスを探し出してチェックしなければなりません。
アノテーションを付け忘れているクラスを検索するツールがあるかどうかも分かりません。
アノテーションでstruts.xmlの設定をする場合は、よく考えて使いましょう。
Created Date: 2012/03/05