エンタープライズ:特集 2003/11/28 15:30:00 更新


特集:第2回 実用サンプルコードで理解する「Struts」の基礎 (4/15)

入力フォームを扱うActionFormサブクラス

 次に入力フォームを扱う「KeijiWriteForm」クラスを作成しよう。このクラスは、ActionFormのサブクラスとして作成する。ここでは入力フォーム内の各入力フィールド名に対応するgetter/setterを用意すればよい。

 例えばList 2の11行目には、次のようにusernameという名称のユーザー名入力のフィールドを用意する。

11: <td><html:text name="KeijiWriteForm" property="username" size="40"/></td>

 この場合、KeijiWriteFormクラスには、getUsernameメソッドとsetUsernameメソッドを利用する。つまり、KeijiWriteFormクラスは、List 4のように実装すればよい。

List 4■KeijiWriteForm.javaファイル
1: package sample.keiji;
2: import org.apache.struts.action.ActionForm;
3:
4: public class KeijiWriteForm extends ActionForm
5: {
6: private String username, email, title, msg;
7:
8: public void setUsername(String val)
9: {
10: username = val;
11: }
12:
13: public String getUsername()
14: {
15: return username;
16: }
17:
18: public void setEmail(String val)
19: {
20: email = val;
21: }
22:
23: public String getEmail()
24: {
25: return email;
26: }
27:
28: public void setTitle(String val)
29: {
30: title = val;
31: }
32:
33: public String getTitle()
34: {
35: return title;
36: }
37:
38: public void setMsg(String val)
39: {
40: msg = val;
41: }
42:
43: public String getMsg()
44: {
45: return msg;
46: }
47: }

 Strutsは、ユーザーが入力フォームでSUBMITボタンを押した場合、KeijiWriteFormクラスを実体化し、各入力フィールドに入力された値を引数としてsetterを呼び出す。つまり、usernameという名称の入力フィールドがあれば、setUsernameメソッドが呼び出される。

 そして実体化されたKeijiWriteFormオブジェクトは、Actionサブクラス――今回の場合はKeijiWriteActionクラス――へと引き渡される。

日本語コード変換処理に配慮する

 List 4に示した入力フォームを処理するKeijiWriteFormだが、ここでは日本語コード変換処理をしていない。本来は、日本語コード変換処理に配慮しなければ正しく動作しない。

 KeijiWriteFormに日本語コード変換処理を実装するのも良いが、その場合には煩雑になってしまう。今回のサンプルでは、入力フォームを1つしか使わないことから、然したる手間ではないだろう。しかし、実際のWebアプリケーションでは、いくつもの入力フォームを使うことから、そのそれぞれに対応するActionFormサブクラスでコード変換をするのは大変だ。

 そこで今回は、JSP、サーブレットコンテナのフィルタ機能を使い日本語変換を実現することにしよう。幸いにもTomcat 4には、サンプルとしてコード変換するためのフィルタが用意されており、そのまま流用する。コード変換をするフィルタサンプルは、/var/tomcat4/webapps/example/WEB-INF/classes/filters/下に「SetCharacterEncodingFilter」というファイル名で用意されている。このファイルを次のようにWebアプリケーションのディレクトリにコピーしよう。

# mkdir /home/struts-keiji/WEB-INF/classes/filters

# cp /var/tomcat4/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class /home/struts-keiji/WEB-INF/classes/filters/

# cp /var/tomcat4/webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java /home/struts-keiji/WEB-INF/src/java/



クラスファイルだけでなく、ソースファイルもコピーしている理由は、後の手順でツール「Ant」を実行した際、classes/ディレクトリの内容が削除されてしまうためだ。逆にいえば、後述する手順でAntを実行すると、クラスファイルがclasses/ディレクトリ下に作成されるため、クラスファイルをコピーする処理は実際に必要ない。

 そして「SetCharacterEncodingFilter」を有効にするため、web.xmlファイルをList 5のように変更する。

List 5■SetCharacterEncodingFilterを有効にするために加えるweb.xmlファイルの変更
1: <?xml version="1.0" encoding="ISO-8859-1"?>
2: <!DOCTYPE web-app
3: PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
4: "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
5: <web-app>
6: 〜中略〜
7:
8: <filter>
9: <filter-name>SetCharacterEncoding</filter-name>
10: <filter-class>filters.SetCharacterEncodingFilter</filter-class>
11: <init-param>
12: <param-name>encoding</param-name>
13: <param-value>EUC-JP</param-value>
14: </init-param>
15: </filter>
16:
17: <filter-mapping>
18: <filter-name>SetCharacterEncoding</filter-name>
19: <url-pattern>/*</url-pattern>
20: </filter-mapping>

21: 〜中略〜
22: </web-app>

 List 5で示した修正のうち、特に3、4行目にあるDTD定義のバージョンを変更するという点に注意してほしい。「struts-blank.war」ファイルを展開した際のDTD定義は、「2.2」になっている。フィルタ機能は、「2.3」以降でしか利用できないため、この部分を2.3に変更しなければならない。

 また、8〜15行目にある<filter>要素がフィルタの定義、17〜20行目にある<filter-mapping>要素はフィルタの適用範囲を意味する。

 19行目にある<url-pattern>要素では、どのURLにフィルタを適用させるのかを指定する。ここでは、「/*」を指定して、すべてに対してURLフィルタを適用させているが、もちろん一部のURLにだけ適用させることも可能だ。このように、フィルタ機能を利用すると、入出力をフィルタ変換ができるため、個々の入力フォームでコード変換をする行う必要がなくなるのだ。


フィルタ機能とStrutsとは、まったく関係がない。Strutsを使わない場合でも、List 5のように定義すれば、フィルタを使って文字コード変換できる。

前のページ | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 次のページ

[大澤文孝,ITmedia]