freemarker + spring 配置和最简单的例子
freemarker + spring configuration and simplest example
尽管有很多关于 freemarker + spring 的讨论,但是很难找到可以复制和 运行.
的简洁的工作示例
您能否在 spring xml 上下文中提供 freemarker 的最简单工作配置和 java 代码片段以从资源文件加载模板并进行处理。
最佳工作示例。您可以下载源代码 here.
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
applicationContext.xml
<bean id="freeMarkerConfigurationFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:/META-INF/freemarker"/>
<property name="preferFileSystemAccess" value="false"/>
</bean>
AlertMailComposer.java
import static org.springframework.ui.freemarker.FreeMarkerTemplateUtils.processTemplateIntoString;
@Component
public class AlertMailComposer implements Processor {
public static final String TEMPLATE = "AlertMail.ftl";
@Autowired
private Configuration freemarkerConfiguration;
protected String composeHtml(Alert alert) throws IOException, TemplateException {
return processTemplateIntoString(freemarkerConfiguration.getTemplate(TEMPLATE), ImmutableMap.of(
"alertType", alert.getAlertType(),
"message", alert.getMessage(),
"nodeName", alert.getEvent().getNodeName(),
"event", toJson(alert.getEvent(), true)
));
}
...
AlertMail.ftl
<html>
<body style="font-family:verdana;font-size:10">
<b>${alertType}: </b>${message}<br>
<b>on: </b>${nodeName}<br>
<p/>
<pre style="font-family:verdana;font-size:10;color:grey">
${event}
</pre>
</body>
</html>
Configuration
class 有一些有趣的属性,比如 ClassForTemplateLoading
加载相对于某些 class 的资源或使用 basePackagePath。类似于 Class.getResource
.
@Autowired
private FreeMarkerConfigurationFactory freeMarkerConfigurationFactory;
@Bean
public freemarker.template.Configuration negativeRatesFreeMarkerConfiguration() throws IOException, TemplateException {
freemarker.template.Configuration configuration = freeMarkerConfigurationFactory.createConfiguration();
configuration.setClassForTemplateLoading(getClass(), "/" + getClass().getPackage().getName().replace('.', '/'));
return configuration;
}
...
@Resource(name = "negativeRatesFreeMarkerConfiguration")
private Configuration freemarkerConfiguration;
...
freemarkerConfiguration.getTemplate("/service/emailReport.ftl")
在 spring 上下文 xml 中,声明 FreemarkerConfigurationFactoryBean
就足够了,即
<bean id="freemarkerConfigFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:templates/"/>
</bean>
如果使用@Autowired
注释,则无需在xml文件中进一步指定freemarker.template.Configuration
bean。它由工厂创建并由 Spring.
注入
除了 pom.xml 中的 maven 依赖项与 spring 中的 java 配置一起使用,您还可以 -
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { MyRootContextConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyServletContextConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/test/*" };
}
}
然后MyRootContextConfig
可以有
@Bean(name = "myFreeMarkerConfigruation")
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
return bean;
}
尽管有很多关于 freemarker + spring 的讨论,但是很难找到可以复制和 运行.
的简洁的工作示例
您能否在 spring xml 上下文中提供 freemarker 的最简单工作配置和 java 代码片段以从资源文件加载模板并进行处理。
最佳工作示例。您可以下载源代码 here.
pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
applicationContext.xml
<bean id="freeMarkerConfigurationFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:/META-INF/freemarker"/>
<property name="preferFileSystemAccess" value="false"/>
</bean>
AlertMailComposer.java
import static org.springframework.ui.freemarker.FreeMarkerTemplateUtils.processTemplateIntoString;
@Component
public class AlertMailComposer implements Processor {
public static final String TEMPLATE = "AlertMail.ftl";
@Autowired
private Configuration freemarkerConfiguration;
protected String composeHtml(Alert alert) throws IOException, TemplateException {
return processTemplateIntoString(freemarkerConfiguration.getTemplate(TEMPLATE), ImmutableMap.of(
"alertType", alert.getAlertType(),
"message", alert.getMessage(),
"nodeName", alert.getEvent().getNodeName(),
"event", toJson(alert.getEvent(), true)
));
}
...
AlertMail.ftl
<html>
<body style="font-family:verdana;font-size:10">
<b>${alertType}: </b>${message}<br>
<b>on: </b>${nodeName}<br>
<p/>
<pre style="font-family:verdana;font-size:10;color:grey">
${event}
</pre>
</body>
</html>
Configuration
class 有一些有趣的属性,比如 ClassForTemplateLoading
加载相对于某些 class 的资源或使用 basePackagePath。类似于 Class.getResource
.
@Autowired
private FreeMarkerConfigurationFactory freeMarkerConfigurationFactory;
@Bean
public freemarker.template.Configuration negativeRatesFreeMarkerConfiguration() throws IOException, TemplateException {
freemarker.template.Configuration configuration = freeMarkerConfigurationFactory.createConfiguration();
configuration.setClassForTemplateLoading(getClass(), "/" + getClass().getPackage().getName().replace('.', '/'));
return configuration;
}
...
@Resource(name = "negativeRatesFreeMarkerConfiguration")
private Configuration freemarkerConfiguration;
...
freemarkerConfiguration.getTemplate("/service/emailReport.ftl")
在 spring 上下文 xml 中,声明 FreemarkerConfigurationFactoryBean
就足够了,即
<bean id="freemarkerConfigFactory" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
<property name="templateLoaderPath" value="classpath:templates/"/>
</bean>
如果使用@Autowired
注释,则无需在xml文件中进一步指定freemarker.template.Configuration
bean。它由工厂创建并由 Spring.
除了 pom.xml 中的 maven 依赖项与 spring 中的 java 配置一起使用,您还可以 -
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { MyRootContextConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { MyServletContextConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/test/*" };
}
}
然后MyRootContextConfig
可以有
@Bean(name = "myFreeMarkerConfigruation")
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("classpath:/templates/");
return bean;
}