freemarker + spring 配置和最简单的例子
Posted
技术标签:
【中文标题】freemarker + spring 配置和最简单的例子【英文标题】:freemarker + spring configuration and simplest example 【发布时间】:2015-05-11 16:24:44 【问题描述】:尽管有很多关于 freemarker + spring 的讨论,但很难找到整洁的工作示例来复制和运行。 您能否提供最简单的 freemarker 在 spring xml 上下文中的工作配置和 java 代码 sn-p 以从资源文件加载模板并进行处理。
【问题讨论】:
本示例使用基于 java 的配置,并且仍在使用 Web 项目,但这是我引用的:github.com/edendramis/freemarker-example 官方文档:docs.spring.io/spring/docs/current/spring-framework-reference/… 【参考方案1】:最佳工作示例。您可以下载源代码here。
【讨论】:
感谢您的回复,我已经浏览过这个博客,很好。但它与 Web 项目布局紧密结合。我正在寻找的是“从资源加载模板并替换占位符”尽可能简单。【参考方案2】: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
类有一些有趣的属性,例如 ClassForTemplateLoading
加载与某个类相关的资源或使用 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")
【讨论】:
【参考方案3】:在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注入。
【讨论】:
【参考方案4】:除了 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 配置和最简单的例子的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVC4 + Spring + MyBatis3 基于注解的最简配置