2007 年 4 月 7 日 23 時 24 分

フィルタ情報系のテスト


このアーカイブは同期化されません。 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 が呼ばれるまでに、
文字のエンコーディングに関する問題があったと言うことだ。

まだまだ改善しなければならないようである。



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