このアーカイブは同期化されません。 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 クラスが実行されたことが確認できた。