※以下のサンプルは, Struts2.2.3.1で検証しております
Struts2では, Action が普通のクラスで実装できますが, Struts2では便利な関数などをそろえている ActionSupport というクラスがあります。それを使って簡単に様々な機能を実装することができます
Topic
• ActionSupport をextends してActionクラスをつくる
• Struts2のタグを使う
• validate()を実装して, 入力項目を検証する
• propertiesファイルを使って, エラーメッセージを表示する
まず, ActionSupportクラスですが, これは以下のinterface を実装しているそうです
- Action
- Validatable
- ValidationAware
- TextProvider
- LocaleProvider
- Serializable
このActionSupport をextends しても execute()で Actionを実装することに変わりありません。
public class LoginAction extends ActionSupport
早速サンプルを見ていきましょう。
今回のプロジェクトの構成は以下のとおりです。
Struts2Sample
| - src - 以下省略 LoginAction.java
| - web
| | - login.jsp : 入力用
|
| - WEB-INF
| - jsp
| | - loginresults.jsp : 結果表示用
| - classes
| - struts.xml
| - message.properties
※これはあくまでサンプルなので, 実際のWebアプリのフォルダ構成ではありません。
まず入力用の JSPです。
ex) login.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Login Form</title>
</head>
<body>
<s:form action="loginForm">
<s:textfield name="userName" label="Your name" />
<s:password name="password" label="Password" size="10" maxlength="10"/>
<s:submit value="Submit"/>
</s:form>
<s:if test="getFieldErrors().get('error.username') != null">
<s:property value="getFieldErrors().get('error.username')[0]"/>
</s:if>
<s:if test="getFieldErrors().get('error.password') != null">
<s:property value="getFieldErrors().get('error.password')[0]"/>
</s:if>
</body>
</html>
Struts2のタグを利用しています。1でもhtml タグがありましたね。それです。
<%@ taglib prefix="s" uri="/struts-tags" %>
Form を作っています。 textfield と passwordのフィールドをつくっています。
name属性が重要です。Struts1でも一緒でしたね。
<s:form action="loginForm">
<s:textfield name="userName" label="Your name" />
<s:password name="password" label="Password" size="10" maxlength="10"/>
<s:submit value="Submit"/>
</s:form>
検証後のエラー表示用です。Actionが返してくれるエラーメッセージをここで表示させます
検証で失敗の場合この画面が再び表示されこの部分でエラーメッセージを表示させます
s:if test="getFieldErrors().get('error.username') != null">
<s:property value="getFieldErrors().get('error.username')[0]"/>
</s:if>
<s:if test="getFieldErrors().get('error.password') != null">
<s:property value="getFieldErrors().get('error.password')[0]"/>
</s:if>
ex) LoginAction.java
package com.atmarkplant.struts2.action;
import org.apache.commons.lang.StringUtils;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport
{
private String userName;
private String password;
@Override
public String execute() throws Exception
{
return "success";
}
@Override
public void validate()
{
if ( StringUtils.isBlank(userName) )
{
addFieldError("error.username", getText("error.username"));
}
if ( StringUtils.isBlank(password) )
{
addFieldError("error.password", getText("error.password"));
}
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
import org.apache.commons.lang.StringUtils;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport
{
private String userName;
private String password;
@Override
public String execute() throws Exception
{
return "success";
}
@Override
public void validate()
{
if ( StringUtils.isBlank(userName) )
{
addFieldError("error.username", getText("error.username"));
}
if ( StringUtils.isBlank(password) )
{
addFieldError("error.password", getText("error.password"));
}
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
Actionのプログラムです。Struts1では Action と ActionFormと別クラスで実装して, 動作部分とBean の部分を分離させていましたが, Strtus2では一緒になっていますね。←まだ学習でわかっていません。
先ほどのJSPで定義した入力項目のタグのname属性通りの名前でAction クラスに変数を追加します。
ActionSupport を実装しています。
executeにActionを実装しています。(sucessを返しただけです。)
name属性通りの名前で変数をつくりgetter/setterを実装しています
validate() に, 検証項目を実装します。
今回は空欄の場合にエラーメッセージを返すようにしました。
addFieldError("error.username", getText("error.username"));
ここで, addFiledError で key(第一引数) value(第二引数) で入力JSPに返すメッセージの定義をしました key はJSPで取り出すときのkey, valueは 実際に表示に使うための値です。
要は, Map にkey, value を入れているイメージです。
getText("") ですが, これは ResourceBundle を使ったメッセージを扱うための関数です。
ex) message.properties
error.username=User name is blank
error.password=Password is blank
リソースです
ex) struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- START SNIPPET: xworkSample -->
<struts>
<constant name="struts.custom.i18n.resources" value="message"/>
<package name="default" extends="struts-default">
<action name="loginForm"
class="com.atmarkplant.struts2.action.LoginAction">
<result name="success">/WEB-INF/jsp/loginresults.jsp</result>
<result name="input">/web/login.jsp</result>
</action>
</package>
</struts>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- START SNIPPET: xworkSample -->
<struts>
<constant name="struts.custom.i18n.resources" value="message"/>
<package name="default" extends="struts-default">
<action name="loginForm"
class="com.atmarkplant.struts2.action.LoginAction">
<result name="success">/WEB-INF/jsp/loginresults.jsp</result>
<result name="input">/web/login.jsp</result>
</action>
</package>
</struts>
設定ファイルですが, これがかなり重要な要素を含んでいます。
まず, Globalで利用する propertiesファイルの定義を書いています。
<constant name="struts.custom.i18n.resources" value="message"/>
これで message.propertiesがGlobalのリソースとして登録されました
Actionの設定では class, success という結果表示用と
入力検証用の input というのを定義しています。
ex) loginresults.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Welcome to Atmarkplant World!</h1>
User : <s:property value="userName"/>
Password: <s:property value="password"/>
</body>
</html>
検証に成功した場合に表示されるsuccess 画面です。
<s:property> を使って, Actionクラスで使用した変数を取り出して表示しています。
プログラムの説明は以上です。
propertiesの読み込みやタグの使い方をマスターせねば。
0 件のコメント:
コメントを投稿