2007 年 3 月 17 日 23 時 56 分

ActionForm: パラメータの Bean


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


Struts の持つ ActionForm を使うと、
Request からパラメータを切り離して型変換し、
持ち運べるような Bean を自動的に作成してくれる。

ActionForm を使うためには、
まずパラメータを格納するためのフォームを作成する。
フォームは ActionForm から派生した Bean である。

Bean とは、プロパティやメソッドを持ったコンポーネントで
JavaBeans 仕様として定義されている。

Bean は永続化(直列化・シリアライズ)が必須であり、
Serializable インタフェースを実装する必要がある。
Serializable の規約に従い、引数なしのコンストラクタや、
serialVersionUID 静的フィールドも用意する。

では、簡単なフォームを作ってみよう。

==========  LoginForm.java ==========
package jp.loafer.test.forms;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class LoginForm extends ActionForm {

    public LoginForm() {
        super();
    }

    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isPersistent() {
        return persistent;
    }
    public void setPersistent(boolean persistent) {
        this.persistent = persistent;
    }

    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }

    public void reset(ActionMapping mapping,
            HttpServletRequest request) {
        user = null;
        password = null;
        remember = false;
    }

    private String user;
    private String password;
    private boolean persistent;

    static private final long serialVersionUID = 1L;

}
========== end of LoginForm.java ==========

ここでは、ログイン用のフォームを定義してみた。

ユーザ名とパスワードは、String で、
そしてよくある例として、「次回から入力を省略」という
boolean 型の値を用意してみた。

reset メソッドは、フィールドの初期化時に呼び出される。
コンストラクタを使わない理由は、
パフォーマンスの理由により、
フォームのインスタンスが再利用される可能性がある事、
そして、引数である ActionMapping や Request によって、
その初期値が違う場合に対応できるようにするためだ。

さて、Java には、プロパティという機能がないため、
そのアクセサ (getter/setter) メソッドを用意することで、
プロパティを(概念として)定義する。

JavaBeans 仕様では、Bean に関する情報を公開するため、
Bean とは 別に BeanInfo クラスを作らなければならないが、
以下のようにアクセサを設計しておけば、
これを省略して手っ取り早く Bean を作ることができる。

・プロパティ値の取得・設定メソッド(getter/setter) は、
 get(is), set という接頭辞の後に、
 先頭を大文字にしたプロパティ名を続けた名前とする。

・getter は引数を持たず、戻り値で現在値を返し、
 setter は引数で新しい値を受け取り、戻り値はない。

例えば、「user」というプロパティを定義するには、
以下の 2 つのメソッドを実装すればよいことになる。

    ・String getUser();
    ・void setUser(String user);

なお、boolean 型のパラメータの場合、
getter には、get ではなく is の接頭辞を使用する。
つまり、getPersistent ではなく isPersistent となる。

では、このフォームの入力画面である、
login.jsp も少し修正しておこう。

========== /WEB-INF/pages/login.jsp ==========
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC
        "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xml:lang="ja" lang="ja">

<head>
    <meta http-equiv="Content-type"
            content="text/html; charset=UTF-8" />
    <title>struts-test ログイン</title>
</head>

<body>
    <h1>ログイン</h1>
    <form action="./login.do" style="line-height: 2">
        <div>
            ユーザ名:
            <input type="text" name="user" value="" />
        </div>
        <div>
            パスワード:
            <input type="password" name="password" value="" />
        </div>
        <div>
            <input type="checkbox" name="persistent" value="y" />
            次回から入力を省略
        </div>
        <div>
            <input type="submit" value="ログイン" />
        </div>
    </form>
</body>

</html>
========== end of /WEB-INF/pages/login.jsp ==========

明日はこのフォームを使ってみよう。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.