freemarker调用java静态方法以及枚举

Freemarker渲染视图采用的是一个 模型+数据 = 页面  的方式,这也是模板渲染引擎的通用模式,对于freemarker渲染页面的时候一些特殊的数据格式转换、随机数获取等需求,如果很难通过freemarker本身的标签完成,可以通过调用java静态方法来完成。前提是这个方法必须是静态。允许传递参数。

实现这个需求,使用的便是freemarker的BeansWrapper这个类,他借用TemplateHashModel可以从web容器中获取指定类名的bean并通过传统的如spring的ModelMap.setAttribute方式传递给ModelMap,然后页面可以根据指明的名称,使用$符号调用即可。

举个例子:

 

 

  1. // 需要注入给freemarker使用的class
  2.     @SuppressWarnings("rawtypes")
  3.     private static Class[] defaultStaticClasses={ PhotographyStringUtils.class,
  4.                                     RandomStringUtils.class,
  5.                                     StringUtils.class,
  6.                                     NumberUtils.class,
  7.                                     RandomUtils.class};
  8.     /**
  9.      * 将class的引用注入给freemarker,作用域为request
  10.      * @param modelMap
  11.      */
  12.     @SuppressWarnings("rawtypes")
  13.     protected static void setDefaultStaticModel(ModelMap modelMap) {
  14.         for (Class clz : defaultStaticClasses) {
  15.             String name = clz.getSimpleName();
  16.             modelMap.addAttribute(name, getStaticModel(clz));
  17.         }
  18.     }
  19.     /**
  20.      * 获取freemarker可使用的bean
  21.      * @param clz 类型
  22.      * @return
  23.      */
  24.     @SuppressWarnings("rawtypes")
  25.     private static Object getStaticModel(Class clz) {
  26.         BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
  27.         try {
  28.             return wrapper.getStaticModels().get(clz.getName());
  29.         } catch (TemplateModelException e) {
  30.             e.printStackTrace();
  31.         }
  32.         return null;
  33.     }

 

页面调用:

 

  1. ${PhotographyStringUtils.getTimeStrFromLong(_item.orderBeginTime,"yyyy-MM-dd")}

 

 

方法的调用通过反射去执行,但是如果这个方法的参数是一个泛型T怎么办呢?如何调用enum呢?

在下面找答案

http://freemarker.sourceforge.net/docs/pgui_misc_beanwrapper.html#beanswrapper_hash

 

参考资料:http://blog.csdn.net/quzishen/article/details/6044615

标签: Freemarker模板, J2EE 基础技术, Freemarker静态化, Java页面静态化

添加新评论