このアーカイブは同期化されません。 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 の既定値が表示されていることが分かる。