【Struts2】テクニック

その他の拡張インタフェースと機能

インタフェース名 機能の概要 ActionSupportで搭載済
ValidationAware Actionクラスで格納するメッセージ、エラーメッセージ、Validationで検出したエラーをactionMessages、actionErrors、fieldErrorsに格納する
Validateable Validationを有効にする
TextProvider メッセージ定義プロパティからテキストを取得する
LocaleProvider Actionクラスからリクエストのロケールを取得する
ParameterAware サーブレットが受け取ったリクエストパラメータをMapで取得する。Actionクラス内でリクエストパラメータの内容を増減させるために扱う特殊な機能 -
PrincipalAware 認証情報を扱うPrincipalを、PrincipalProxyの型で取得する -
ServletRequestAware HttpServletRequestオブジェクトを取得する。濫用に注意 -
ServletResponseAware HttpServletResponseオブジェクトを取得する。あらたなレスポンス形式で出力する場合に扱う -
RequestAware リクエストスコープをMapで取得する -
SessionAware セッションスコープをMapで取得する -
ApplicationAware アプリケーションスコープをMapで取得する -

ActionSupportを継承してできること

public class HelloWorldAction extends ActionSupport {
定数(SUCCESS等)が使える

使える定数↓
SUCCESS
NONE
ERROR
INPUT
LOGIN

public String execute() {
	return SUCCESS;
}
バリデータが使える

バリデータチェックに引っかかった場合、inputが戻り値となるため
struts.xmlにinputのresultを記載しておくこと

        <action name="hello" class="sample.HelloWorldAction">
            <result name="success">/jsp/HelloWorld.jsp</result>
            <result name="input">/jsp/index.jsp</result>
        </action>

【個別に設定する方法】
Actionクラスにvalidateメソッドを実装する。

public void validate() {
	if (form.getName().isEmpty()) {
		addActionError("名前を入力してください");
	}
}

jspに下記を記載するとメッセージが表示される

<s:actionerror />

アノテーションで行う方法1】
Actionクラスのgetter,setterにアノテーションを記載する

@RequiredStringValidator(message="名前を入力してください")
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}

jspに下記を記載するとメッセージが表示される

一覧で出す方法
<s:fielderror />
個別に出す方法
<s:fielderror><s:param value="%{'name'}" /></s:fielderror>

アノテーションで行う方法2】
executeの前に記載する

public class HelloWorldAction extends ActionSupport {
    @Validations(requiredStrings = {
            @RequiredStringValidator(fieldName = "name", message = "名前が入力されていません"),
            @RequiredStringValidator(fieldName = "age", message = "年齢が入力されていません")
        })
	public String execute() {
		return SUCCESS;
	}

jspに下記を記載するとメッセージが表示される

一覧で出す方法
<s:fielderror />
個別に出す方法
<s:fielderror><s:param value="%{'name'}" /></s:fielderror>

【validation.xmlで行う方法】
"actionクラス名"+"-validation.xml"でファイルを作成する
message keyはプロパティファイルからメッセージを取得する方法

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//Apache Struts//XWork Validator 1.0.3//EN"
  "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
  <field name="name" >
    <field-validator type="stringlength">
       <param name="minLength">3</param>
       <param name="maxLength">10</param>
       <param name="trim">true</param>
       <message key="errors.name" />
    </field-validator>
  </field>
</validators>

【エラーメッセージをプロパティファイルで管理する方法】
"actionクラス名"+".properties"でファイルを作成する
※上記ファイル名でなくても可能な方法がある>共通プロパティファイルを使用するに記載

errors.name=名前を入力してください

Actionクラスの呼び出しメソッド名をexecute以外にする

point

Struts.xmlのmethodに呼び出すメソッド名を定義する

・ActionクラスにStruts.xmlのmethodに紐づくメソッドを実装する

・methodを定義しなければデフォルトでexecuteというメソッド名が呼ばれる

Struts.xml

        <action name="hello" class="sample.HelloWorldAction" method="show">
            <result name="success">/jsp/HelloWorld.jsp</result>
        </action>

Actionクラス

	public String show() {
		return "success";
	}

値の受け渡しをFormクラスで行う

point

jspのnameはFormクラス名.プロパティ名にする

・ActionクラスでFormクラスのGetter、Setterを定義する

入力側

<s:form action="hello">
     名前:<s:textfield name="HelloForm.name" /><br>
     年齢:<s:textfield name="HelloForm.age" />
     <s:submit value="確定" />
</s:form>

Formクラス

public class HelloForm {
	private String name;
	private String age;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
}

Actionクラス

public class HelloWorldAction {

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

	private HelloForm form = new HelloForm();

	public HelloForm getHelloForm() {
		return form;
	}

	public void setPersonBean(HelloForm form){
		this.form = form;
	}
}

出力側

<s:form action="hello">
     名前:<s:textfield name="HelloForm.name" /><br>
     年齢:<s:textfield name="HelloForm.age" />
     <s:submit value="確定" />
</s:form>

共通プロパティファイルを使用する

actionクラス名+propertiesのファイル以外に使用できる方法

1.struts.xmlに下記を記載する

カンマ区切りで複数指定可能
<constant name="struts.custom.i18n.resources" value="config,message"/>

2.プロパティファイルを作成する
名前はstruts.xmlに記載した名前
※名前にjpやenをつけることで国際化に対応できる。プログラムが自動で判別して切り替えてくれる
例)message_ja.properties

errors.name=名前を入力してください

ValueStackを使用する

public String execute() {
	// ValueStack取得方法1
	ActionContext actionCtx= ActionContext.getContext();
	ValueStack valueStack = actionCtx.getValueStack();

	// ValueStack取得方法2
	HttpServletRequest request = ServletActionContext.getRequest();
	ValueStack valueStack= ServletActionContext.getValueStack(request);

	// 値をセット/変更
	valueStack.set("test","テストです");

	// 値を取得
	Object value = valueStack.findValue("test");
	String value_str = valueStack.findString("test");
}

送信されたFormの値を取得

public String execute() {
	ActionContext actionCtx= ActionContext.getContext();
	Map<String, Parameter> parameters = actionCtx.getParameters();

	for (Entry<String, Parameter> entity : parameters.entrySet()) {
		System.out.println("リクエストパラメータ:" + entity.getKey()+" 値:"+ entity.getValue());
	}
}

値の受け渡し、画面遷移後にメソッドを実行

chainを使用するのがポイント