2007 年 4 月 26 日 19 時 44 分

ルール追加画面を出す


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


[写真]


今日は edit-rule.jsp を修正し、追加画面を表示する。

HTML タグライブラリを使ってフォームを作る場合、
先に送信先のダミー Action を登録しておかなければならない。
そこで、Struts 設定ファイルにダミーを追加する。

まずは、filterRuleForm の <form-beam>
FilterRuleForm クラスはすでに設計済みなので楽だ。

        <form-bean name="filterRuleForm"
                type="jp.loafer.test.forms.FilterRuleForm" />

そして、仮の <action>。この Action では、
フィルタルールを更新する処理を行うので、
filterRuleForm を受け取ることになる。

        <!-- ルール更新 -->
       
        <action path="/filter/update-rule"
                name="filterRuleForm" scope="request">
        </action>

このパスが filterRuleForm を必要とする事を明示する。
Action を作ってないので type 属性は指定していない。
ま、ダミーなのでこれで十分だ。

では、JSP のコードを書こう。

========== /WEB-INF/pages/filter/edit-rule.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" />
    <style>
        table {
            border: 1px solid gray;
            border-collapse: collapse;
        }
        th, td {
            border: 1px solid gray;
            padding: 2px;
        }
    </style>
    <title>パケットフィルタ: ルールの追加</title>
</head>

<body>
    <h1>パケットフィルタ: ルールの追加</h1>
    <html:form action="/filter/update-rule">
        <div>
            <html:hidden property="index" />
        </div>
        <table>
            <tr>
                <td>有効</td>
                <td>
                    <html:checkbox property="rule.enabled" />
                </td>
            </tr>
            <tr>
                <td>処理</td>
                <td>
                    <html:radio property="rule.action"
                            value="allow" />許可
                    <html:radio property="rule.action"
                            value="deny" />拒否
                </td>
            </tr>
            <tr>
                <td>プロトコル</td>
                <td>
                    <html:multibox property="rule.protocols"
                            value="tcp" />TCP
                    <html:multibox property="rule.protocols"
                            value="udp" />UDP
                </td>
            </tr>
            <tr>
                <td>発信アドレス</td>
                <td>
                    <html:text property="rule.source.network" />
                </td>
            </tr>
            <tr>
                <td>発信ポート</td>
                <td>
                    <html:text property="rule.source.port" />
                </td>
            </tr>
            <tr>
                <td>宛先アドレス</td>
                <td>
                    <html:text property="rule.destination.network" />
                </td>
            </tr>
            <tr>
                <td>宛先ポート</td>
                <td>
                    <html:text property="rule.destination.port" />
                </td>
            </tr>
            <tr>
                <td>備考</td>
                <td>
                    <html:text property="rule.note" />
                </td>
            </tr>
        </table>
        <p>
            <html:submit>OK</html:submit>
            <html:cancel>キャンセル</html:cancel>
        </p>
    </html:form>
</body>

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

必要最小限なのだが、やっぱ長いな。

<html:form> の送信先は /filter/update-rule だ。
Struts 設定ファイルの /filter/update-rule の設定では、
name 属性の値が、「filterRuleForm」であるので、
このフォームは filterRuleForm 属性を参照する。

今回、追加ボタンで遷移してきたので、
FilterRuleForm のインスタンスは生成されていない。
そこで <html:form> によって生成され、
#reset が呼ばれて既定値となる。

FilterRuleForm の index フィールドは、
追加か編集を示すための内部的なパラメータだ。
そこで、<html:hidden> を使って隠しパラメータとする。

あとは、ルールに関するプロパティだ。

rule.enabled プロパティには有効かどうかが入っている。
これは boolean 型なので、チェックボックスを使う。
単純に <html:checkbox> を使えばいい。

rule.action プロパティには処理の名前が入っている。
これは前も作ったし、<html:radio> で特に問題なし。

rule.protocols プロパティにはプロトコル名が入っている。
これは string[] と文字列配列型になっており、
プロトコル名を示す「tcp」、「udp」などが含まれる。
これを参照するには、<html:multibox> を使うとよい。
<html:multibox> を使えば、配列に指定した値がある場合、
自動的にチェック状態としてくれるのだ。

rule.source や rule.destination は、
クラス型のプロパティなのでそのままでは使わず、
rule.source.network や rule.destination.port など、
内部のプロパティを直接参照すれば特に問題ない。
備考も合わせて <html:text> で出力する。

「更新」・「キャンセル」もお馴染みのボタンだ。

では試してみよう。

http://localhost:8080/struts-test/filter/list.do を開き、
「追加」ボタンを押すと画面が表示された。

フォームの入力項目は空白ではなく、
FilterRuleForm の既定値が表示されていることが分かる。



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