Java 表达式语言:插值?

问题描述 投票:0回答:3

问候,

在我正在开发的网络应用程序中,我想做如下的事情:

我有一颗像豆子

class Gene{
String geneid;
String sequence;
..
}

// EL expression (sometimes should be simple as "${geneid}" without URL pattern)
String exp="<a> href='http://www.ncbi.nlm.nih.gov/pubmed?term=${geneid}' />";
String outputString=someframeworkobject.somemethod(exp,aGeneInstance);

因此输出字符串被插值如下:

http://www.ncbi.nlm.nih.gov/pubmed?term=gene19191X

我可以使用任何轻量级 EL 框架吗?

java templates expression string-interpolation
3个回答
3
投票

也许 MVEL 适合你。

使用类似的模板

 Hello, @{person.getSex() == 'F' ? 'Ms.' : 'Mr.'} @{person.name}

你可以做

 context.put("person", personBean);
 String output = (String) TemplateRuntime.eval(template, context);

查看本教程(我在哪里读到过此内容,但我对 MVEL 没有经验)。


2
投票

听起来您所需要的只是核心 Java 库类 MessageFormat。它非常易于使用,并允许您替换字符串中的模板。

String outputString = MessageFormat.format("<a> href='http://www.ncbi.nlm.nih.gov/pubmed?term={0}' />", "gene19191X");

您还可以创建 MessageFormat 的实例并以不同的值重用该实例。

您还可以尝试的其他选项是:

  • Apache Commons EL - 这是为 Web 应用程序中的表达式构建的。
  • Groovy GStrings - 我有时用它来评估“脚本”。这样做的优点是允许更复杂的逻辑。

0
投票

您可以使用Java的字符串模板功能。 它在 JEP 430 中进行了描述,并作为预览功能出现在 JDK 21 中。这是一个使用示例:

String name = "Joan";
String info = STR."My name is \{name}";
assert info.equals("My name is Joan");   // true

Java 的字符串模板比其他语言(例如 C# 的字符串插值和 Python 的 f 字符串)中的功能更通用,也更安全。例如,字符串连接或插值使得 SQL 注入攻击成为可能:

String query = "SELECT * FROM Person p WHERE p.last_name = '" + name + "'";
ResultSet rs = conn.createStatement().executeQuery(query);

但是这个变体(来自 JEP 430)可以防止 SQL 注入:

PreparedStatement ps = DB."SELECT * FROM Person p WHERE p.last_name = \{name}";
ResultSet rs = ps.executeQuery();
© www.soinside.com 2019 - 2024. All rights reserved.