使用String replace()或replaceAll()配置动态电子邮件内容

时间:2010-10-13 15:50:51

标签: java spring string

我正在使用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(),这也不起作用。如果有人有更好的想法如何做到这一点,请告诉我。

谢谢

3 个答案:

答案 0 :(得分:2)

不要忘记Java Strings中的不可变。即你不能改变它们,而是从旧的那个创建一个新的(参见replaceAll()的文档并记下返回值)。

因此replace()不会更改它所调用的字符串,而是返回一个替换为的新字符串。您可以使用返回值,因此只需将这些调用链接在一起:

String newString = oldString.replace(..).replace(...);

如果你需要做很多这样的模板,你可能会对Apache VelocityFreemarker感兴趣。它们是专门构建的模板引擎,可以使用更多选项(例如提供循环,格式化,条件等)来完成您正在做的事情。

答案 1 :(得分:1)

我建议不要通过构建自己的模板系统来重新发明轮子。使用Apache Velocity或其他库来实现这一目标 - 它们提供的功能更多,功能更强大,性能也比任何家庭解决方案更高。

Spring对Velocity提供了极好的支持,我在许多Spring MVC应用程序(用于电子邮件模板和Web模板)中都使用了Velocity模板,没有问题。

答案 2 :(得分:0)

我想在这里介绍Rythm模板引擎。这里有一些关于这项工作的要点:

  • Razor喜欢synatx,非常干净且对Java程序员友好
  • 编译为Java字节码因此非常快。比速度快2到3倍
  • 它涵盖了Velocity提供的所有功能等等。请参阅Google应用程序引擎托管的full feature set demonstration
  • API是其他Java模板引擎中最简单的(速度,自由标记...)

示例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);

链接: