前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ofbiz中FreeMarkerWorker的makeConfiguration方法

ofbiz中FreeMarkerWorker的makeConfiguration方法

作者头像
cfs
发布2018-03-08 15:22:42
8260
发布2018-03-08 15:22:42
举报
文章被收录于专栏:编码小白编码小白

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

            1.代码展示

代码语言:javascript
复制
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           

代码语言:javascript
复制
<#assign displayApps = Static["org.ofbiz.webapp.control.LoginWorker"].getAppBarWebInfos(security, userLogin, ofbizServerName, "main")>

           2.2StringUtil

代码语言:javascript
复制
 <link rel="shortcut icon" href="<@ofbizContentUrl>${StringUtil.wrapString(shortcutIcon)}</@ofbizContentUrl>" />
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档