このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
ルール編集画面は、ルール追加画面とほとんど同じなので、
edit-rule.jsp を流用することにしよう。
1 つの View を追加と編集に使う場合、
画面の一部分の表示を変えなければならない。
例えば、HTML のタイトルや、見出し部分だ。
これを実現するためには、JSP で追加か編集かを区別し、
出力する HTML を変える必要がある。
Logic タグライブラリを使えば、
リクエストやアプリケーション等の属性を元に、
JSP 内で条件分岐を行うことができる。
では、edit-rule.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" %>
<%@ taglib prefix="logic"
uri="http://struts.apache.org/tags-logic" %>
(…省略…)
<logic:present name="filterRuleForm">
<title>パケットフィルタ: ルールの編集</title>
</logic:present>
<logic:notPresent name="filterRuleForm">
<title>パケットフィルタ: ルールの追加</title>
</logic:notPresent>
</head>
<body>
<logic:present name="filterRuleForm">
<h1>パケットフィルタ: ルールの編集</h1>
</logic:present>
<logic:notPresent name="filterRuleForm">
<h1>パケットフィルタ: ルールの追加</h1>
</logic:notPresent>
<html:form action="/filter/update-rule">
(…省略…)
</html:form>
</body>
</html:html>
========== end of /WEB-INF/pages/filter/edit-rule.jsp ==========
View で、追加か編集かを識別するために、
filterRuleForm リクエスト属性を使う。
「追加」で遷移してきた場合は、
filterRuleForm 属性値がまだ存在しないので、
この属性が存在するかどうかを調べれば良い。
これには、<logic:present> 要素を使う。
<logic:present> は、指定した調べる対象が、
存在するかどうか (非 null か)を調べ、
要素の内容は、値が存在した場合のみ出力される。
調べる対象は、毎度お馴染みの属性で指定する。
name と property 属性だ。property は省略可能。
name だけを指定した場合、属性値自身が、
name と property を指定した場合は、
name で指定した名前の属性値に含まれるオブジェクトの、
property で指定したプロパティの値が調べられる。
<logic:notPresent> はその逆だ。
要素の内容は、値が存在しない場合のみ出力される。
今回はこれらを使って分岐してみた。
注意点としては、filterRuleForm 属性が、
<html:form> タグによって自動的に生成されることだ。
<html:form> は、action 属性に指定されたパスによって、
必要な Form Bean のインスタンスを生成するので、
<logic:present>、<logic:notPresent> を使えるのは、
<html:form> よりも手前だけということになる。