我是Java的新宠。
我的意图是在Java程序中使用类似句子的模板(没有JSP或任何与Web相关的页面)
示例:
String name = "Jon";
"#{ name } invited you";
or
String user.name = "Jon";
"#{ user.name } invited you";
如果我将此字符串传递给某个方法,我应该
"Jon invited you"
我已经阅读了一些表达语言 MVEL,OGNL,JSTL EL
在MVEL和OGNL中,我必须编写一些代码来实现这一点,但还是以其他方式。
我只能在 JSP 文件中使用JSTL EL来实现这一点。
有没有办法实现这个目标?
提前致谢。
乔恩
答案 0 :(得分:4)
有没有办法实现这一目标?
我不是百分百肯定我明白你所追求的是什么,但这里有一些指示......
查看API中的MessageFormat
类。您可能还对Formatter
类和/或String.format
方法感兴趣。
如果您有一些Properties
并且想要搜索和替换形状#{ property.key }
的子字符串,您也可以这样做:
import java.util.Properties;
import java.util.regex.*;
class Test {
public static String process(String template, Properties props) {
Matcher m = Pattern.compile("#\\{(.*?)\\}").matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, props.getProperty(m.group(1).trim()));
m.appendTail(sb);
return sb.toString();
}
public static void main(String[] args) {
Properties props = new Properties();
props.put("user.name", "Jon");
props.put("user.email", "jon.doe@example.com");
String template = "Name: #{ user.name }, email: #{ user.email }";
// Prints "Name: Jon, email: jon.doe@example.com"
System.out.println(process(template, props));
}
}
如果您有实际的POJO而不是Properties对象,则可以进行反射,如下所示:
import java.util.regex.*;
class User {
String name;
String email;
}
class Test {
public static String process(String template, User user) throws Exception {
Matcher m = Pattern.compile("#\\{(.*?)\\}").matcher(template);
StringBuffer sb = new StringBuffer();
while (m.find()) {
String fieldId = m.group(1).trim();
Object val = User.class.getDeclaredField(fieldId).get(user);
m.appendReplacement(sb, String.valueOf(val));
}
m.appendTail(sb);
return sb.toString();
}
public static void main(String[] args) throws Exception {
User user = new User();
user.name = "Jon";
user.email = "jon.doe@example.com";
String template = "Name: #{ name }, email: #{ email }";
System.out.println(process(template, user));
}
}
...但它变得越来越难看,我建议你考虑深入研究一些第三方库来解决这个问题。