2011年11月27日日曜日

Struts2 ActionSupport

Struts2の開発用メモです。Strtus2を現在学習中....

※以下のサンプルは,  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;
}
}

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>

 設定ファイルですが, これがかなり重要な要素を含んでいます。
まず, 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 件のコメント:

コメントを投稿