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 条评论
登录 后参与评论

相关文章

来自专栏Android开发指南

2.下拉刷新、二维码

3187
来自专栏我杨某人的青春满是悔恨

Kingfisher源码阅读(三)

上一篇地址:Kingfisher源码阅读(二) 第一篇地址:Kingfisher源码阅读(一)

854
来自专栏PHP技术

YII运行原理

应用执行流程: 浏览器向服务器发送 Http Request | 控制器(protected/controllers) | |—> Action | 创建模型 ...

3176
来自专栏游戏杂谈

Flex中ModuleManager的一个bug

在相对较为复杂或是多人协作的flex项目开发中,使用module进行开发是很平常的事情,而module的加载一般常用的有两种方法:

673
来自专栏向治洪

picasso图片缓存框架

picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓...

1888
来自专栏闻道于事

JFinal极速开发框架使用笔记

记录第一次使用JFinal,从简单的框架搭建到增删改查,从自带的方法到正常框架习惯的使用方式。  JFinal官网:http://www.jfinal.com/...

3947
来自专栏iOS Developer

详解持久化Core Data框架的原理以及使用---转自Bison的技术博客

1005
来自专栏JavaEE

Thymeleaf的使用前言:一、thymeleaf简介:二、thymeleaf标准方言:三、thymeleaf与springboot集成案例:总结:

最近听说thymeleaf好像也挺流行的,还说是spring官方推荐使用,那thymeleaf究竟是什么呢?spring为什么推荐用它呢?怎么用呢?本文将为你揭...

1082
来自专栏跟着阿笨一起玩NET

C#实现文件数据库

本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载。

491
来自专栏Coding迪斯尼

利用web work实现多线程异步机制,打造页面单步调试IDE

我们已经完成了整个编译器的开发,现在我们做一个能够单步调试的页面IDE,完成本章代码后,我们可以实现下面如图所示功能:

723

扫码关注云+社区