このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
正常に更新されたかどうか確認するため、
一覧画面に表示させてテストしてみよう。
一覧画面は、/filter/list.do より呼び出され、
/WEB-INF/pages/filter/list.jsp に転送して表示する。
list.jsp で現在の設定を画面に表示するためには、
list.do から list.jsp に単純に転送するだけではだめで、
初期化用の Action を呼び出して属性を用意する必要がある。
ということで、Struts 設定ファイルの <action> を修正。
<!-- 一覧画面 -->
<action path="/filter/list"
type="jp.loafer.test.actions.ListFilterAction">
<!-- 一覧画面用の View へ -->
<forward name="success"
path="/WEB-INF/pages/filter/list.jsp" />
</action>
んでもって、ListFilterAction を書く。
単に設定をロードするだけだ。
=========== ListFilterAction.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.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 ListFilterAction extends Action {
public ListFilterAction() {
super();
}
@Override
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// 現在のフィルタ設定を取得
Filter f = FilterManager.load();
// filter リクエスト属性に保存
request.setAttribute("filter", f);
// OK
return mapping
.findForward(Forwards.SUCCESS_KEY);
}
}
=========== end of ListFilterAction.java ===========
list.jsp には値を編集するようなフォームはないので、
特に ActionForm を使う必要はない。
そのため、好きな属性に値を記憶させておけば良い。
ここでは、「filter」というリクエスト属性とした。
では、list.jsp の情報部も書き換えよう。
=========== /WEB-INF/pages/filter/list.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="bean"
uri="http://struts.apache.org/tags-bean" %>
<!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/edit-info">
<p>
既定の処理:
<bean:write name="filter"
property="info.defaultAction" />
<br />
備考:
<bean:write name="filter"
property="info.note" />
</p>
<p>
<html:submit>編集</html:submit>
</p>
</html:form>
(以降、変化なしなので省略)
=========== end of /WEB-INF/pages/filter/list.jsp ===========
一覧画面は、入力要素ではなく値をそのまま書き出す。
それには、<bean:write> が活躍する。
<bean:write name="filter"
property="info.defaultAction" />
この場合、filter という属性を適当なスコープより探し、
そのオブジェクトの getInfo().getDefaultAction() を呼び、
その戻り値を HTML としてエスケープして展開される。
JSP 2.0 なのでこのタグを使わず、
${Filter.info.defaultAction} と書いても展開されるが、
この場合、HTML 特有の処理がなされないため、
値として < や & などの文字が含まれると問題となる。
さて、いよいよ試してみるか。
http://localhost:8080/struts-test/filter/edit-info.do
編集画面が表示される。最初は初期状態なので、
既定の処理は「拒否」、備考は空欄だ。
備考として「内向きフィルタ」と入力して「更新」する。
設定が保存されて、一覧画面に戻るはずだ。
お、設定が表示されている。
……が、問題が起きているようだ。
備考欄が見事に文字化けしている。
確認のため、「編集」を押して再度編集画面へ。
確かに値は保存されているが、やはり文字化けしている。
念のため、パケットフィルタの設定ファイルを確認する。
========== /etc/packet-filter.xml ==========
<java version="1.6.0_01" class="java.beans.XMLDecoder">
<object class="jp.loafer.test.beans.Filter">
<void property="info">
<void property="note">
<string>醇H†…醇H�‘醇I��醇Iƒ•醇I‚£醇Iƒ«醇I‚潤ツ</string>
</void>
</void>
</object>
</java>
========== end of /etc/packet-filter.xml ==========
……見事に文字化けしている。
ファイルに保存される時点ですでに化けていたようだ。
ということは、/filter/update-info.do に送信され、
UpdateFilterInfoAction が呼ばれるまでに、
文字のエンコーディングに関する問題があったと言うことだ。
まだまだ改善しなければならないようである。