概述
java渲染字符串模板,也就是说在java字符串模板中设置变量字符串,使用变量去渲染指定模板中设置好的变量字符串。下面介绍4种替换模板方式:
1、使用内置String.format
1
2
3
|
String message = String.format(
"您好%s,晚上好!您目前余额:%.2f元,积分:%d"
,
"张三"
,
10.155
,
10
);
System.out.println(message);
//您好张三,晚上好!您目前余额:10.16元,积分:10
|
2、使用内置MessageFormat
1
2
3
|
String message = MessageFormat.format(
"您好{0},晚上好!您目前余额:{1,number,#.##}元,积分:{2}"
,
"张三"
,
10.155
,
10
);
System.out.println(message);
//您好张三,晚上好!您目前余额:10.16元,积分:10
|
3、使用自定义封装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public
static
String processTemplate(String template, Map<String, Object> params){
StringBuffer sb =
new
StringBuffer();
Matcher m = Pattern.compile(
"\$\{\w+\}"
).matcher(template);
while
(m.find()) {
String param = m.group();
Object value = params.get(param.substring(
2
, param.length() -
1
));
m.appendReplacement(sb, value==
null
?
""
: value.toString());
}
m.appendTail(sb);
return
sb.toString();
}
public
static
void
main(String[] args){
Map map =
new
HashMap();
map.put(
"name"
,
"张三"
);
map.put(
"money"
, String.format(
"%.2f"
,
10.155
));
map.put(
"point"
,
10
);
message = processTemplate(
"您好${name},晚上好!您目前余额:${money}元,积分:${point}"
, map);
System.out.println(message);
//您好张三,晚上好!您目前余额:10.16元,积分:10
}
|
4、使用模板引擎freemarker
首先引入freemarker.jar,这里以2.3.23版本为例,如果使用maven的配置pom.xml
1
2
3
4
5
|
<
dependency
>
<
groupId
>org.freemarker</
groupId
>
<
artifactId
>freemarker</
artifactId
>
<
version
>2.3.23</
version
>
</
dependency
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
try
{
map =
new
HashMap();
map.put(
"name"
,
"张三"
);
map.put(
"money"
,
10.155
);
map.put(
"point"
,
10
);
Template template =
new
Template(
"strTpl"
,
"您好${name},晚上好!您目前余额:${money?string("#.##")}元,积分:${point}"
,
new
Configuration(
new
Version(
"2.3.23"
)));
StringWriter result =
new
StringWriter();
template.process(map, result);
System.out.println(result.toString());
//您好张三,晚上好!您目前余额:10.16元,积分:10
}
catch
(Exception e){
e.printStackTrace();
}
|
综合,完整示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
package
com.weizhixi.util;
import
freemarker.template.Configuration;
import
freemarker.template.Template;
import
freemarker.template.Version;
import
java.io.StringWriter;
import
java.text.MessageFormat;
import
java.util.HashMap;
import
java.util.Map;
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
/**
* Created by cxq on 2018-01-07.
*/
public
class
Tpl {
public
static
Configuration cfg;
static
{
cfg =
new
Configuration(
new
Version(
"2.3.23"
));
}
public
static
void
main(String[] args) {
Object[] obj =
new
Object[]{
"张三"
, String.format(
"%.2f"
,
10.155
),
10
};
System.out.println(processFormat(
"您好%s,晚上好!您目前余额:%s元,积分:%d"
, obj));
System.out.println(processMessage(
"您好{0},晚上好!您目前余额:{1}元,积分:{2}"
, obj));
Map map =
new
HashMap();
map.put(
"name"
,
"张三"
);
map.put(
"money"
, String.format(
"%.2f"
,
10.155
));
map.put(
"point"
,
10
);
System.out.println(processTemplate(
"您好${name},晚上好!您目前余额:${money}元,积分:${point}"
, map));
System.out.println(processFreemarker(
"您好${name},晚上好!您目前余额:${money}元,积分:${point}"
, map));
}
/**
* String.format渲染模板
* @param template 模版
* @param params 参数
* @return
*/
public
static
String processFormat(String template, Object... params) {
if
(template ==
null
|| params ==
null
)
return
null
;
return
String.format(template, params);
}
/**
* MessageFormat渲染模板
* @param template 模版
* @param params 参数
* @return
*/
public
static
String processMessage(String template, Object... params) {
if
(template ==
null
|| params ==
null
)
return
null
;
return
MessageFormat.format(template, params);
}
/**
* 自定义渲染模板
* @param template 模版
* @param params 参数
* @return
*/
public
static
String processTemplate(String template, Map<String, Object> params) {
if
(template ==
null
|| params ==
null
)
return
null
;
StringBuffer sb =
new
StringBuffer();
Matcher m = Pattern.compile(
"\$\{\w+\}"
).matcher(template);
while
(m.find()) {
String param = m.group();
Object value = params.get(param.substring(
2
, param.length() -
1
));
m.appendReplacement(sb, value ==
null
?
""
: value.toString());
}
m.appendTail(sb);
return
sb.toString();
}
/**
* Freemarker渲染模板
* @param template 模版
* @param params 参数
* @return
*/
public
static
String processFreemarker(String template, Map<String, Object> params) {
if
(template ==
null
|| params ==
null
)
return
null
;
try
{
StringWriter result =
new
StringWriter();
Template tpl =
new
Template(
"strTpl"
, template, cfg);
tpl.process(params, result);
return
result.toString();
}
catch
(Exception e) {
return
null
;
}
}
}
|
http://www.weizhixi.com/user/index/article/id/53.html
/** * 简单实现${}模板功能 * 如${aa} cc ${bb} 其中 ${aa}, ${bb} 为占位符. 可用相关变量进行替换 * @param templateStr 模板字符串 * @param data 替换的变量值 * @param defaultNullReplaceVals 默认null值替换字符, 如果不提供, 则为字符串"" * @return 返回替换后的字符串, 如果模板字符串为null, 则返回null */ @SuppressWarnings("unchecked") public static String simpleTemplate(String templateStr, Map<String, ?> data, String... defaultNullReplaceVals) { if(templateStr == null) return null; if(data == null) data = Collections.EMPTY_MAP; String nullReplaceVal = defaultNullReplaceVals.length > 0 ? defaultNullReplaceVals[0] : ""; Pattern pattern = Pattern.compile("\$\{([^}]+)}"); StringBuffer newValue = new StringBuffer(templateStr.length()); Matcher matcher = pattern.matcher(templateStr); while (matcher.find()) { String key = matcher.group(1); String r = data.get(key) != null ? data.get(key).toString() : nullReplaceVal; matcher.appendReplacement(newValue, r.replaceAll("\\", "\\\\")); //这个是为了替换windows下的文件目录在java里用\表示 } matcher.appendTail(newValue); return newValue.toString(); } //测试方法 public static void main(String[] args) { String tmpLine = "简历:n 姓名: ${姓} ${名} n 性别: ${性别}n 年龄: ${年龄} n"; Map<String, Object> data = new HashMap<String, Object>(); data.put("姓", "wen"); data.put("名", "66"); data.put("性别", "man"); data.put("年龄", "222"); System.out.println(simpleTemplate(tmpLine, null, "--")); }
http://wen66.iteye.com/blog/830526
static final String jsonStr = "{"name":"11","time":"2014-10-21"}"; static final String template = "亲爱的用户${name},你好,上次登录时间为${time}"; static String generateWelcome(String jsonStr,String template){ Gson gson = new Gson(); HashMap jsonMap = gson.fromJson(jsonStr, HashMap.class); for (Object s : jsonMap.keySet()) { template = template.replaceAll("\$\{".concat(s.toString()).concat("\}") , jsonMap.get(s.toString()).toString()); } return template; } public static void main(String[] args) throws IOException { System.out.println(generateWelcome(jsonStr,template)); }
https://segmentfault.com/q/1010000002484866
在开发中类似站内信的需求时,我们经常要使用字符串模板,比如
尊敬的用户${name}。。。。
里面的${name}就可以替换为用户的用户名。
下面使用正则表达式简单实现一下这个功能:
/**
* 根据键值对填充字符串,如("hello ${name}",{name:"xiaoming"})
* 输出:
* @param content
* @param map
* @return
*/
public static String renderString(String content, Map<String, String> map){ Set<Entry<String, String>> sets = map.entrySet(); for(Entry<String, String> entry : sets) { String regex = "\$\{" + entry.getKey() + "\}"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(content); content = matcher.replaceAll(entry.getValue()); } return content; }
在map里存储了键值对,然后获取键值对的集合,遍历集合进行对字符串的渲染
测试:
@Test
public void renderString() {
String content = "hello ${name}, 1 2 3 4 5 ${six} 7, again ${name}. "; Map<String, String> map = new HashMap<>(); map.put("name", "java"); map.put("six", "6"); content = StringHelper.renderString(content, map); System.out.println(content); }
有两个变量需要替换,name和six,对应的值分别为java和6,同时name调用了两次。
结果:
hello java, 1 2 3 4 5 6 7, again java.
http://www.zgljl2012.com/javazheng-ze-biao-da-shi-shi-xian-name-xing-shi-de-zi-fu-chuan-mo-ban/
最后
以上就是年轻泥猴桃为你收集整理的java 替换字符串模板(模板渲染)的全部内容,希望文章能够帮你解决java 替换字符串模板(模板渲染)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复