freemarker的DatabaseTemplateLoader从数据库中获取模板信息

22 篇文章 0 订阅
5 篇文章 0 订阅
import com.kingnet.xyzs.orm.dao.DmsMdTemplateConfigMapper;
import com.kingnet.xyzs.orm.entity.DmsMdTemplateConfig;
import freemarker.cache.TemplateLoader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.Reader;
import java.io.StringReader;

/**
 * Created by xiaoj on 2016/9/8.
 */
@Component("databaseTemplateLoader")
public class DatabaseTemplateLoader implements TemplateLoader {

    @Autowired
    private DmsMdTemplateConfigMapper dmsMdTemplateConfigMapper;//注入了一个mybatis dao mapper

    @Override
    public Object findTemplateSource(String name) {
        try {
            Integer templateId = Integer.valueOf(name);
            //通过id查询数据库中配置的模板信息
            DmsMdTemplateConfig config = dmsMdTemplateConfigMapper.selectByPrimaryKey(templateId);
            //数据库表必须有一个最后更新字段用来刷新缓存,数据库中的模板保存字段为query,这里通过model.getQuery获取
            return new StringTemplateSource(name, config.getQuery(), config.getUpdatetime().getTime());
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public long getLastModified(Object templateSource) {
        return ((StringTemplateSource) templateSource).lastModified;
    }

    @Override
    public Reader getReader(Object templateSource, String encoding) {
        return new StringReader(((StringTemplateSource) templateSource).source);
    }

    @Override
    public void closeTemplateSource(Object templateSource) {
        //do nothing
    }

    private static class StringTemplateSource {
        private final String name;
        private final String source;
        private final long lastModified;

        StringTemplateSource(String name, String source, long lastModified) {
            if (name == null) {
                throw new IllegalArgumentException("name == null");
            }
            if (source == null) {
                throw new IllegalArgumentException("source == null");
            }
            if (lastModified < -1L) {
                throw new IllegalArgumentException("lastModified < -1L");
            }
            this.name = name;
            this.source = source;
            this.lastModified = lastModified;
        }

        public boolean equals(Object obj) {
            if (obj instanceof StringTemplateSource) {
                return name.equals(((StringTemplateSource) obj).name);
            }
            return false;
        }

        public int hashCode() {
            return name.hashCode();
        }
    }

    @Override
    public String toString() {
        return "DatabaseTemplateLoader(db=\"db_stat\", table=\"DMS_MD_TEMPLATE_CONFIG\")";
    }


}



freemarker 配置:

 <!-- 配置freeMarker的模板路径 -->
    <bean id="freemarkerConfig" name="freemarkerConfig"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/templates/"/>
        <!-- 自定义数据库TemplateLoader -->
        <property name="postTemplateLoaders" ref="databaseTemplateLoader" />
        <property name="freemarkerVariables">
            <map>
                <entry key="xml_escape" value-ref="fmXmlEscape"/>
                <!--<entry key="webRoot" value="${webRoot}"/>-->
                <!--<entry key="jsRoot" value="${jsRoot}"/>-->
            </map>
        </property>
        <!-- FreeMarker默认每隔5秒检查模板是否被更新,如果已经更新了,就会重新加载并分析模板。 但经常检查模板是否更新可能比较耗时。如果你的应用运行在生产模式下,而且你预期模板不会经常更新,
            则可以将更新的延迟时间延长至一个小时或者更久。 可以通过为freemarkerSettings属性设置template_update_delay达到这一目的 -->
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">5</prop>
                <prop key="tag_syntax">auto_detect</prop>
                <!-- 设置标签类型 两种:[] 和 <> 。[] 这种标记解析要快些 -->
                <prop key="default_encoding">UTF-8</prop>
                <prop key="output_encoding">UTF-8</prop>
                <prop key="locale">zh_CN</prop>
                <prop key="date_format">yyyy-MM-dd</prop>
                <prop key="time_format">HH:mm:ss</prop>
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="number_format">#</prop>
                <!-- 设置数字格式 以免出现 000.00 -->
                <prop key="classic_compatible">true
                </prop>
                <!-- 可以满足一般需要。默认情况变量为null则替换为空字符串,如果需要自定义,写上${empty!"EmptyValue of fbysss"}的形式即可  -->
                <prop key="template_exception_handler">html_debug</prop>
                <!-- ignore,debug,html_debug,rethrow -->
            </props>
        </property>
        <!-- 一下语句可以也可以配置freemarkerSettings属性,代码更为简洁 -->
        <!-- <property name="freemarkerSettings" ref="freemarkerConfiguration"></property> -->
    </bean>

    <!--<bean id="freemarkerConfiguration"-->
    <!--class="org.springframework.beans.factory.config.PropertiesFactoryBean">-->
    <!--<property name="location" value="classpath:conf/freemarker.properties" />-->
    <!--</bean>-->

    <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
主要是这个属性,配置上为自己的databaseTemplateLoader:
 <!-- 自定义数据库TemplateLoader -->
        <property name="postTemplateLoaders" ref="databaseTemplateLoader" />

获取模板内容:

FreeMarkerConfigurer freemarkerConfig = applicationContext.getBean("freemarkerConfig", FreeMarkerConfigurer.class);
        Configuration cfg = freemarkerConfig.getConfiguration();
//        String templatePath = submitJobRequest.getProject() + "." + submitJobRequest.getTemplate() + ".ftl";
//        Template temp = cfg.getTemplate(templatePath);
        Template temp = cfg.getTemplate(submitJobRequest.getId());
        StringWriter writer = new StringWriter();
        temp.process(delegate, writer);
        String query = writer.toString();
        writer.close();

代码粘贴的不全,其他的一些javabean就不粘贴出来了,大家主要看关键部分就行了.


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值