Javaで定義した定数をJavaScriptで使用する方法

Javaで定義した定数をJavaScriptで使用する方法を紹介する。

<手順概要>
1.Java側に定数を連携するためのActionクラスを作成する
2.JSPJavaScriptのソースとして1で作成したクラスのレスポンスを読み込む

<手順詳細>

[前提]
連携の対象となる定数クラスは、下記のものとする。

package jp.co.smp.cnst.common;

public class AppCnst {
	
	public static final int XXX_MAX_VAL = 100;
	
	public static final int XXX_MIN_VAL = 7;

}

1.Java側に定数を連携するためのActionクラスを作成する
actionパッケージに「ConstAction」クラスを作成する。

[ポイント]

  • java.lang.Classクラスの「getDeclaredFields()」メソッドでFieldを取得する
  • Fieldクラスの「getName()」メソッドでフィールド名を取得する
  • Fieldクラスの「get(Object obj)」メソッドでフィールドの値を取得する
  • レスポンスに名称付きのJSONデータを返す
package jp.co.smp.cnst.action;

import java.lang.reflect.Field;
import java.util.HashMap;
import jp.co.smp.cnst.common.AppCnst;
import net.arnx.jsonic.JSON;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ResponseUtil;

public class ConstAction {
	
	private static final String RESULT_NAME = "java_cnst=";
	
	@Execute(validator = false)
	public String getJavaConst() throws IllegalArgumentException, 
					    IllegalAccessException {

		//メンバ変数名、値の組み合わせを格納するためのマップ
		HashMap<String, Object> resultMap = new HashMap<String, Object>();

		//定数クラスのオブジェクトを生成
		AppCnst appCnst = new AppCnst();

		//クラスに定義されているメンバ変数名とその値をマップに格納する
		for (Field field : appCnst.getClass().getDeclaredFields()) {

			resultMap.put(field.getName(), field.get(appCnst));
		}

		//JSON形式のデータに名称をつけて結果データを作成する
		String result = RESULT_NAME + JSON.encode(resultMap);

		//レスポンスの設定
		ResponseUtil.write(result, "application/javascript");

		return null;
	}
}


HashMapからJSONへの変換は、「JSONIC」ライブラリを使用している。
使用するには、ビルドパスにライブラリとして登録する必要がある。
JSONIC公式サイト

2.JSPJavaScriptのソースとして1で作成したクラスのレスポンスを読み込む

[ポイント]

  • scriptタグの「src」に1で作成したアクションを指定する
  • 定数を使用したい時は「java_cnst.」+「使用する定数名」で参照する
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<%-- ↓↓↓↓↓ ポイント ↓↓↓↓↓ --%>

<script type="text/javascript" src="./const/"></script>

<%-- ↑↑↑↑↑ ポイント ↑↑↑↑↑ --%>

<script type="text/javascript">
function onExec(){
	alert("java.cnst.XXX_MAX_VAL:" + java_cnst.XXX_MAX_VAL);
}
</script>

<title>Java,JavaScript定数共通化</title>
</head>
<body>

<input type="button" value="実行" onclick="onExec()" />

</body>
</html>

<実行結果>

初期表示時のChrome「要素を検証(N)」の結果

<関連記事>
Javaで定義した定数をJavaScriptで使用する方法
Javaで定義したメッセージをJavaScriptで使用する方法

<お勧め書籍>