SAStruts+freemarkerでEnumを使ってみる
SAStrutsとfreemarkerを使っているときに、
Enumをテンプレート内で使えたらいいなと思っていたけれど
そのままでは手軽に使うことができなかった
デフォルトでは、以下のようにMapのフィールドに設定することで、
パッケージ名指定で使うことができる
*Action.java
public Map map = new Hashtable(); //省略 map.put("enums", BeansWrapper.getDefaultInstance().getEnumModels());
以下のようにFreeMarker上で使うことができる
*.ftl
${map.enums["java.app.enumeration.TestEnum"].OK}
自分で作ったEnumクラスを使う場合、パッケージ名指定は不便だったりするので
以下のクラスを作ってみた
public class EnumViewUtil { protected EnumViewUtil() { } public static Map<String, Object> toMap(Class clazz) { Object obj[] = clazz.getEnumConstants(); if(obj == null) return null; Map<String, Object> map = new LinkedHashMap<String, Object>(); for(int i = 0; i < obj.length; i++) { Enum value = (Enum)obj[i]; map.put(value.name(), value); } return map; } }
使う場合は以下のようにする
*Action.java
public Map<String, Object> testEnum= EnumViewUtil.toMap(TestEnum.class);
*.ftl
${testEnum.OK}
ちょっと便利になった。もっといい方法あるのかなぁ
ちなみに、staticフィールドを表示する場合は、以下のクラスで利用できる
public class StaticViewUtil { protected StaticViewUtil() { } public static Map toMap(Class clazz) { Map map = new LinkedHashMap(); if(!Modifier.isPublic(clazz.getModifiers())) return null; Field fields[] = clazz.getFields(); for(int i = 0; i < fields.length; i++) { Field field = fields[i]; int mod = field.getModifiers(); if(!Modifier.isPublic(mod) || !Modifier.isStatic(mod)) continue; try { map.put(field.getName(), field.get(clazz)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return map; } }
使い方はEnumの時と一緒でOK
ちなみに、Mapに変換するためのソースは、FreeMarker内のソースをほとんどそのままコピペしました