最近の記事
- 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
そろそろ次のステップに移るか。
次に着手するのが、一覧画面のルール管理用フォームだ。
このフォームは今までのものと少し違う。
従来のフォームは、特定の Bean の内容を編集するものであり、
フォームの項目は Bean のプロパティに対応している。
イメージとしては、プロパティダイアログボックスで、
内容を編集後、OK ボタンを押して内容を更新する。
ルール管理用のフォームは、Bean 一覧の管理を行うものであり、
フォームの項目に入力項目は少なく、ほとんどがボタンである。
イメージとしては、コレクション一覧表示のウィンドウで、
各種ボタンを使って並べ替えや移動・追加・削除を行う。
メッセージリソースを使いだしたので、
検証エラーのメッセージにもリソースを使ってみよう。
現在メッセージは ActionForm に直接記述しているので、
このままでは多言語化することはできない。
そのため、メッセージをプロパティファイルに移し、
それを参照するような形に修正する。
========== Messages_ja.properties ==========
# エラーメッセージ
<message-resources> で登録したメッセージリソースは、
Bean タグライブラリの <bean:message> で取り出して使う。
メッセージリソースのキーを指定する方法は 2 つある。
1 つは、key 属性を使って直接キー文字列を指定する方法、
もう 1 つは、name 属性や property 属性を使って、
スコープ属性に登録してある Bean 値を読み取り、
その値をキーとして間接的に使う方法である。
list.jsp の既定の処理の値は、
リクエスト属性「filter」に登録されている Bean の、
「info.defaultAction」プロパティから取得でき、
その値は、「allow」か「deny」である。
メッセージリソースを使うためには、
まず properties ファイルを作成する必要がある。
jp.loafer.test.resources パッケージに置くことにしよう。
まずは、基準となるプロパティファイル。
これにはデフォルトとして英語で記述することにする。
もちろん、ここに日本語を書いても良いのだが、
その場合、どのロケールでも日本語となってしまう。
========== Messages.properties ==========
value.action.allow = Allow
value.action.deny = Deny
========== end of Messages.properties ==========
一覧表示のページである、list.jsp の出力を見てみると、
既定の処理が「deny」や「allow」などの英語表記である。
FormBean の値を、<bean:write> で直接出力しているからだ。
GUI の設計を考えると、ここは「許可」や「拒否」など、
日本語で表示しておくのが好ましい。
これを実現するためには、<bean:write> で書くのではなく、
値を調べて日本語に変換するコードを書く必要がある。
これを、直接 JSP の条件分岐で書いても良いのだが、
折角なので、メッセージリソースを使う事を考えてみよう。
キャンセルに対応したので、ついでに検証を実装し、
キャンセルが検証コードを回避することを確認してみよう。
ま、自分の復習のためってことで。
検証を行うためには、以下のような修正が必要となる。
1. ActionrForm#validate の実装
2. Struts 設定ファイルの <action> へ input 属性を追加
3. 検証エラーを表示する JSP に、専用のタグを追加
まず、FilterInfoForm#validate を実装する。
日本語の問題が解決したので、次のステップに移る。
今日は、キャンセル処理について。
/WEB-INF/pages/filter/edit-info.jsp では、
タグライブラリの <html:cancel> を使って、
キャンセル用のボタンを配置しているが、
これを押すと、InvalidCancelException 例外が発生する。
まず、これを直さなければならない。
何故 <html:cancel> を配置するだけで例外が発生するのか。
ComposableRequestProcessor で処理する Command は、
設定ファイルによって登録されている。
org.apache.struts.chain.chain-config.xml がそれだ。
chain-config.xml を読んでみるとかなり巨大な内容だが、
Struts はこれを簡単に拡張できるように考慮しており、
別にチェインの設定の XML ファイルを作るだけで、
簡単にユーザ定義コマンドを追加することができる。
ということで、まずは /WEB-INF/chain-config.xml を作る。
Struts のコアは、RequestProcessor というクラスである。
Struts 1.3.5 においては、このクラスは拡張され、
org.apache.struts.chain パッケージにある、
ComposableRequestProcessor がその実態を担当している。
Struts で行われる処理は、小さな単位に分割され、
それらは個々のコマンドクラスとして実装されている。
ComposableRequestProcessor は上記クラスを管理しており、
デザインパターンの Chain of Responsibility を元に、
コマンドを順番に呼び出すことで処理を行っている。
Filter は Servlet と同様、web.xml に登録して使う。
登録の方法も非常によく似ており、
<web-app> 要素の子要素として <filter> 要素と、
<filter-mapping> 要素を追加することで登録する。
<!-- フィルタを定義 -->
<filter>
<filter-name>utf8-request</filter-name>
<filter-class>
jp.loafer.test.filters.SetUTF8Request
</filter-class>
</filter>
<!-- フィルタの適用先を定義 -->
<filter-mapping>
<filter-name>utf8-request</filter-name>
<servlet-name>struts</servlet-name>
</filter-mapping>