用法介绍
MessageFormat是在text包中的一个常用类java.text.Format下,MessageFormat常用将读取到的配置文件、国际化文件中标注的占位符解析,把参数对应的放入占位符的位置上,从而实现引用参数化。
比如:
String msg = "上{0}山{1}打{2}老{3}虎{4}";
Object [] array = new Object[]{"A","B","C","D","E"};
String getValue = MessageFormat.format(msg, array);
//输出getValue: 上A山B打C老D虎E
使用场景
MessageFormat可以用做将数据库中标注好占位符的邮件模板取出来,把对应的邮件模板参数放入占位符中,从而实现动态填充邮件模板并发送邮件。
遇到问题
在使用MessageFormat填充邮件模板的时候遇到了个问题,发现原来是单引号引起的。在格式化字符串时,两个单引号才表示一个单引号,单个单引号会被忽略,除非中文单引号不会被省略,如:
String getValue = MessageFormat.format("yes, {0} is 'a' pig", "ZhangSan");
//输出getValue:yes, ZhangSan is a pig
而在邮件模板中,经常会出现单引号、双引号同时存在的情况,使用MessageFormat填充邮件模板会导致单引号消失,如:
{0}<span lang=EN-US style='font-size:11.5pt;font-family:"微软雅黑",sans-serif'>
//输出为 {0}<span lang=EN-US style=font-size:11.5pt;font-family:"微软雅黑",sans-serif>
最终导致发送出去的邮件样式变乱。
解决方法
如果遇到存在单引号又不得不使用的情况下,需要使用双单引号,如' 'admin' '即可,在使用成对的花括号的情况,如' '{admin}' '即可,所以发送邮件时需要将原模版中的单个引号',替换为两个单引号'',例如:
String htmlText = MessageFormat.format(mailTemplate.templateHtml.replace("'","''"), fillStr );
如果只是使用{,则需要三个单引号,如:'''{'''。不管怎样,双单引号仅代表一对单引号,对于多出的不起作用的单引号(如三个以上单引号)是会被移除的。
参考资料
https://blog.youkuaiyun.com/ShewMi/article/details/77790496