Spring为FreeMarker提供了一个FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供FreeMarkerTemplateUtils工具类来完成解析模板的任务。
下面以用户注册成功后发送的模板文件registerUser.ftl,将该文件放在src/mailTemplate下:
6.1 模板文件
- <html>
- <head>
-
<meta http-equiv="content-type" content="text/html;charset=utf8">
- </head>
- <body>
-
恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font>
- </body>
- </html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf8">
</head>
<body>
恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font>
</body>
</html>
上面的${username}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性,如${user.Id}则表示user对象的Id属性。
6.2 使用FreeMarker模板技术构造邮件内容
package com.bb.spring.email;
import org.springframework.ui.freemarker.*;
import org.springframework.web.servlet.view.freemarker.*;
import freemarker.template.*;
import ......
public class TemplateEmailService {
private JavaMailSender sender;
private FreeMarkerConfigurer freeMarkerConfigurer=null;//FreeMarker的技术类
public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
public void setSender(JavaMailSender sender) {
this.sender = sender;
}
//通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。
private String getMailText(String username){
String htmlText="";
try {
//通过指定模板名获取FreeMarker模板实例
Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl");
//FreeMarker通过Map传递动态数据
Map map=new HashMap();
map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配
//解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。
htmlText=FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return htmlText;
}
//发送模板邮件
public void sendTemplateMail(String username) throws MessagingException{
MimeMessage msg=sender.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf8");//由于是html邮件,不是mulitpart类型
helper.setFrom("dongsanbo@sina.com");
helper.setTo("dongsanbo@sina.com");
helper.setSubject("注册成功-模板邮件");
String htmlText=getMailText(username);//使用模板生成html邮件内容
helper.setText(htmlText, true);
sender.send(msg);
System.out.println("成功发送模板邮件");
}
public static void main(String[] args) throws MessagingException {
// TODO Auto-generated method stub
ApplicationContext ctx = new FileSystemXmlApplicationContext(
"src/applicationContext.xml");
TemplateEmailService ms=(TemplateEmailService) ctx.getBean("templateEmail");
//发送模板邮件
ms.sendTemplateMail("yefriend");
}//end method
}
6.3 applicationContext.xml配置文件
<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录-->
<property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->
<props>
<prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->
<prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
<prop key="locale">zh_CN</prop><!-- 本地化设置-->
</props>
</property>
</bean>
<bean id="templateEmail" class="com.bb.spring.email.TemplateEmailService">
<property name="sender" ref="mailsender"></property>
<property name="freeMarkerConfigurer" ref="freeMarker"></property>
</bean>
在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。
至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。
下面是自己的扩展:
实际项目中我们想要动态的指定数据源和模版,就需要如下构造获取方法:
这样就可以如下获取数据:
如果发件人固定,我们还可以让TemplateEmailService 继承org.springframework.mail.SimpleMailMessage这个类,以使用其中的From或to属性
我的类:
public class SimpleMailSender extends SimpleMailMessage {
private JavaMailSender sender;
private MimeMessageHelper messageHellper;
private FreeMarkerConfigurer freeMarkerConfigurer;
使用:
//类属性
public SimpleMailSender mailSender;
//方法中
Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...);
String html = mailSender.getMailHtml(map, "amendmentPending.ftl");
MimeMessage mimeMessage = mailSender.GetSender().createMimeMessage();
MimeMessageHelper messageHellper = new MimeMessageHelper(mimeMessage, true, "utf-8");
messageHellper.setSubject(amendSubjectToUser);
messageHellper.setFrom(mailSender.getFrom());
//如果不继承,自定义类SimpleMailSender中就无from、to方法,就不可从配置文件中获取
xml配置:
<bean id="mailSender"
class="com.techson.himsnanhwa.admin.mail.SimpleMailSender">
<property name="javaMailSender"><ref bean="sender"/></property>
<property name="freeMarkerConfigurer" ref="freeMarker"></property>
<property name="from">
<value>wy@techson.com.hk</value>
</property>
<property name="to">
<value>ming@techson.com.hk</value>
</property>
</bean>
<!--配置邮件模板-->
<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/mailTemplete"/>
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">15</prop>
<prop key="default_encoding">UTF-8</prop>
<prop key="locale">zh_CN</prop>
</props>
</property>
</bean>
<bean id="sender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>192.168.108.6</value>
</property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.timeout">25000</prop>
</props>
</property>
<property name="username">
<value>wy</value>
</property>
<property name="password">
<value>wy</value>
</property>
</bean>
。。。
发送带附件的邮件:
MimeMessage message = mailSender.GetSender().createMimeMessage();
MimeMessageHelper messageHellper = new MimeMessageHelper(message, true, "utf-8");
messageHellper.setSubject(subject);
messageHellper.setFrom(formMap.get("couemail") + "");
messageHellper.setFrom(sender);
Multipart mp = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
File file = new File("E:\\hotel_" + filename + ".xls");
FileDataSource fds=new FileDataSource(file);
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
message.setContent(mp);
message.saveChanges();
发送成功后可使用
fds.getFile().delete();
删除文件!
或:
String path = ServletActionContext.getServletContext().getRealPath("/download/");
String destinct = path + "/" + fileName + ".zip";
Resource file = new ServletContextResource(ServletActionContext.getServletContext(),destinct);
helper.addAttachment("hotel_nh_"+countryCode + ".zip", file.getFile());
或:
message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
。。。
分享到:
相关推荐
在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)以及各种集成服务。...当Spring与Freemarker结合时,我们可以利用它们来创建动态邮件,提供个性化的用户体验。...
String generatedHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template, dataModel); System.out.println(generatedHtml); } catch (IOException | TemplateException e) { e.printStackTrace(); ...
return FreeMarkerTemplateUtils.processTemplateIntoString(t, model); // 使用FreeMarkerConfiguration Template t = freeMarkerConfiguration.getTemplate(templateName); return FreeMarkerTemplateUtils....
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import ...
在Spring中,我们可以通过`FreeMarkerConfigurer`配置FreeMarker,并通过`FreeMarkerTemplateUtils`来渲染模板。例如,我们可以创建一个`.ftl`文件,其中包含邮件的HTML结构,然后在代码中将数据模型绑定到模板,...
String processedHtml = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("demo.ftl"), data); // 创建PDF文档 Document document = new Document(); PdfWriter.getInstance...
以及`FreemarkerTemplateUtils`等辅助工具类,帮助简化FreeMarker的使用。 总的来说,FreeMarker是一个强大而灵活的模板引擎,它允许开发者将业务逻辑与视图呈现分离,提高代码的可维护性和可测试性。通过学习和...
例如,如果使用FreeMarker,我们可以创建一个`.ftl`文件,然后用`FreeMarkerTemplateUtils.processTemplateIntoString()`方法将数据和模板结合。 4. **文件写入**:生成的HTML字符串需要写入到磁盘上的文件中,形成...
例如,通过Spring的`FreeMarkerConfigurer`配置FreeMarker,然后使用`FreeMarkerTemplateUtils`将模型数据与模板合并,生成最终的输出。这样的组合提供了强大的视图层解决方案,尤其适用于构建动态Web应用和企业级...
5. **合并数据**:使用`FreeMarkerTemplateUtils`等工具,将数据模型与模板合并。 6. **返回响应**:Servlet将合并后的HTML内容作为HTTP响应返回给客户端。 在实际开发中,常常会借助如Spring MVC这样的框架,自动...
在Freemarker的场景中,Servlet通常负责准备数据模型,然后使用`FreemarkerTemplateUtils`或`FreeMarkerServlet`将模型渲染成HTML并返回给客户端。 4. **模板文件编写**: Freemarker模板文件扩展名为`.ftl`。模板...
然后,创建一个Java类,设置需要的数据模型,并使用`FreeMarkerTemplateUtils`将模板和数据模型合并,生成最终的HTML字符串。 3. FreeMarker生成XML: 生成XML文档与生成HTML类似,只需将模板设计为XML格式。变量...
Spring Boot提供了`FreemarkerTemplateUtils`工具类,可以帮助我们方便地处理模板和数据模型的合并。 ```java @Autowired private FreeMarkerConfig freeMarkerConfig; @GetMapping("/download") public Response...
这里,我们可以使用`FreemarkerTemplateUtils`类来渲染模板,然后利用Apache POI来将渲染后的HTML转换为Word文档: ```java import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf....
FreeMarkerTemplateUtils FreeMarkerView FreeMarkerViewResolver GeneratedKeyHolder GenericApplicationContext GenericBeanFactoryAccessor GenericCollectionTypeResolver GenericFilterBean ...
- 测试模板:可以通过Servlet或Controller读取模板,结合数据模型生成输出,例如使用`FreeMarkerTemplateUtils`: ```java Map, Object> model = new HashMap(); model.put("user", user); String output = ...
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); mailSender.send(mimeMessage); } catch (TemplateException e) { e.printStackTrace(); }...
private FreeMarkerTemplateUtils templateUtils; public void sendWelcomeEmail(String toEmail, User user) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(toEmail); message....