import java.io.*;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ppcredit.common.util.file.FileUtil; /**
* 公共的JS脚本引擎工具类
*/
public class CommonScriptEngineUtil {
private static Logger log = LoggerFactory.getLogger(CommonScriptEngineUtil.class); // 日志 private static ScriptEngine engine = (new ScriptEngineManager()).getEngineByName("javascript"); private static Invocable invoke = null; /**
* 调用js中的函数
* @param jsName js文件名称
* @param functionName 调用的函数名称
* @param param 调用js函数的参数
* @return
*/
public static String invokeJSFuntion(String jsName, String functionName, String param){
initJS(jsName);
synchronized (invoke) {
  String result = param;
  if(invoke != null){
  try {
   long startTime = System.currentTimeMillis();
  String c = (String)invoke.invokeFunction(functionName, param);
  long endTime = System.currentTimeMillis();
  log.info("invokeJSFuntion 耗时 >>>>" + (endTime-startTime));
  result = c;
  } catch (NoSuchMethodException e) {
   log.error(e.getMessage());
  } catch (ScriptException e) {
   //如果出错就重新加载
   initJS(jsName);
   log.error(e.getMessage());
   }
  }
  return result;
}
} private static void initJS(String jsName){
String basePath = FileUtil.getAppPath(CommonScriptEngineUtil.class);
String jsFileName = basePath + "/resources/" + jsName; // 读取js文件
InputStreamReader reader = null;
try {
reader =new InputStreamReader(new FileInputStream(jsFileName),"UTF-8");
engine.eval(reader);
if(engine instanceof Invocable) {
invoke = (Invocable)engine;
}
} catch (FileNotFoundException e) {
log.error(e.getMessage());
} catch (ScriptException e) {
log.error(e.getMessage());
} catch (UnsupportedEncodingException e) {
log.error(e.getMessage());
} finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
}
} public static void main(String[] args){
String enc = invokeJSFuntion("aes.js","valAesEncryptSet","123456");
System.out.println(enc);
}
}

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

  1. java 脚本引擎执行js

    为用到时,使用方便直接保存一下代码 package com.xzlf.reflectTest; import java.io.BufferedReader; import java.io.FileIn ...

  2. 在动态THML语句中调用JS函数传递带空格参数的问题

    刚刚遇到一个问题,调用js函数的参数里带空格,造成调用失败的问题.   部分代码如下: html+="<div><a href=javascript:confirm(&qu ...

  3. VC与JavaScript交互(二) --- 调用JS函数

    这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: //[html] <script type="text/javascript"& ...

  4. 转:在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档

    在 C# 中使用 P/Invoke 调用 Mupdf 函数库显示 PDF 文档 一直以来,我都想为 PDF 补丁丁添加一个 PDF 渲染引擎.可是,目前并没有可以在 .NET 框架上运行的免费 PDF ...

  5. <a>标签中的href如何调用js代码

    在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接 ...

  6. js,JavaScript,a标签onclick传递参数不对,A标签调用js函数写法总结

    错误示例: <a href="javascript:waterLineEdit(${goods.goods_id})" >修改 </a> <!-- 浏 ...

  7. 转:标签中的href如何调用js

      在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动 ...

  8. java中URL 的编码和解码函数

    java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascri ...

  9. [模拟回调] demo1模拟用字符串调用js函数 demo2模拟springmvc controller回调页面js函数

    demo1. 模拟用字符串调用js 函数 function dataQuery() { var strFun = "testCallBack"; var strParam = &q ...

随机推荐

  1. 网络I/O模型总结

    把网络IO模型整理了一下,如下图

  2. vbox的桥接网络

    直接连接到了外网上,宿主机可以访问虚拟机,但是虚拟机不可以访问宿主机.缺点:宿主机没有网络时,将不能ping通. 宿主机:win10 网络:无线 虚拟机系统:centos6.5 vbox版本:6.0. ...

  3. 三台机器之间ssh互信配置

    三台机器之间ssh互信配置 环境介绍:192.168.65.128    my1-222192.168.65.129  my2-223192.168.65.130    web224 # 步骤一:# ...

  4. Linux Cluster 基础之LVS调度算法与集群类型

    Linux Cluster 基础之LVS调度算法与集群类型 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.LB Cluster 1>.什么是LB LB 集群是 load ...

  5. SQL语法基础之ALTER语句

    SQL语法基础之ALTER语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看ALTER的帮助信息 mysql> ? ALTER Many help items fo ...

  6. Oracle 去重并显示所有列数据

    一.原始数据(默认会生成一个 rownum 的序列,如下图的第一列) select t.* from ZD_DIC t where t.zdlx = '人员类型' 二.先分组,再给组内的内容进行排序 ...

  7. Kafka技术内幕 读书笔记之(三) 生产者——消费者:高级API和低级API——基础知识

    1. 使用消费组实现消息队列的两种模式 分布式的消息系统Kafka支持多个生产者和多个消费者,生产者可以将消息发布到集群中不同节点的不同分区上:消费者也可以消费集群中多个节点的多个分区上的消息 . 写 ...

  8. Bootstrap模态框修改出现的位置和大小

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Terminal 快捷键帮助

    Terminal 快捷键帮助 Terminal 快捷键帮助 移动光标至行首 CTRL+A 第一次按时,移动光标至行首: 再次按时,回到原有位置 CTRL+X 移动光标至行尾 CTRL+E 光标向左移动 ...

  10. HTTP.SYS远程执行代码漏洞分析 (MS15-034 )

    写在前言:   在2015年4月安全补丁日,微软发布了11项安全更新,共修复了包括Microsoft Windows.Internet Explorer.Office..NET Framework.S ...