2007 年 4 月 5 日 23 時 59 分

フィルタ情報編集画面を出す


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


今日は(も?)コードばっかり。

まずは、edit-info.do の Action。

========== EditFilterInfoAction.java ==========
package jp.loafer.test.actions;

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

import jp.loafer.test.beans.Filter;
import jp.loafer.test.forms.FilterInfoForm;
import jp.loafer.test.util.FilterManager;

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 EditFilterInfoAction extends Action {

    public EditFilterInfoAction() {
        super();
    }

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

        // フォームを取得
        FilterInfoForm infoForm = (FilterInfoForm)form;
       
        // 現在のフィルタ設定を読み込み
        Filter filter = FilterManager.load();

        // 現在値をフォームに設定
        infoForm.setInfo(filter.getInfo());

        // OK
        return mapping
                .findForward(Forwards.SUCCESS_KEY);
    }
}
========== end of EditFilterInfoAction.java ==========

ソースは長いが、処理は単純。
FilterInfoForm を初期化しているだけとなる。

/filter/edit-info に name 属性を割り当てたので、
Action の execute が呼ばれる前に、
FilterInfoForm のインスタンスが用意され、
リクエスト属性 filterInfoForm に登録される。

#execute では form パラメータを経由して、
この FilterInfoForm に値を設定するだけとなる。

次は、転送先の View だ。

========== /WEB-INF/pages/filter/edit-info.jsp ==========
<?xml version="1.0" encoding="UTF-8" ?>

<%@ page contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" %>

<%@ taglib prefix="html"
        uri="http://struts.apache.org/tags-html" %>

<!DOCTYPE html PUBLIC
        "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html:html xhtml="true">

<head>
    <meta http-equiv="Content-type"
            content="text/html; charset=UTF-8" />
    <title>パケットフィルタ: 編集</title>
</head>

<body>
    <h1>パケットフィルタ: 編集</h1>
    <html:form action="/filter/update-info">
        <p>
            既定の処理:
            <html:radio property="info.defaultAction"
                    value="allow" />許可
            <html:radio property="info.defaultAction"
                    value="deny" />拒否
        </p>
        <p>
            備考:
            <html:text property="info.note" size="60" />
        </p>
        <p>
            <html:submit>更新</html:submit>
            <html:cancel>キャンセル</html:cancel>
        </p>
    </html:form>
</body>

</html:html>
========== end of /WEB-INF/pages/filter/edit-info.jsp ==========

やはり、ソースは長い。

フォームは Struts のタグライブラリを使って作る。

<html:form> は、その「送信先」の Action に、
割り当てられた名前を元に ActionForm を参照する。

上記の場合、action 属性が /filter/update-info だ。
Struts 設定ファイルの /filter/update-info の設定では、
name 属性の値が、「filterInfoForm」であるので、
このフォームは filterInfoForm 属性を参照する。

もし filterInfoForm 属性に値がなければ、
<html:form> によって FilterInfoForm が生成されるが、
この場合、そのインスタンスに値を設定できず既定値となる。

今回、フォームが参照する filterInfoForm 属性は、
転送元である /filter/edit-info の設定によって、
FilterInfoForm のインスタンスが割り当てられ、
EditFilterInfoAction によって値が設定されているので、
JSP でその値を参照することができるのだ。

    <html:radio property="info.defaultAction"
            value="allow" />許可
    <html:radio property="info.defaultAction"
            value="deny" />拒否

<html:radio> はラジオボタンを作成する。
フォームから、property 属性が示すプロパティを取得し、
それが value 属性の値と等しければ既定で選択状態になる。

上記の場合、参照するプロパティとして、
「info.defaultAction」という指定をしている。

これは、フォームの info プロパティのオブジェクトの、
defaultAction プロパティを参照するという記述方法で、
プロパティをサポートする言語ではお馴染みだ。

Struts(というか、JavaBean 仕様・BeanUtils)では、
info.defaultAction という記述によって、
getInfo().getDefaultAction() としてアクセスされる。

    <html:text property="info.note" size="60" />

<html:text> は前と同じ。参照先は info.note なので、
getInfo().getNode() で値が取り出され、
その値がテキストボックスの既定値として表示される。

    <html:submit>更新</html:submit>
    <html:cancel>キャンセル</html:cancel>

<html:cancel> はリセットボタンではない。
<html:submit> と <html:cancel> は両方とも、
一般的な送信ボタンとして表示されるのだが、
<html:cancel> は少し特別な意味を持っている。
これについては後で調べよう。

現時点ではパケットフィルタの設定ファイルは空なので、
この画面を表示しても動作確認にならない。
なので、まだテストはしないでおこう。



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