我正在使用Spring MVC作为我的Web应用程序,而我正在使用 applicationContext.xml 用于配置我在 spring-servlet.xml 文件中注入控制器的电子邮件的文件。
我需要发送的一些电子邮件需要根据客户的要求进行定制。一旦将电子邮件文本注入控制器并正在发送,则需要填写电子邮件中的某些信息(名字,姓氏,电话号码等)。
这方面的一个例子显示在下面的bean中
<bean id="customeMailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="from@no-spam.com" />
<property name="to" value="to@no-spam.com" />
<property name="subject" value="Testing Subject" />
<property name="text">
<value>
Dear %FIRST_NAME%
Blah Blah Blah Blah Blah...
We Understand that we can reach you at the following information
Phone:%PHONE%
Address:%ADDRESS%
</value>
</property>
</bean>
这将是我定义并注入我的控制器的自定义电子邮件消息。然后,我的控制器中的代码将根据从客户收集的输入填写值,因此控制器将具有类似于以下的代码
//SimpleMailMessage property is injected into controller
private SimpleMailMessage simpleMailMessage;
//Getters and Setters for simpleMailMessage;
MimeMessage message = mailSender.createMimeMessage();
try{
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(simpleMailMessage.getFrom());
helper.setTo(simpleMailMessage.getTo());
helper.setSubject(simpleMailMessage.getSubject());
String text = simpleMailMessage.getText();
text.replace("%FIRST_NAME%",model.getFirstName());
text.replace("%PHONE%",model.getPhone());
text.replace("%ADDRESS%",model.getAddress());
helper.setText(simpleMailMessage.getText());
}
catch (MessagingException e) {
throw new MailParseException(e);
}
mailSender.send(message);**strong text**
我遇到的问题是,当我尝试更换%FIRST_NAME%,%PHONE%和%ADDRESS%&gt; <等值时/ b>,它不会取代它。我不确定这是因为我使用的是replace()错误,还是因为它因为注入了值而以不同方式对待它。我也试过使用replaceAll(),这也不起作用。如果有人有更好的想法如何做到这一点,请告诉我。
谢谢
答案 0 :(得分:2)
不要忘记Java Strings中的不可变。即你不能改变它们,而是从旧的那个创建一个新的(参见replaceAll()的文档并记下返回值)。
因此replace()
不会更改它所调用的字符串,而是返回一个替换为的新字符串。您可以使用返回值,因此只需将这些调用链接在一起:
String newString = oldString.replace(..).replace(...);
如果你需要做很多这样的模板,你可能会对Apache Velocity或Freemarker感兴趣。它们是专门构建的模板引擎,可以使用更多选项(例如提供循环,格式化,条件等)来完成您正在做的事情。
答案 1 :(得分:1)
我建议不要通过构建自己的模板系统来重新发明轮子。使用Apache Velocity或其他库来实现这一目标 - 它们提供的功能更多,功能更强大,性能也比任何家庭解决方案更高。
Spring对Velocity提供了极好的支持,我在许多Spring MVC应用程序(用于电子邮件模板和Web模板)中都使用了Velocity模板,没有问题。
答案 2 :(得分:0)
我想在这里介绍Rythm模板引擎。这里有一些关于这项工作的要点:
示例1,使用模板文件渲染并按位置传递参数:
String result = Rythm.render("/path/to/my/template.txt", foo, bar, ...);
示例2,使用模板文件渲染并按名称传递参数:
Map<String, Object> args = new HashMap<String, Object>();
args.put("foo", foo);
args.put("bar", bar);
...
String result = Rythm.render("/path/to/my/template.txt", args);
示例3,使用字符串内容进行渲染并按位置传递参数:
String result = Rythm.render("@args User user;User name is @user.name", user);
示例4,使用String Interpolation Mode中的字符串内容进行渲染:
String result = Rythm.render("User name is @name", user.name);
链接: