Java调用js方法
java调用js方法分三种:(从jdk1.6开始java支持了调用脚本)
1.调用java代码内部编写的js方法
简单示例:
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class js {
        public static void main(String[] args) throws Exception {
            // 获得一个JavaScript脚本引擎
            ScriptEngineManager mgr = new ScriptEngineManager();
            ScriptEngine engine = EngineByName("JavaScript");
            //执行脚本
            engine.eval("function test(p){return 'this is test js in java,'+p}");   
            //转化成父类(Invocable),因为ScriptEngine中没有调用js的方法
            Invocable inv = (Invocable) engine;   
            //调用脚本得到返回值
            String value = (String)inv.invokeFunction("test","我是一个参数");
            System.out.println(value);
        }
}
2.调用外部js文件中的方法
又细分为:调用本地js文件
  外网js文件(也就是网页中嵌入的js脚本文件)
简单示例:
1.调用本地js文件
  实现原理:通过File文件得到js的文件流,然后放入engine.eval()方法中,其他的都            和第一种原理一致;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class js2 {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = EngineByName("JavaScript");
        //加载一个文件
        File f=new File("./WebRoot/js/t.js");
        Reader r=new InputStreamReader(newjs调用方法的三种写法 FileInputStream(f));
        //把Reader放入eval中(读者可以去API看一下,重载了很多的eval()方法)
        engine.eval(r);   
        Invocable inv = (Invocable) engine;   
        String value = (String)inv.invokeFunction("test","我是一个参数");
        System.out.println(value);
    }
}
注:外部的js(./WebRoot/js/t.js)文件内容为:
function test(p){
   
    return '调用了外部js方法  '+p;
}
简单示例:
2.调用外网js文件
  实现原理:通过解析HttpUrlConnection类得到JSP页面内容,然后通过正则表达式匹配js            脚本路径,然后通过HttpUrlConnection访问js文件,得到Reader,其他原理同上
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.HttpURLConnection;
import java.URL;
import Matcher;
import Pattern;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
public class js3 {
   
    public static void main(String[] args) throws Exception {
       
        //构造一个脚本器
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = EngineByName("JavaScript");
       
        String url="localhost/Test";
        String html=UrlUtil.getHtml(url);
        //使用正则匹配js文件路径
        String js=getTextZZ(html, "<script[\\s]*type=\"text/javascript\"[\\s]*src=[.&\\S]+>[\\s]*</script>");
        js=url+UrlUtil.getTextZZ(js, "\\Q/\\E[.&\\S]+\\Q.js\\E");
        //得到流
        Reader r=getReader(js, "utf-8");
        //把Reader放入eval中(读者可以去API看一下,重载了很多的eval()方法)
        engine.eval(r);   
        Invocable inv = (Invocable) engine;   
        String value = (String)inv.invokeFunction("test","我是一个参数");
        System.out.println(value);
    }
   
    //得到Reader(使用HttpURLConnection得到外部js文件的Reader流)
    public static Reader getReader(String url,String code) {
        URL URL=null;
        HttpURLConnection conn=null;
        InputStream in=null;
        Reader br=null;
        try {
            URL=new URL(url);
            conn=(HttpURLConnection)URL.openConnection();
            //设置get请求
            conn.setRequestMethod("GET");
            //得到流
            InputStream();
            br=new InputStreamReader(in,code);
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return br;
    }
    //根据内容得到匹配
    public static String getTextZZ(String Text,String zz){
        Pattern p = Pattern.compile(zz);
        Matcher m = p.matcher(Text);
        String group="";
        while(m.find()){
            up();
        }
        return group;
    }
//得到HTML
    public static String getHtml(String url) {
        URL URL=null;
        HttpURLConnection conn=null;
        InputStream in=null;
        BufferedReader br=null;
        String html=null;
        try {
            URL=new URL(url);
            conn=(HttpURLConnection)URL.openConnection();
            conn.setRequestMethod("GET");
            String code=getCode(ContentType());
            InputStream();
            br=new BufferedReader(new InputStreamReader(in,code));
            //得到HTML文档
            String data="";
            while((adLine())!=null){
                html+=data+"\n";
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            try{
                br.close();
                in.close();
                conn.disconnect();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
        return html;
    }
}
注:外部的js(./WebRoot/js/t.js)文件内容为:
function test(p){
   
    return '调用了外部js方法  '+p;
}
注:我们所需的JSP文件(里面嵌入了js脚本)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JS测试</title>
    <script type="text/javascript" src="./js/t.js"></script>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。