最近の記事
- 9/1 - 将棋始めました
- 5/16 - サーバー引っ越し
- 4/24 - 優先順位
- 3/17 - vbNullString と 空文字列 ""
- 3/15 - InputBox 関数の戻り値
- 3/13 - 紙と Excel と VBA
- 3/9 - 未だに Visual Basic 6
- 11/14 - ぼて閉鎖
- 11/9 - 関数オブジェクトの呼び出し
- 9/7 - メソッドとしての関数オブジェクト
Entering Passive Mode
Filter を使うと、Servlet の処理に介入し、
その実行の前後で特別な処理を挟むことができる。
Filter の強みは、汎用的なところである。
あらゆる Servlet に適用することが可能だけでなく、
普通の HTML や CSS などの静的なコンテンツに対しても、
自由に前処理や後処理をすることができる。
まあ、「静的」なコンテンツと言ったところで
Servlet コンテナの既定処理(default servlet)で
処理されているから、結局は Servlet として扱えるのだ。
Struts のコーディングは、イベント駆動型である。
リクエストが到達すると、まず Struts が処理をした後、
Action のコードが呼び出せる順番となっている。
そうなると、ActionForm が用意される前に、
HttpServletRequest#setCharacterEncoding を呼ぶためには、
何らかの方法で Struts の処理に介入しなければならない。
これには、大雑把に分けて 3 つの方法がある。
どうも 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 形式で出力・入力できるようにしてみよう。