- その他の拡張インタフェースと機能
- ActionSupportを継承してできること
- Actionクラスの呼び出しメソッド名をexecute以外にする
- 値の受け渡しをFormクラスで行う
- 共通プロパティファイルを使用する
- ValueStackを使用する
- 送信されたFormの値を取得
- 値の受け渡し、画面遷移後にメソッドを実行
その他の拡張インタフェースと機能
インタフェース名 | 機能の概要 | ActionSupportで搭載済 |
---|---|---|
ValidationAware | Actionクラスで格納するメッセージ、エラーメッセージ、Validationで検出したエラーをactionMessages、actionErrors、fieldErrorsに格納する | ○ |
Validateable | Validationを有効にする | ○ |
TextProvider | メッセージ定義プロパティからテキストを取得する | ○ |
LocaleProvider | Actionクラスからリクエストのロケールを取得する | ○ |
ParameterAware | サーブレットが受け取ったリクエストパラメータをMap |
- |
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以外にする
・Struts.xmlのmethodに呼び出すメソッド名を定義する
・ActionクラスにStruts.xmlのmethodに紐づくメソッドを実装する
・methodを定義しなければデフォルトでexecuteというメソッド名が呼ばれる
<action name="hello" class="sample.HelloWorldAction" method="show"> <result name="success">/jsp/HelloWorld.jsp</result> </action>
Actionクラス
public String show() { return "success"; }
値の受け渡しをFormクラスで行う
入力側
<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のファイル以外に使用できる方法
カンマ区切りで複数指定可能 <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を使用するのがポイント