Struts2:properties(プロパティファイル)の設定と取得 | プログラム垂れ流し

Struts2:properties(プロパティファイル)の設定と取得

とりあえずなんらかのプロパティファイルを設定する。
ここでは、Struts2特有のパッケージ名.propertiesとか、アクション名.propertiesのやりかたはしない。

アクション毎に作るのはファイルが増えてうっとうしいので、
struts.xmlにて使うプロパティファイルを定義する方法を採用します。

とりあえず。プロパティファイルを作らないと話にならないので、作ります。
たぶんメッセージと設定とか、複数使う事が多いので、2個くらい作っておきます。

confg_ja.properties
--------------------------------------
sample.test=てすと
db.class=com.mysql.jdbc.Driver
db.url=jdbc:mysql://{0}/{1}
db.host=localhost
db.schema=hoge
db.user=hogeuser
db.pass=hogepass
--------------------------------------

message_ja.properties
--------------------------------------
hoge.test2=ほーげー!!
--------------------------------------
i18nを使うので、名前の最後に"_ja"とつける事で国際化対応できます。
_jaに日本語、_enに英語で設定ファイルを記述すればよいわけです。
そうすれば、地域のロケーションによりi18nで使うファイルを選んでくれます。
便利ですね。

次にstruts.xmlに設定します。

struts.xml(一部抜粋)
--------------------------------------
<struts>
    <!-- プロパティファイル -->
    <constant name="struts.custom.i18n.resources" value="config,message"/>
--------------------------------------
ファイルはカンマ区切りで設定できます。
設定する時は、ロケーションを付加しない所に注意してください。
これでとりあえず設定は終わりです。

やりがちな悪い例は以下の通り。
<constant name="struts.custom.i18n.resources" value="config"/>
<constant name="struts.custom.i18n.resources" value="message"/>
ってやると、struts.custom.i18n.resourcesを2回設定してる事になるので、最初のやつが上書きされてmessageしか使えなくなります

次に実装

画面で取得するjsp側とJava側で取得するパターンがあると思うので、両方書いておきます。

とりあえずjava側
ActionSupportクラスのgetTextメソッドにて取得できます。
Actionクラスでは元々継承しているので宣言する必要はありませんね。
DAOとか自分で作ったクラスで使いたい場合は、ActionSupportを継承するか、
インスタンス生成してgetTextを呼び出す感じになるかと思います。

私の以前作ったDAOのコネクション作成部分をサンプルとしてメモしておきます。

hogehogeDao.java
--------------------------------------
/**
* コネクションを取得する。
*/
private void getConnection(){
    try{
        ActionSupport as = new ActionSupport();
        Class.forName(as.getText("db.class"));
        String dbUrl = as.getText("db.url",new String[]{as.getText("db.host"),as.getText("db.schema")});
        conn = DriverManager.getConnection(dbUrl, as.getText("db.user"), as.getText("db.pass"));
        conn.setAutoCommit(false);
    }catch(SQLException e){
        e.printStackTrace();
        this.roleBack();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        this.roleBack();
    }
}
--------------------------------------
Connectionはクラス内変数として定義しています。

String dbUrl = as.getText("db.url",new String[]{as.getText("db.host"),as.getText("db.schema")});
はdb.url=jdbc:mysql://{0}/{1}
にString配列で宣言した値を埋め込んでいます。


こうゆう書き方も出来ます。String[]使うかList<Object>使うかはお好みですね。
List<Object> st = new ArrayList<Object>();
st.add(as.getText("db.host"));
st.add(as.getText("db.schema"));
String dbUrl = as.getText("db.url",st);

validatorの場合、
@RequiredStringValidator(key="sample.test")
で取得できます。

次にjsp側での取得方法です。

<s:text name="sample.test"/>

でいけるっぽいです。
え?って感じですね。