日本語化

これまで、全て表示を英語で扱っていました。しかし、我々日本人はJSP内の記述やメッセージで日本語を扱う必要があります。Sturts2のアプリケーションにおいて日本語を意識する必要があるポイントは

  • 日本語を定義したメッセージリソース
  • 入力フォーム内の日本語入力

でしょう。

アプリケーションで日本語を扱う場合、まずアプリケーションの表示文字コードを何にするかを決定する必要があります。今回、各サンプルではUTF-8を利用していましたが、今回はWindows-31J(シフトJISやMS932とも呼ぶことがあります。ただし、正確にはシフトJISとは異なります)を表示文字コードとして扱う場合を紹介します。

まず、メッセージリソースファイルに日本語を記述する方法ですが、これは、表示文字コードには依存せずに、メッセージを定義しているpropertiesファイルを、unicodeでエンコーディングした日本語のファイルとして用意します。エンコーディングする方法はJDKに含まれているnative2asciiコマンドなどを用いて実行します。native2asciiコマンドの場合、

native2ascii 入力ファイル名  出力ファイル名

と実行することで、入力ファイルに指定したファイル内の全ての文字列がunicodeでエンコーディングされて出力ファイルに書き出されます。この出力ファイルをアプリケーションで利用するメッセージリソースファイル(MessageResource.propertiesなど)とすれば問題ありません。これによって、Struts 2はメッセージの日本語文字列を正しく読み込めるようになります。日本語の文字列をJSPで表示する場合は、ご存知の通り、JSP pageディレクティブを用いて

<%@ page contentType="text/html; charset=Windows-31J" %>
<%@ page pageEncoding="Windows-31J" %>

のようにJSPに記述することで、JSPファイル自身のエンコーディングと、表示のエンコーディングを指定する事ができます。例ではJSP、表示ともにWindows-31Jを用いる事を定義しています。このようにすることで、メッセージリソースを含めた日本語の文字列の表示が行えます。

続いて、入力フォームに日本語が入力される場合に、正しく日本語を扱えるようにする方法を紹介します。これは、アプリケーションのエンコーディングをStruts 2へ指定する事で行います。指定は、sturts.xmlに<constant>要素を用いて下記のように行います。

リスト25: アプリケーションのエンコーディング定義

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.i18n.encoding" value="Windows-31J" /> 
    ....略....

例では、Windows-31Jを指定しています これらの指定によって、Struts 2にて日本語を正しく扱えるようになります。

Struts 1との対比

最後に、Sturtsのバージョン1を利用している方向けに、Struts 1とSturts 2での各種機能の実装方法や概念の違いを紹介しますので、参考にしてください。

Struts 1の機能/概念 Sturts 2での機能/概念
アクションサーブレット Dispatcher Filterが同等の機能を提供
リクエストプロセッサ インターセプタ群が同等の機能を提供
struts-config.xml struts.xml に同等の定義を記述
アクションマッピング ほぼ同じ(XMLの記述が異なる)
アクションクラス POJOで記述できる
アクションフォームビーン アクションクラスに集約された
アクションフォワード ほぼ同じ(outcomeとして文字列で扱う)
Sturtsカスタムタグ まったく別のカスタムタグのセットが用意され、OGNLが利用できる
メッセージリソース ほぼ同じ(ファイルを分割定義できる)
メッセージ操作 ほぼ同じ(アクションクラスでのAPIが異なる)
入力検証 ほぼ同じ(XML記述やAPIが異なる)
Session/Requestコンテキスト 直接アクセスする事は、ほぼない(本文参照)

以上の機能説明で、かなりの本格的なアプリケーションが作成できるのではないでしょうか。

ここまで紹介した機能以外にもStruts 2にはDIを用いて「ビジネスロジックのオブジェクトを入手する機能(この機能は Spring Frameworkを利用可能です)」や「各種定義ファイルの記述を省略し、アノテーションによって指定する機能」「アクションのパス定義にワイルドカードを利用する機能」など、便利で魅力的な機能が多く提供されています。また、多くの機能はカスタマイズが可能となっています。これら機能の利用方法については、機会があればまたご紹介したいと思います。