当前位置: 首页 > 面试题库 >

在Spring应用程序中从FreeMarker获取模板文本

姬雪松
2023-03-14
问题内容

在我的Spring应用程序中,我想使用FreeMarker生成将由我的应用程序发送的电子邮件文本。生成的文本将永远不会返回到视图,因此我不需要配置FreeMarker视图解析器。该文档似乎表明我应该像这样配置FreeMarkerConfigurationFactoryBean

<bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
   <property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>

配置完该bean之后,实际上如何获取具有特定变量Map的特定模板生成的文本。换句话说,之后是什么代码:

String templateName = "email"
Map templateVars = new HashMap();
templateVars.put("firstName", "john");
templateVars.put("surname", "doe");    
// Now how do I get the template text?

Spring模块似乎在Spring和FreeMarker之间提供了替代集成,这使得检索模板文本非常明显,但是除非绝对必要,否则我不希望在我的应用程序中添加其他依赖项。

另外,我是否需要向FreeMarkerConfigurationFactoryBean添加一些额外的配置以确保模板被缓存?

干杯,唐


问题答案:

这样的事情应该工作

在提供代码之前,请初始化:

MailSender mailSender = new JavaMailSenderImpl();
SimpleMailMessage message = new SimpleMailMessage();

然后,在代码之后,添加:

StringBuffer content = new StringBuffer();
try {
    content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
        configuration.getTemplate(templateName), templateVars));
} catch (IOException e) {
    // handle
} catch (TemplateException e) {
    // handle
}

message.setFrom(getMailFromName() + " <" + getMailFromAddr() + ">");
message.setTo(getMailTo());
if (getCcTo() != null)
    message.setCc(getCcTo());
message.setSubject(getSubject());
message.setText(content.toString());

mailSender.send(message);

这是我的applicationContext.xml:

<bean id="freemarkerMailConfiguration"
  class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPath" value="/WEB-INF" />
</bean>
<bean id="yourEmailServiceClass" class="YourEmailServiceClass">
    <property name="mailSender" ref="mailSender" />
    <property name="freemarkerMailConfiguration" ref="freemarkerMailConfiguration" />
    <property name="freemarkerTemplate" value="email.ftl" />
    <property name="mailFromName" value="John Q. Programmer" />
    <property name="mailFromAddr" value="john.q.programmer@mail.com" />
    <property name="subject" value="Email Subject" />
</bean>

还有您的缓存问题…

我只在’viewResolver’bean中看到了bean属性’cache’,您说过不会使用。

另请参阅:第14章。集成视图技术



 类似资料:
  • 我正在编写一个Spring Boot应用程序(java类),它调用另一个java类中的H2o predict方法。 我已经独立测试了这个java类,如果MOJO模型位于调用java的同一位置,我就可以读取它,并且可以进行预测。 使用Spring boot App,这一次我的maven项目编译的结果jar无法读取该zip。我使用标准的方式使用h2o提供的包装器读取MOJO zip文件。 我认为解决办

  • 问题内容: 有没有办法在Spring应用程序中静态/全局地请求ApplicationContext的副本? 假设主类启动并初始化了应用程序上下文,它是否需要通过调用堆栈将其向下传递给需要它的任何类,或者是否有一种方法可以让类要求先前创建的上下文?(我认为必须是单身人士?) 问题答案: 如果需要访问容器的对象是容器中的Bean,则只需实现BeanFactoryAware或ApplicationCon

  • 我是Spring的初学者。今天,当我在阅读Spring core文档时,我在第1.3章中发现了以下说明。Bean概述 除了包含关于如何创建特定bean的信息的bean定义外,ApplicationContext实现还允许注册(由用户)在容器外部创建的现有对象。这是通过getBeanFactory()方法访问ApplicationContext的BeanFactory来完成的,该方法返回BeanFa

  • 我正在使用freemarker模板生成电子邮件。我将freemarker与spring结合使用。我很难用参数替换来实现国际化。我用它来代替一个参数。例子: 消息你好=你好,{0} 在fm模板中,我有 然而,我无法弄清楚如何进行多参数替换。 消息你好{0},欢迎来到{1} 我如何在模板中表示这一点?当我尝试以下方法时: 它不起作用。你能帮忙吗?当做

  • 我的文件在src/main/Resources/freemarker/email_notification.txt 我无法读取freemaker文件,即电子邮件通知。txt,其中包含html文件。 我的推荐信来自这里:http://websystique.com/spring/spring-4-email-using-velocity-freemaker-template-library/ 我尝试

  • 使用Freemarker模板有两种不同的要求。一个是打印网页的某些部分,另一个是生成定制的HTML文件。我已将所有FTL文件放在路径WEB-INF/FTL/下,WEB应用程序从上述位置提取正确的FTL文件并打印网页。当我不得不生成HTML文件时,Freemarker无法找到相应的FTL文件。 我试图将特定的FTL文件保存在resources/FTL/下,但它仍然无法获取该文件。我在src下创建了一