Java中通过脚本引擎调用js函数

 1 import java.io.*;
 2 import javax.script.Invocable;
 3 import javax.script.ScriptEngine;
 4 import javax.script.ScriptEngineManager;
 5 import javax.script.ScriptException;
 6 import org.slf4j.Logger;
 7 import org.slf4j.LoggerFactory;
 8 import com.ppcredit.common.util.file.FileUtil;
 9
10 /**
11  * 公共的JS脚本引擎工具类
12  */
13 public class CommonScriptEngineUtil {
14     private static Logger log = LoggerFactory.getLogger(CommonScriptEngineUtil.class); // 日志
15
16     private static ScriptEngine engine = (new ScriptEngineManager()).getEngineByName("javascript");
17
18     private static Invocable invoke = null;
19
20     /**
21      * 调用js中的函数
22      * @param jsName js文件名称
23      * @param functionName 调用的函数名称
24      * @param param 调用js函数的参数
25      * @return
26      */
27     public static  String invokeJSFuntion(String jsName, String functionName, String param){
28         initJS(jsName);
29         synchronized (invoke) {
30           String result = param;
31           if(invoke != null){
32               try {
33                   long startTime = System.currentTimeMillis();
34                   String c = (String)invoke.invokeFunction(functionName, param);
35                   long endTime = System.currentTimeMillis();
36                   log.info("invokeJSFuntion 耗时 >>>>" + (endTime-startTime));
37                   result = c;
38               } catch (NoSuchMethodException e) {
39                   log.error(e.getMessage());
40               } catch (ScriptException e) {
41                   //如果出错就重新加载
42                   initJS(jsName);
43                   log.error(e.getMessage());
44               }
45           }
46           return result;
47         }
48     }
49
50
51     private static void initJS(String jsName){
52         String basePath = FileUtil.getAppPath(CommonScriptEngineUtil.class);
53         String jsFileName = basePath + "/resources/" + jsName;   // 读取js文件
54         InputStreamReader reader = null;
55         try {
56             reader =new InputStreamReader(new FileInputStream(jsFileName),"UTF-8");
57             engine.eval(reader);
58             if(engine instanceof Invocable) {
59                 invoke = (Invocable)engine;
60             }
61         } catch (FileNotFoundException e) {
62             log.error(e.getMessage());
63         } catch (ScriptException e) {
64             log.error(e.getMessage());
65         } catch (UnsupportedEncodingException e) {
66             log.error(e.getMessage());
67         } finally {
68             if(reader != null){
69                 try {
70                     reader.close();
71                 } catch (IOException e) {
72                     log.error(e.getMessage());
73                 }
74             }
75         }
76     }
77
78     public static void main(String[] args){
79         String enc = invokeJSFuntion("aes.js","valAesEncryptSet","123456");
80         System.out.println(enc);
81     }
82 }
时间: 2024-10-27 11:45:57

Java中通过脚本引擎调用js函数的相关文章

在COM组件中调用JS函数

要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scriptCallbackFunc.实现这个技术很简单: 1 .组件方(C++) 组件A 的方法在IDL中定义: [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);

JAVA调用JS函数

今天在开发中使用到了js和Java的交互,平时我们用的比较多的就是js调用Java的方法,可以使用dwr.Ajax.jquery.突然发现要Java调用js的话还真没有见过,今天上网查询了下资料,顺便总结一下: 前提条件:jdk1.6才支持,1.6以前的就不行了. js代码如下: function convert (id,str) { if ('505041'==id) { return str; } else { return "A"; } } Java代码如下: package c

Scripting Java(一):Java中执行脚本

Many implementations of scripting and dynamically typed languages generate Java bytecodes so that programs can be run on the Java Platform, just as are actual Java programs. Implementing a language in this way (or as a Java interpreter class for the

VC与JavaScript交互(二) ———— 调用JS函数

这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: [html] view plaincopy <script type="text/javascript"> function Add(value1, value2) { return value1 + value2; } </script> 然后我们用WebBrowser加载这个HTML后,在VC中这样来调用这个函数名为Add的JS函数: [cpp] view plai

C++通过V8调用js函数

现在写个函数,在C++中调用js函数, int V8_Manager::js_load_player_data(Block_Buffer *buf) { //执行V8代码前,必须先进入V8的Isolate,初始化V8运行环境 Isolate::Scope isolate_scope(isolate_); HandleScope handle_scope(isolate_); Local<Context> context = Local<Context>::New(isolate_,

V8系列之C++调用js函数

下面写个程序,用来演示在C++中通过V8调用js函数 int js_load_data(char *buf) { //声明v8虚拟机 Isolate* isolate; //进入v8虚拟机内部,初始化v8运行环境 Isolate::Scope isolate_scope(isolate); //创建句柄集合 HandleScope handle_scope(isolate); //创建v8运行上下文 Local<ObjectTemplate> global = ObjectTemplate::

如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)

如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections) 关键词: -Wl,--gc-sections   -ffunction-sections  链接  elf   库 有时我们会遇到这种情况,可执行程序需要链接一些静态库,但是静态库中的函数并没有全部使用,只用了其中的几个,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加,浪费了flash空间和内存空间.gcc为我们提供的解决

服务器控件调用JS函数

是服务器端控件,不能在JS里直接调用,但可以在aspx.cs 里写方法可以调用JS函数,比如JS方法名称是check(), function check() {   alert(document.getElementById("ltr1").value); } 在a.aspx  <asp:Literal ID="ltr1" runat="server" > </asp:Literal> <asp:Button ID=

java中URL 的编码和解码函数

java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascript 中URL 的编码和解码函数escape(String s)和unescape(String s) ; 在前台:var url="test.jsp?param="+escape('this%is#te=st&o k?+/');在后台: String param=request.