如何使用Java的ScriptEngine来创建一个JavaScript函数
问题描述:
在这个问题上我问了一下支持的表达式语言和使用JavaScript的想法成功地Putting a simple expression language into java如何使用Java的ScriptEngine来创建一个JavaScript函数
但所需要的JavaScript表情已经变得相当冗长,我试着去工作了我如何使用ScriptEngine创建可在我的表达式中引用的JavaScript函数,以便表达式可以更短。
到目前为止,我砍死使用reexp用户输入的字符串的解决方案可以包括所谓ifempty伪功能,然后我传递给脚本引擎
public final String formatFromMask(String mask,Song exampleSong)
{
mask = convertPsuedoFunctions(mask);
try
{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
for(SongFieldName next:SongFieldName.values())
{
engine.put(next.getScriptVar(),exampleSong.getFieldValueOrEmptyString(next.getSongFieldKey()));
}
Object result = engine.eval(mask);
return (String)result;
}
catch(ScriptException se)
{
se.printStackTrace();
}
return "";
}
private String convertPsuedoFunctions(String mask)
{
//i.e ifnotempty(artist,' - ') -> (artist.length>0 ? artist + ' - ' : '')
mask=mask.replaceAll("ifnotempty\\(([a-z]*)\\,('.*')\\)",
"($1.length>0 ? $1 + $2 : '')");
return mask;
}
这可以解析转换之前的javascript一个表达式如
ifnotempty(album,'/')
+ ifnotempty(artist,' - ')
+ ifnotempty(album,' - ')
+ ifnotempty(track,' - ')
+ ifnotempty(title,'')
但我想知道一个合适的解决方案,据此我实际上创建了一个真正的javascript函数。
答
为什么不创建您添加到脚本中的真正的Javascript函数?
function ifnotempty(value,sep){
return value != undefined && value.length > 0 ? value + sep : '';
}
所以你的函数变为:
private String convertPsuedoFunctions(String mask)
{
return
"function ifnotempty(value,sep){return value!=undefined&&value.length>0?value+sep:'';}"
+ mask;
}
此外,您可以创建一个文件与您支持某些默认的功能和前置一个给用户脚本。就像上面一样。但不是一个硬编码函数,而是将该文件读入一个字符串。
private static final String defaultFunctions =
com.google.common.io.Files.toString(new File("functions.js"),Charsets.US_ASCII);
private String convertPsuedoFunctions(String mask)
{
return defaultFunctions + mask;
}
好啊,我知道会有办法做到的,就是看不到它。 – 2012-07-11 14:20:36