2007 年 3 月 13 日 23 時 57 分

Action: Model の基礎


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


[写真]


Model へ転送する <action> は、以下のような記述となる。

<action path="/login"
        type="jp.loafer.test.actions.LoginAction" />

type には、Model 機能を記述したクラスの FQCN が入る。
このようなクラスを、アクション(Action)クラスと呼び、
Web アプリケーションのロジックを実行する役割を持つ。

アクションクラスは全て、Struts に定義されている、
org.apache.struts.action.Action から派生する必要がある。

Action には色々なメソッドがあるのだが、
派生クラスがオーバーライドする必要があるのは、
基本的に execute メソッドだけである。

ActionSevlet が /login.do への要求を受け取ると、
Struts によってインスタンスが作成され、
インスタンスの execute メソッドが呼び出される。

なので、execute メソッドの中に動作を記述すれば、
アクションとして使えるようになる。

では、実験のため LoginAction を適当に作ってみよう。

Web アプリケーションに含むコードは、
バイトコードを /WEB-INF/classes 配下に出力さえすれば、
そのソースファイルはどこに作成しても良い。
(もちろん、配布時にソースファイルは不要である)

今回は、一般的な慣習に従って、
/WEB-INF/src をソースフォルダとして使うことにする。

となると、jp.loafer.test.actions.LoginAction クラスは、
以下の場所に作成・出力することになる。

/WEB-INF/src/jp/loafer/test/actions/LoginAction.java
/WEB-INF/classes/jp/loafer/test/actions/LoginAction.class

========== LoginAction.java ==========

package jp.loafer.test.actions;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

public class LoginAction extends Action {

    public LoginAction() {
        super();
    }

    public ActionForward execute(ActionMapping mapping,
            ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        response.setContentType("text/plain; charset=UTF-8");

        PrintWriter writer = response.getWriter();
        writer.println("LoginAction executed!");
        writer.println("user: " + request.getParameter("user"));
        writer.println("password: " + request.getParameter("password"));

        return null;

    }

}

========== end of LoginAction.java ==========

execute メソッドのシグネチャは結構複雑だ。

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception;

いきなり知らないクラスが大量に出てきて困るが、
request と response 以外は、
この時点では取りあえず無視しておこう。

request と response だけ見て考えれば、
小さな Servlet みたいな感じである。

今日は、テストでフォームのパラメータを出力してみる。
response.setContentType で送信するデータを決め、
response.getWriter でテキスト出力用のストリームを取得、
そこにパラメータ等を書き込んで終了となる。
execute の戻り値には null を返却しておく。

では、/index.do をブラウザで開き、ユーザ名に「guest」、
パスワードに「hogehoge」と入力して送信してみよう。

以下のように表示されたはずだ。

    LoginAction executed!
    user: guest
    password: hogehoge

まずは LoginAction クラスが実行されたことが確認できた。



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