ofbiz中FreeMarkerWorker的makeConfiguration方法

            这个方法是说明了为什么在ftl中可以使用一些java方法

            1.代码展示

public static Configuration makeConfiguration(BeansWrapper wrapper) {
        /**
         * freemarker.template.Configuration实例并调整其设置。
         * 一个Configuration实例是存储FreeMarker应用程序级别设置的中心。
         * 另外,它处理预先解析的模板(即 对象)的创建和 缓存Template
         * */
        Configuration newConfig = new Configuration(version);

        /**
         * @author jack
         *
         * 对象包装器
         * wrapper == >freemarker.ext.beans.BeansWrapper
         * 这是一个最原始的对象包装器,主要用来映射java
         * 虽然原始,但是也有使用的时候,比如collection-s和map-s被允许修改模板时执行
         * 参考资料 http://freemarker.org/docs/pgui_misc_beanwrapper.html
         * */
        newConfig.setObjectWrapper(wrapper);

        /**
         * @author jack
         *
         * 从beanswrapper返回TemplateHashModel。
         * getstaticmodels()可以用来访问静态方法和任意一类的字段创建哈希模型。
         * */
        TemplateHashModel staticModels = wrapper.getStaticModels();

        /**
         * @author jack
         * 将TemplateHashModel通过Static注入 以后就可以直接通过Static进行访问
         * Shared variables共享变量是为所有模板定义的变量
         * 形式:statics["java.lang.System"].currentTimeMillis() 这是一种调用java方法的处理方式 ftl中的用法
         * */
        newConfig.setSharedVariable("Static", staticModels);

        /**
         * @author jack
         *
         * #assign ls = EntityQuery.use(delegator).from("DictType").()     ftl中的用法
         * 注入后就可以直接使用EntityQuery了
         * */

        try {
            newConfig.setSharedVariable("EntityQuery", staticModels.get("com.hanlin.fadp.entity.util.EntityQuery"));
        } catch (TemplateModelException e) {
            Debug.logError(e, module);
        }
        /**
         * @author jack
         *
         * 当一个模板包含另一个模板时,它试图加载以相同的本地化环境加载模板。
         * 假定你的模板以本地化en_US来加载,那就意味着是U.S. English。当你包含另外一个模板:那么引擎实际上就会寻找一些模板,并按照这个顺序:
         * footer_en_US.ftl
         * footer_en.ftl
         * footer.ftl
         * 设置成为false就不会有这些问题
         * */
        newConfig.setLocalizedLookup(false);

        //创建StringUtil这个工具类共享变量
        newConfig.setSharedVariable("StringUtil", new BeanModel(StringUtil.INSTANCE, wrapper));

        /**
         * @author jack
         *
         * 如果在这些内建的模版加载器中没有一个符合你的要求,
         * 那么你可以自己定制一个模版加载器,只需要实现freemarker.cache.TemplateLoader 接口就可以了,
         * 然后通过方法setTemplateLoader(TemplateLoader loader)把其传递给Configuration对象。
         * 主要业务处理不是很清楚
         * */
        newConfig.setTemplateLoader(new FlexibleTemplateLoader());

        /**
         * @author jack
         *
         * 导入库也就是说,它创建一个新的空命名空间 然后执行path在该命名空间中使用参数给出的模板
         * 导入法则:
         * #import "/lib/example.ftl" as e
         * <@e.copyright date="1999-2002"/>
         * 属性文件中的模板就是通过这种方式加载进去
         * 所以在调用的时候需要加入命令空间
         * */
        newConfig.setAutoImports(UtilProperties.getProperties("freemarkerImports"));

        /**
         * @author jack
         *
         * 自定义类实现TemplateExceptionHandler
         * 当ftl渲染出现异常调用这个类的handleTemplateException
         * */
        newConfig.setTemplateExceptionHandler(new FreeMarkerWorker.OFBizTemplateExceptionHandler());

        try {
            newConfig.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss.SSS");
            newConfig.setSetting("number_format", "0.##########");
        } catch (TemplateException e) {
            Debug.logError("Unable to set date/time and number formats in FreeMarker: " + e, module);
        }

        // Transforms properties file set up as key=transform name, property=transform class name

        /**
         * @author jack
         *
         * 获取上下文加载器,当前加载器在webapp,随意加载其中config的freemarkerTransforms.properties所有值
         * */
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        Enumeration<URL> resources;
        try {
            resources = loader.getResources("freemarkerTransforms.properties");
        } catch (IOException e) {
            Debug.logError(e, "Could not load list of freemarkerTransforms.properties", module);
            throw UtilMisc.initCause(new InternalError(e.getMessage()), e);
        }

        /**
         * @author jack
         *
         * 创建其中资源文件值得实例并通过key用setSharedVariable设置进入共享变量
         * */
        while (resources.hasMoreElements()) {
            URL propertyURL = resources.nextElement();
            Debug.logInfo("loading properties: " + propertyURL, module);
            Properties props = UtilProperties.getProperties(propertyURL);
            if (UtilValidate.isEmpty(props)) {
                Debug.logError("Unable to locate properties file " + propertyURL, module);
            } else {
                loadTransforms(loader, props, newConfig);
            }
        }

        return newConfig;
    }

            2.用例说明

            2.1static           

<#assign displayApps = Static["org.ofbiz.webapp.control.LoginWorker"].getAppBarWebInfos(security, userLogin, ofbizServerName, "main")>

           2.2StringUtil

 <link rel="shortcut icon" href="<@ofbizContentUrl>${StringUtil.wrapString(shortcutIcon)}</@ofbizContentUrl>" />

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

.NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置。值得推荐的做法就是采用《.NET Cor...

17210
来自专栏菩提树下的杨过

rpc框架之avro 学习 1 - hello world

avro是hadoop的一个子项目,提供的功能与thrift、Protocol Buffer类似,都支持二进制高效序列化,也自带RPC机制,但是avro使用起来...

22110
来自专栏fixzd

redis系列:通过通讯录案例学习hash命令

这一篇文章将讲述Redis中的hash类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了。

611
来自专栏青玉伏案

JavaEE开发之Spring中的多线程编程以及任务定时器详解

上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于《JavaEE开发之Spring中的事件发送与监听以及使...

1937
来自专栏一个会写诗的程序员的博客

Groovy&Java动态编译执行

工作中,遇到部分业务经常动态变化,或者在不发布系统的前提下,对业务规则进行调整。那么可以将这部分业务逻辑改写成Groovy脚本来执行,那么就可以在业务运行过程中...

712
来自专栏Android点滴积累

adb shell 查看系统属性(用来判断特殊的操作系统)

一般来讲,在android程序开发中进行需要判断设备类型和系统版本 1、设备类型判断(android.os.Build.MODEL) 比如判断属于Google ...

18810
来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:练习——单身狗租赁系统

1684
来自专栏开发技术

spring-boot-2.0.3不一样系列之源码篇 - springboot源码一,绝对有值得你看的地方

  上篇:spring-boot-2.0.3不一样系列之shiro - 搭建篇,实现了spring-boot与shiro的整合,效果大家也看到了,工程确实集成了...

692
来自专栏Spark学习技巧

JAVA中序列化和反序列化中的静态成员问题

关于这个标题的内容是面试笔试中比较常见的考题,大家跟随我的博客一起来学习下这个过程。

712
来自专栏生信宝典

分子对接简明教程 (二)

用PyMOL展示配体和受体相互作用的原子和氢键 为了简化展示过程,我们设计了一个pml脚本 (脚本内有很详细的解释),只需要修改脚本里面受体和配体的名字,然后在...

2365

扫描关注云+社区