Entering Passive Mode

カテゴリ 'Java' の記事
< 1 2 3 4 5 6 7 8 9... >

Filter: Servlet の汎用的なフック機構

Filter を使うと、Servlet の処理に介入し、
その実行の前後で特別な処理を挟むことができる。

Filter の強みは、汎用的なところである。

あらゆる Servlet に適用することが可能だけでなく、
普通の HTML や CSS などの静的なコンテンツに対しても、
自由に前処理や後処理をすることができる。

まあ、「静的」なコンテンツと言ったところで
Servlet コンテナの既定処理(default servlet)で
処理されているから、結局は Servlet として扱えるのだ。

Struts の処理に介入する方法

Struts のコーディングは、イベント駆動型である。

リクエストが到達すると、まず Struts が処理をした後、
Action のコードが呼び出せる順番となっている。

そうなると、ActionForm が用意される前に、
HttpServletRequest#setCharacterEncoding を呼ぶためには、
何らかの方法で Struts の処理に介入しなければならない。

これには、大雑把に分けて 3 つの方法がある。

HttpServletRequest#getParameter の調査

どうも getParameter 系の挙動があやしそうだ。

Struts はフォームからのデータの読み取りに、
getParameter 系のメソッドを利用しているため、
getInputStream や getReader が呼び出されることはない。

そこで HttpServletRequest#getParameter を調べてみよう。

UpdateFilterInfoAction#execute 内に以下のように書く。

    String note = request.getParameter("info.note");
    if (note != null) {
        System.err.println("Encoding: "
                + request.getCharacterEncoding());
        System.err.println("Note: " + note);
        System.err.println("Length: " + note.length());
    }

フォームを受信したサーバ側の処理

フォームをブラウザが送信する時点では、
UTF-8 文字エンコーディングを使ったバイト表現として扱い、
それをパーセントエンコードすることによって文字列化し、
application/x-www-form-urlencoded で送信されていた。

では、その先を追いかけてみよう。

まずは、HTTP プロトコルだ。
ブラウザと Web サーバは HTTP で通信を行うため、
もし HTTP 自身に何かしらの制約があれば、
この時点で問題が起きることになる。

文字化けが発生する原因を探る

一番大きな問題点は、日本語が通らないことだ。
これには、HTTP, HTML, Servlet, Struts の 4 つの規格が、
それぞれ何かしらの処理で関わっているため、
その原因を正しく理解するのは少し難しい。

そのため、フォームの送信を順番に追いかけ、
どのような流れで日本語が処理されているか考えてみよう。

まず、データを送信するフォームがどうなっているか、
http://localhost:8080/struts-test/filter/edit-info.do
のソースをブラウザで開いて確認する。

フィルタ情報系のテスト

編集画面

正常に更新されたかどうか確認するため、
一覧画面に表示させてテストしてみよう。

一覧画面は、/filter/list.do より呼び出され、
/WEB-INF/pages/filter/list.jsp に転送して表示する。

list.jsp で現在の設定を画面に表示するためには、
list.do から list.jsp に単純に転送するだけではだめで、
初期化用の Action を呼び出して属性を用意する必要がある。

ということで、Struts 設定ファイルの <action> を修正。

フィルタ情報の変更を反映する

最近、タイトルが単調すぎていやな感じ。

昨日の続き。更新系をちゃっちゃと作ってしまおう。

まずは、/filter/update-info.do による更新処理。
edit-info.jsp からフォームが送信され、
FilterInfoForm 型インスタンスとして受け取り、
このデータを使ってパケットフィルタの設定を更新する。

まずは、Struts 設定ファイルの、<action> を修正する。

フィルタ情報編集画面を出す

今日は(も?)コードばっかり。

まずは、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;

フィルタ情報編集画面の遷移

フィルタ情報を編集する画面からやっていくか。

まず、画面遷移を考えよう。
Struts の設定ファイルを書きながら決めていく。

まず、フィルタ情報用の Parameter Bean である、
FilterInfoForm を <form-beans> に追加しておく。

    <form-bean name="filterInfoForm"
            type="jp.loafer.test.forms.FilterInfoForm" />

フィルタ情報の読み込みと保存

前々回書いたように、今回は Filter インスタンスを、
Java のシリアライズ機能を使って読み込み・保存を行う。
そこで、それだけを行う簡単なユーティリティクラスを作ろう。

本来、シリアライズを行う場合、
ObjectOutputStream を使って出力するのだが、
この場合、その出力結果はバイナリデータとなってしまう。
これでは、出力されたデータの内容を確認するのが面倒だ。

そこで、厳密にはシリアライズではないのだが、
java.beans パッケージにある XMLEncoder/XMLDecoder を使い、
XML 形式で出力・入力できるようにしてみよう。

< 1 2 3 4 5 6 7 8 9... >
このページのトップへ戻る
© 2008 Project Loafer/Project Fireball and all blog writers. Powered by Nucleus CMS