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就不粘贴出来了,大家主要看关键部分就行了.