import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * 用java操作 javascript 工具类。<br/>
 * 可以加载网络上的js,或者文件路径下的js,可以调用js文件中的函数。
 * @author 朱志杰 QQ:695520848
 * May 31, 2013 9:03:17 AM
 */
public class JsUtil {
    
    //js 文件操作对象。
    private Invocable inv=null;
    
    
    /**
     * 功能:构造函数。(文件路径)
     * @author 朱志杰 QQ:695520848
     * May 31, 2013 9:05:22 AM
     * @param jsFilePaths 文件路径下的js文件全路径,可以同时传入很多js路径。
     * @throws ScriptException 读取js文件异常。
     * @throws FileNotFoundException  js文件没有找到。
     */
    public JsUtil(String... jsFilePaths) throws FileNotFoundException, ScriptException{
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByMimeType("text/javascript");
        for(String filePath : jsFilePaths){
            engine.eval(new FileReader(filePath));
        }
        inv = (Invocable) engine;
    }
    
    /**
     * 功能:构造函数。(网络地址)
     * @author 朱志杰 QQ:695520848
     * May 31, 2013 9:05:22 AM
     * @param jsUrl js文件在网络上的全路径,可以同时传入多个JS的URL。
     * @throws ScriptException 读取js文件异常。
     * @throws IOException  从网路上加载js文件异常。
     */
    public JsUtil(URL... jsUrls) throws ScriptException, IOException{
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByMimeType("text/javascript");
        //从网络读取js文件流
        for(URL url: jsUrls){
            InputStreamReader isr=new InputStreamReader(url.openStream());
            BufferedReader br=new BufferedReader(isr);
            engine.eval(br);
        }
        inv = (Invocable) engine;
    }
    
    /**
     * 功能:调用js中的顶层程序和函数。
     * @param functionName js顶层程序和函数名。
     * @author 朱志杰 QQ:695520848
     * May 31, 2013 9:38:07 AM
     * @return 程序或函数所返回的值
     * @throws NoSuchMethodException 如果不存在具有给定名称或匹配参数类型的方法。
     * @throws ScriptException 如果在调用方法期间发生错误。
     */
    public Object invokeFunction(String functionName,Object... args) throws ScriptException, NoSuchMethodException{
        return inv.invokeFunction(functionName,args);
    }
    
}

JAVA调用操作javascript (JS)工具类的更多相关文章

  1. java之操作集合的工具类--Collections

    Collections是一个操作Set.List和Map等集合的工具类. Collections中提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变.对集合对象实现同步控 ...

  2. Java操作字符串的工具类

    操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...

  3. Java操作图片的工具类

    操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...

  4. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  5. vue项目工具文件utils.js javascript常用工具类,javascript常用工具类,util.js

    vue项目工具文件utils.js :https://blog.csdn.net/Ajaxguan/article/details/79924249 javascript常用工具类,util.js : ...

  6. 最全的Java操作Redis的工具类,使用StringRedisTemplate实现,封装了对Redis五种基本类型的各种操作!

    转载自:https://github.com/whvcse/RedisUtil 代码 ProtoStuffSerializerUtil.java import java.io.ByteArrayInp ...

  7. 分享非常好用的前端分页js工具类 灵活 简单易懂

    分享自己封装的前端分页js工具类  下面是默认样式效果截图 可以随意更改js及css 很灵活 /** * pageSize, 每页显示数 * pageIndex, 当前页数 * pageCount 总 ...

  8. 操作集合的工具类Collections

    1       操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...

  9. 【转载】C#工具类:实现文件操作File的工具类

    在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...

随机推荐

  1. MD5算法步骤详解

    转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ...

  2. 云告警平台 OneAlert :如何帮助运维工程师做好汇报?

    OneAlert 是北京蓝海讯通科技有限公司旗下产品,中国首个 SaaS 模式的云告警平台,可集成 Zabbix ,Nagios ,Solarwinds ,AWS CloudWatch ,阿里云 ,监 ...

  3. HDU 1059 Dividing(多重背包)

    点我看题目 题意: 将大理石的重量分为六个等级,每个等级所在的数字代表这个等级的大理石的数量,如果是0说明这个重量的大理石没有.将其按重量分成两份,看能否分成. 思路 :一开始以为是简单的01背包,结 ...

  4. Linux下打包压缩成war包和解压war包

    一. 打包成war包 因为种种原因公司需要把java程序达成war包.起先用zip命令打包,起先可以用,后来却无法使用.今天找到一个更好的办法.用jar命令,前提是要安装jdk. 把当前目录下的所有文 ...

  5. 李洪强漫谈iOS开发[C语言-020]-scanf的本质

    scanf是有返回值和参数的

  6. c++ const char *c_str(); 坑的学习

    语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过st ...

  7. Linux设备驱动程序:中断处理之顶半部和底半部

    http://blog.csdn.net/yuesichiu/article/details/8286469 设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽可 ...

  8. 使用Code first 进行更新数据库结构(数据迁移)

    CodeFirst 背景  code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会 ...

  9. 163. Missing Ranges

    题目: Given a sorted integer array where the range of elements are [lower, upper] inclusive, return it ...

  10. linux多线程驱动中调用udelay()对整个系统造成的影响(by liukun321咕唧咕唧)

    以前没考虑过这个问题,而且之前可能运气比较好,虽然用了udelay但也没出什么奇怪的问题,今天在 CSDN上看到了一篇关于此问题帖子,觉得很受用,再此做简要的记录和分析: 驱动开的是内核线程 跟普通进 ...