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小时内删除。
发表评论