Как разобрать шаблонное предложение «# {name} приглашены» с использованием языка выражений - PullRequest
3 голосов
/ 22 августа 2011

Я новичок в Java.

Я намерен использовать шаблон как предложения в программе на Java (без JSP или каких-либо веб-страниц)

Пример:

String name = "Jon";

"#{ name } invited you";

      or 

 String user.name = "Jon";

 "#{ user.name } invited you";

Если я передам эту строку какому-либо методу, я должен получить

"Jon invited you"

Я прошел через некоторые языки выражений MVEL, OGNL, JSTL EL

В MVEL и OGNL мне нужно написать некоторый набор кода для достижения этого, но другим способом.

Я могу добиться этого, используя JSTL EL только в JSP файлов нет в java-программе.

Есть ли способ добиться этого?

Заранее спасибо.

Jon

1 Ответ

4 голосов
/ 22 августа 2011

Есть ли способ достичь этого?

Я не уверен на 100%, что понимаю, что вы ищете,но вот несколько указателей ...

Посмотрите на класс MessageFormat в API.Вас также может заинтересовать класс 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, вы можете пройти отражение, например так:1028 *

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));
    }
}

... но это становится уродливым, и я советую вам покопаться в некоторых сторонних библиотеках для решения этой проблемы.

...