各種メッセージを外部ファイルで管理する方法

ここまでで、アプリケーションの基本的な動作を実装するための機能がおわかり頂けたと思います。しかし、まだまだStruts 2には便利な機能が存在します。その1つがメッセージ管理機能です。この機能は、表示用の文字列を別ファイルに定義しておき、アプリケーションコード内ではそのメッセージをキーで扱い、エラーメッセージや通常メッセージ(警告メッセージや情報メッセージなど)を表示させるものです。このファイルは、プロパティファイル形式で用意します。たとえば下記のようなものになります。日本語のメッセージを扱う場合は、後述の「日本語化」を参照してください。

リスト19: Top.properties

message.attention=Please Login

上記のTop.propertiesを、このメッセージを扱いたいアクションクラスと同じパッケージに配置します。今回はTopアクションクラスでこのメッセージを扱うので、example/Top.propertiesに配置します。

次に、アプリケーション内でこのメッセージを取り出し、エラーメッセージやワーニングメッセージとして表示させる方法を紹介します。まずメッセージの取り出しですが、この操作はアクションクラス内で下記のようにして行います。

リスト20: メッセージの取り出すためのコード

package example;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;

public class Top extends ActionSupport implements SessionAware {
    ....省略....
    public String execute() throws Exception {
        System.out.println(this.getClass().getName() + "!execute() in");    

        // setAttention("Please login!");
        String msg = getText("message.attention");
        setAttention( msg );

        return "success";
    }
    ....省略....

メッセージを操作するクラスでは、ActionSupportというStruts 2が提供するクラスを継承します。ActionSupportクラスはStruts 2がアクションクラスに対して提供する様々な便利な機能を実装したクラスで、メッセージの操作以外にも入力値検証用メソッドなどの実装を提供しています。実際には機能毎のインタフェースを実装した便利なクラスとして提供されており、必要に応じて変更することになりますが、今回はActionSupportクラスをこのまま利用します。

メッセージ操作機能は、メッセージの取り出しと、エラーや通常のメッセージのStruts 2への登録機能が提供されています。メッセージ定義ファイルからのメッセージの取り出しは、例のようにgetTextメソッドにメッセージのキーを指定する事で行います。この指定によってメッセージの文字列が得られますので、例では前述の「アクションクラスの属性として保持し、JSPで参照する」で利用したattention属性にセットし、JSPで表示させるようにしています。

メッセージを定義したpropertiesファイルは、今回はアクションクラス名と同名で用意し、アクションクラスと同じパッケージに配置しています。Sturts 2ではこのようにする事で、アクションクラスが自動的にメッセージリソースを読み込むようになっています。さらに、複数のアクションクラスのメッセージをまとめて1つのpropertiesファイルで管理する方法もあります。これには2通りの実現方法があります。1つは、パッケージ内にpackage.propertiesというファイル名で配置する方法です。このようにする事で、同一パッケージ内にあるアクションクラスで共通のメッセージリソースを扱えるようになります。もう1つは、アプリケーション全体として1つのメッセージリソースファイルを用意する方法です。こちらの方法では、メッセージリソースファイル名を、struts.xmlに<constant>要素を用いて下記のように指定します。

リスト21: <constant>要素でメッセージリソースファイルを指定

<?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.custom.i18n.resources" value="MessageResources" /> 

    <package name="example" namespace="/example" extends="struts-default">
        ....略....

上記定義定義の場合、クラスパスの先頭のMessageResources.propertiesというファイルを参照する事になります。それぞれが重複して指定されていた場合、「クラス名と同名のpropertiesファイル」「package.propertiesファイル」「<constant>要素で指定されたpropertiesファイル」の順に参照されていきます。

Struts 2ではこのようにしてメッセージ文字列を外部定義ファイルとして定義できます。アクションクラスやパッケージと連動してメッセージを定義できるため、アプリケーション全体としてのキーの重複定義やファイル更新の問題を回避しやすく設計されており、非常に好感がもてます。