2007 年 3 月 14 日 23 時 55 分

ActionForward: Model と View の分離


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


昨日は、簡単なアクションを作ってみたが、
Servlet を自分で実装するのとそれほど変わらなかった。

そもそも、Model の役割は、動作の部分のはずだ。
昨日は execute メソッドの中で画面の出力を行っていたが、
これは View の仕事であるといえる。

そこで、今日は Model と View の分離をしてみよう。

Model と View の橋渡しを行うのは Controller だ。
Model は処理を実行した後、適当な View を表示するため、
Controller を呼び出して、処理の転送を依頼する。

では、再度 Action の execute メソッドを見てみよう。

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

Struts の Model であるアクションでは、
execute メソッドの戻り値を使うことで、
他の URL への転送を依頼することができる。

「転送」は ActionForward というクラスとして抽象化され、
org.apache.struts.action パッケージに定義されている。

昨日は戻り値として null を返したので、
Controller である ActionServlet は何も行わなかったが、
ActionForward のインスタンスを返すと、
ActionServlet によって転送が行われる。

では、これを利用して、昨日のコードを修正してみよう。

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

package jp.loafer.test.actions;

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 {

        // TODO: 入力パラメータの検証とか
        // TODO: その他なんか色々

        // ログイン情報をセッションに保存
        request.getSession().setAttribute(
                "user", request.getParameter("user"));

        return new ActionForward("/WEB-INF/pages/menu.jsp");

    }

}

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

ActionForward クラスには数多くのコンストラクタがあるが、
転送先のパス 1 つを取るものが最も単純である。

上記のアクションでは、フォームで渡されたユーザ名を、
Session 属性に値を格納した後、
/WEB-INF/pages/menu.jsp に転送するように、
ActionServlet に依頼しているのである。

Session 属性に値を入れているのは、
そのユーザが認証済みであることを記憶しておくためだ。

Session の内容は、アクセスする利用者毎に作成されるため、
それ以降、同じ利用者によるアクセスがあった場合は、
Session の内容を調べることで認証済みか確認できる。

これは、独自で認証を行うアプリケーションの、
典型的なパターンである。

次に、転送先である menu.jsp を作る。

========== /WEB-INF/pages/menu.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>
    <p>
        ログイン成功!
    </p>
</body>

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

さて、/index.do をブラウザで開き、
ログインフォームに入力して送信してみよう。

「ログイン成功!」の画面に転送されれば成功である。

フォームの送信は、LoginAction へ転送され、
そこからさらに menu.jsp に転送され、
menu.jsp が画面を作成して返しているのである。



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