このアーカイブは同期化されません。 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> は少し特別な意味を持っている。
これについては後で調べよう。
現時点ではパケットフィルタの設定ファイルは空なので、
この画面を表示しても動作確認にならない。
なので、まだテストはしないでおこう。