运用java与javascript集合对象运用能力以及对字符串解析

JavaScript012

运用java与javascript集合对象运用能力以及对字符串解析,第1张

Java用ScriptEngine解析脚本

javax.script,始于JDK1.6,不过现在只有sun实现的JavaScript的解析器,难道是因为主要用来解析js语法所以归类到JEE的范畴?不过基本足够了,一般的用途主要是能解析通用的表达式就好,比如X >= 1(X作为参数传入)这样的表达式,也能利用js的函数语法,创造一个就像Java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。

Script主要类及接口

ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口

ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。

ScriptEngine代码示例

先来看一段JS

var arrclass = new Array()

arrclass.push(new Class(20000,"计算机-软件开发"))

arrclass.push(new Class(30000,"计算机-网络/通讯"))

arrclass.push(new Class(10000,"计算机-硬件开发"))

arrclass.push(new Class(40000,"计算机-管理"))

arrclass.push(new Class(50000,"计算机-品质管理/技术支持"))

arrclass.push(new Class(320000,"电子/电器/半导体/仪器仪表"))

java代码实现解析

public void parseJS() {

//1、通过Http请求获取js的String数据,格式如上

String jsData = getJsData("url")

//2、观察js结构,自定义Class,push到数组中,java中需要定义跟js中的Class的声明

String clazz = "function Class(classId, className){ this.classId=classIdthis.className=className}"

//3、初始化ScriptEngine

ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript")

//4、js中未定义返回对象,这里需要将Class数据转换成字符串的数组返回,个人觉得很别扭,不知道是理解错误还是确实如此?

//如果不这样做则直接在js后加上arrclass,cScript.evel()则返回NativeObject对象的数组

String fun = "var result = new Array() for(var i=0i <arrclass.lengthi++){result.push(new Array(arrclass[i].classId,arrclass[i].className))}result"

Compilable compilable = (Compilable) engine

//4、使用NativeArray获取数据

CompiledScript cScript

try {

cScript = compilable.compile(clazz + jsData + fun)

NativeArray na = (NativeArray) cScript.eval()

for (int i = 0i <na.getLength()i++) {

NativeArray nv = (NativeArray) na.get(i, null)

System.out.println(nv.get(0, null).toString() + " " + nv.get(1, null).toString())

}

} catch (ScriptException ex) {

ex.printStackTrace()

}

}

java代码中执行js计算

public void js() {

// 创建脚本引擎管理器

ScriptEngineManager sem = new ScriptEngineManager()

// 创建一个处理JavaScript的脚本引擎

ScriptEngine engine = sem.getEngineByExtension("js")

try {

// 执行js公式

engine.eval("if(6>5){flag=true}else{flag =false}")

} catch (ScriptException ex) {

ex.printStackTrace()

}

//看看我们预期的反馈结果 true

System.out.println(engine.get("flag"))

}

Java解析JS另一大引擎-Rhino

Rhino是完全用Java编写的JavaScript的开放源代码实现。它通常是嵌入到Java应用程序提供给最终用户的脚本。它被镶嵌在J2SE6作为默认的Java脚本引擎。

使用Rhino来解析,感觉一切都很清晰明朗.

public void parseJS() {

//1、通过Http请求获取js的String数据,格式如上

String jsData = getJsData("url")

//2、定义跟js中的Class的声明

String clazz = "function Class(classId, className){ this.classId=classIdthis.className=className}"

//3、初始化Context

Context cx = Context.enter()

Scriptable scope = cx.initStandardObjects()

Object result = cx.evaluateString(scope, clazz + jsData + "arrclass", "arrclass", 1, null)

System.out.println(NativeJSON.stringify(cx, scope, result, null, null))

Context.exit()

}

JavaScript有两种地方存在,一是在页面就写出来的,二是引用的。

1.直接写出来的,一看就明白(右键->查看页面源代码)

2.引用的,就比如说这个页面吧,其中有下面代码:

<head>

<link href="/ikqb.css" rel="stylesheet" type="text/css">

<script type="text/javascript"src="/userlogin.js?213">

</script>

</head>

通过这段代码(src="/userlogin.js?213")知道他引用的位置是http://zhidao.baidu.com/userlogin.js,输入这个网址看看效果,就是document.domain="baidu.com"document.write("等等,这就是他引用的JS了。

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

<%

String path = request.getContextPath()

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"

%>

<%@taglib uri="/struts-tags" prefix="s"%>

<%

String [][]str = {{"40000","09401","09402"},{"40001","09403","09404"}}

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<base href="<%=basePath%>">

<title>add score</title>

<meta. http-equiv="pragma" content="no-cache">

<meta. http-equiv="cache-control" content="no-cache">

<meta. http-equiv="expires" content="0">

<meta. http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta. http-equiv="description" content="This is my page">

<script. language="javascript">

function select(){

var bj=document.getElementById('class')<!--删除前一次创建的option-->

obj.options.length=0

var course = document.getElementById("course").value

alert(course)

<%

for(int i=0i<str.lengthi++){%>

if(course == "<%=str[i][0]%>"){

<%

for(int j=1j<str[i].lengthj++){%>

var ption = document.createElement("option")

oOption.innerHTML = "<%=str[i][j]%>"

oOption.value = "<%=str[i][j]%>"

document.getElementById("class").options.add(oOption)

<%}%>

}

<%}%>

var arr = "<%=str[0][1]%>"

alert(arr)

}

</script>

<script. type="text/javascript">

</script>

</head>

<body id="level1">

<form. action="delete!deleteStudent.action" method="post">

<font size="2px" color="red"><s:property value="#request.sexistError"/></font>

课程:<select id="course" name="course" ><%for(int i=0i<str.lengthi++){ %>

<option nclick="select()"><%=str[i][0]%></option>

<%} %>

</select>

班级:<select id="class" name="cla"></select>

<div id="score_menu">

<input type="submit" name="submit" class="submit" value="提交"/>

<input type="reset" name="reset" class="reset" value="重置"/><br />

</form>

</body>

</html>