このアーカイブは同期化されません。 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 が画面を作成して返しているのである。