问候,
在我正在开发的网络应用程序中,我想做如下的事情:
我有一颗像豆子
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 库类 MessageFormat。它非常易于使用,并允许您替换字符串中的模板。
String outputString = MessageFormat.format("<a> href='http://www.ncbi.nlm.nih.gov/pubmed?term={0}' />", "gene19191X");
您还可以创建 MessageFormat 的实例并以不同的值重用该实例。
您还可以尝试的其他选项是:
您可以使用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();