メッセージの標準化

今回のお題

今回のお題は、メッセージの標準化です。

プロパティファイルを用いて、メッセージを標準化していきます。

目次

  • メッセージの標準化とは
  • 標準化の方法
  • プロパティファイルとは
  • プロパティファイルの記述
  • メッセージの呼び出し(ビュー)
  • メッセージの呼び出し(ビュー以外)
  • 補足:プロパティファイルの読み込みについて

メッセージの標準化とは

メッセージの標準化とは、「どのページを見ても同じ内容のメッセージが表示されていること」を言います。

目的は、読み手のストレスを減らすことですね。

 

例えば、あるサイトにおいて、以下の2つの表現が混在していたらどうでしょうか。

  • キャッシュカードや通帳などの、口座番号が確認できるもの。
  • 通帳やキャッシュカードなどの、口座番号がわかるもの。

内容は同じはずなのですが、少しモヤっとしますよね。

このような表記の揺れをなくし、一つの表現に統一することを「メッセージの標準化」と言います。

標準化の方法

では、メッセージの標準化は具体的にどのようにして行うのでしょうか。

答えは簡単で、メッセージ内容を変数に代入しておいて、それをビューで呼び出す、という方法をとります。

 

例えば、あるコーポレートサイトでお問い合わせ先のメールアドレスを表示していたとします。

この場合、mailAddressという変数にメールアドレスを入れておけば、あとは変数を埋め込んだ箇所全てに表示ができます。

もし問い合わせ先のアドレスが変更になった場合であっても、大元の変数を更新するだけなので管理も簡単ですよね。

 

そして、この変数を管理するためのファイルが、次に出てくるプロパティファイルになります。

プロパティファイルとは

先ほど申し上げた通り、プロパティファイルは、「標準化したメッセージを変数に代入して管理するためのファイル」を指します。

 

通常、変数の定義というとコントローラで行います。

ですが、コントローラは遷移元のアクションで定義した変数のみを遷移先のビューに渡すという仕組みのため、同じ変数を五つのビューで用いるなら定義も5回必要になってしまいます。

 

一方でプロパティファイルで定義した変数については、全てのビューで参照可能です。

このため、標準化したいメッセージに関しては、プロパティファイルに記述することになります。

プロパティファイルの記述

プロパティファイルが何なのかがわかったところで、いよいよ中身を書いていきます。

 

まずはresourcesディレクトリの中にmessages.propertiesを作成し、その中に以下のように書いていきます(あくまで一例)。

 

userId=ユーザーID

password=password

 

他の言語で環境変数を設定するときなどもそうですが、=の前後の半角スペースなし、文末のセミコロンなしで記述します。

メッセージの呼び出し

メッセージを設定できたら、ビューから呼び出していきます。

<label for="userId" th:text="#{userId}"></label>

注意点としては、通常の変数が${変数}で呼び出すのに対して#{変数}と#付きで呼び出していることぐらいですね。

おまけ:メッセージの呼び出し(ビュー以外)

プロパティファイルで定義したメッセージは、ビュー以外から呼び出すこともできます。

ただし、その場合はひと手間かけることになります。

以下、参考までに手順を書いておきます。

 

例として、Service内に直接記述していた注意喚起のメッセージを、プロパティファイルから参照する形に変更する場合を考えます。

 

変更前

public Map<Integer, String> getAlertMap(){
    Map<Integer, String> alertMap = new LinkedHashMap();

    alertMap.put(1, "遅刻・欠席の場合にはあらかじめご連絡ください");

    alertMap.put(2, "ご不明点は担当者までメールもしくはお電話でお問い合わせください");

    return alertMap;

}

 

変更後

// プロパティファイルを編集

message_1=遅刻・欠席の場合にはあらかじめご連絡ください

message_2=ご不明点は担当者までメールもしくはお電話でお問い合わせください

// serviceを修正

// MessageSourceとLocaleのimportを追加

import jave.util.locale;

import org.framework.context.MessageSource;

// MessageSourceをインスタンスフィールド化

@Autowired

private MessageSource messageSource;

// プロパティファイルからメッセージを取得

String message1 = messageSource.getMessage("message_1", null, Locale.JAPAN);

String message2 = messageSource.getMessage("message_2", null, Locale.JAPAN);

// 取得したメッセージをMapに追加

alertMap.put(1, message_1);

alertMap.put(2, message_2);

return alertMap;

 

解説

この作業の鍵は、getMessageメソッドですね。

これはMessageSourceクラスのインスタンスメソッドで、第一引数に指定した文字列をキーとするメッセージをプロパティファイル内から見つけ出して返すという役割を持っています。

第二引数は埋め込みメッセージで第三引数は地域設定ですね。

補足:プロパティファイルの読み込みについて

プロパティファイルの読み込みについては、デフォルトの読み込み経路がresourcesディレクトリの直下に設定されています。

もし、この経路以外に配置されているプロパティファイルを参照したい場合には、applicaton.propertiesファイルにおいて、以下の一文を追加してください。

spring.messages.basename="resourcesディレクトリからの相対パス(拡張子不要)"