3

我是 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文件中而不是在 java 程序中使用 JSTL EL 来实现这一点。

有什么办法可以做到这一点?

提前致谢。

乔恩

4

1 回答 1

4

有什么办法可以做到这一点?

我不是 100% 确定我明白你在追求什么,但这里有一些指示......

查看MessageFormatAPI 中的类。您可能还对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));
    }
}

...但它越来越难看,我建议您考虑深入挖掘一些 3rd 方库来解决这个问题。

于 2011-08-22T08:47:50.583 回答