文档库 最新最全的文档下载
当前位置:文档库 › java调用js方法

java调用js方法

java调用js方法
java调用js方法

Java调用js方法

java调用js方法分三种:(从jdk1.6开始java支持了调用脚本)

一.调用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 = mgr.getEngineByName("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);

}

}

二.调用外部js文件中的方法

又细分为:调用本地js文件

外网j s文件(也就是网页中嵌入的j s脚本文件)

简单示例:

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 = mgr.getEngineByName("JavaScript");

//加载一个文件

File f=new File("./WebRoot/js/t.js");

Reader r=new InputStreamReader(new 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 https://www.wendangku.net/doc/5c13416322.html,.HttpURLConnection;

import https://www.wendangku.net/doc/5c13416322.html,.URL;

import java.util.regex.Matcher;

import java.util.regex.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 = mgr.getEngineByName("JavaScript");

String url="http://localhost/Test";

String html=UrlUtil.getHtml(url);

//使用正则匹配js文件路径

String js=getTextZZ(html, "[\\s]*");

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");

//得到流

in=conn.getInputStream();

br=new InputStreamReader(in,code);

}catch(Exception ex){

ex.printStackTrace();

}

return br;

}

//根据内容得到匹配

public static String getTextZZ(String Text,String zz){ Pattern p = https://www.wendangku.net/doc/5c13416322.html,pile(zz);

Matcher m = p.matcher(Text);

String group="";

while(m.find()){

group=m.group();

}

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(conn.getContentType());

in=conn.getInputStream();

br=new BufferedReader(new InputStreamReader(in,code));

//得到HTML文档

String data="";

while((data=br.readLine())!=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"%>

JS测试

三.调用jsp页面中的js方法

<%@page language="java"import="java.util.*"pageEncoding="UTF-8"%>

JS测试

注:我的思路:通过正则匹配出JSP页面中的js脚本,然后将匹配的内容传到

engine.eval()方法中,就ok了。这种方法比较笨,可能还有更好的实现效果,有想到更好的方法的读者可以分享一下。

(第三种方式的实现代码就不写了,只要会了第二种,第三种就轻而易举了)

有做这方面的可以加我QQ:275070023(请注java调用js方法)共同进步嘛

相关文档