使用Java处理JavaScript

直接上代码了,没什么好说的

package com.tiamaes.gjds.script;

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

/**
 * <p>类描述: javascript处理器 </p>
 * <p>创建人:王成委  </p>
 * <p>创建时间:2015年1月22日 上午11:16:08  </p>
 * <p>版权说明: © 2015 Tiamaes </p>
 */
public class JavascriptProcesser {

	private static ScriptEngine scriptEngine;

	private static final String MEDIA_TYPE = "application/javascript";

	/**
	 * <p>方法描述:获取javascript引擎管理器</p>
	 * <p>创建人: 王成委  </p>
	 * <p>创建时间: 2015年1月10日 上午10:50:06 </p>
	 * @param createNew
	 * @return
	 */
	public ScriptEngine getScriptEngineManager(boolean createNew){
		if(createNew){
			ScriptEngineManager mgr = new ScriptEngineManager();
			return mgr.getEngineByMimeType(MEDIA_TYPE);
		}else if(scriptEngine == null){
			ScriptEngineManager mgr = new ScriptEngineManager();
			scriptEngine = mgr.getEngineByMimeType(MEDIA_TYPE);
		}
		return scriptEngine;
	}

	/**
	 * <p>方法描述:从javascript中获取变量的值</p>
	 * <p>创建人: 王成委  </p>
	 * <p>创建时间: 2015年1月10日 上午10:50:06 </p>
	 * @param script
	 * @param varName
	 * @return
	 * @throws ScriptException
	 */
	public Object getByVariableName(String script,String varName) throws ScriptException{
		ScriptEngine scriptEngine = this.getScriptEngineManager(true);
		scriptEngine.eval(script);
		return scriptEngine.get(varName);
	}

	/**
	 * <p>方法描述:执行javascript方法</p>
	 * <p>创建人: 王成委  </p>
	 * <p>创建时间: 2015年1月10日 上午10:50:06 </p>
	 * @param script
	 * @param funName
	 * @param params
	 * @return
	 * @throws ScriptException
	 * @throws NoSuchMethodException
	 */
	public Object invokeFunction(String script,String funName,Object...params) throws ScriptException, NoSuchMethodException{
		ScriptEngine scriptEngine = this.getScriptEngineManager(true);
		scriptEngine.eval(script);
		Invocable inv = (Invocable) scriptEngine;
		Object obj = inv.invokeFunction(funName,params);
		return obj;
	}

	/**
	 * <p>方法描述:获取js引擎</p>
	 * <p>创建人: 王成委  </p>
	 * <p>创建时间: 2015年1月10日 上午10:50:06 </p>
	 * @param script
	 * @return
	 * @throws ScriptException
	 */
	public ScriptEngine getScriptEngine(String script) throws ScriptException{
		ScriptEngine scriptEngine = this.getScriptEngineManager(true);
		scriptEngine.eval(script);
		return scriptEngine;
	}

}

测试方法

package com.tiamaes.gjds.script;

import static org.junit.Assert.*;

import javax.script.ScriptException;

import org.junit.Test;

/**
 * <p>类描述: 测试 JavascriptProcesser,仅测试{@link JavascriptProcesser#getByVariableName(String, String)}
 * 和{@link JavascriptProcesser#invokeFunction(String, String, Object...)}</p>
 * <p>创建人:王成委  </p>
 * <p>创建时间:2015年1月23日 下午5:50:10  </p>
 * <p>版权说明: © 2015 Tiamaes </p>
 */
public class JavascriptProcesserTest {

	JavascriptProcesser processer = new JavascriptProcesser();
	/**
	 * Test method for {@link com.tiamaes.gjds.script.JavascriptProcesser#getByVariableName(java.lang.String, java.lang.String)}.
	 * @throws ScriptException
	 */
	@Test
	public void testGetByVariableName() throws ScriptException {
		String script = "var name='jaune'";
		String value = (String) this.processer.getByVariableName(script, "name");
		assertEquals("jaune", value);
	}

	/**
	 * Test method for {@link com.tiamaes.gjds.script.JavascriptProcesser#invokeFunction(java.lang.String, java.lang.String, java.lang.Object[])}.
	 * @throws ScriptException
	 * @throws NoSuchMethodException
	 */
	@Test
	public void testInvokeFunction() throws NoSuchMethodException, ScriptException {
		String script = "function getName(){return 'jaune'}";
		String value = (String) this.processer.invokeFunction(script, "getName");
		assertEquals("jaune", value);
	}

	/**
	 * Test method for {@link com.tiamaes.gjds.script.JavascriptProcesser#invokeFunction(java.lang.String, java.lang.String, java.lang.Object[])}.
	 * @throws ScriptException
	 * @throws NoSuchMethodException
	 */
	@Test
	public void testInvokeFunctionWithParams() throws NoSuchMethodException, ScriptException {
		String script = "function getName(name){return name}";
		String value = (String) this.processer.invokeFunction(script, "getName","jaune");
		assertEquals("jaune", value);
	}

}
时间: 2024-10-11 14:04:59

使用Java处理JavaScript的相关文章

雷锋推到雷峰塔,Java implements Javascript。

最近遇到这么一个问题,如何让用户在软件中自定义函数. 举个例子,使用Java做一个小的监控系统,用户A希望CPU超过90%的时候报警,B用户希望内存超过90%的时候报警,C用户希望CPU超过90%或者内存超过80%的时候报警,D用户希望CPU超过60%且硬盘剩余小于10%的时候报警-- 程序员之力有限,而用户之欲无魇.以开发追需求,如抱薪救火,不妨让用户自己定义报警的规则. 我们当然不需要为此开发一种脚本语言,我觉得JavaScript就是一种不错的语言.我们以一个单输入单输出的函数为例讲解如何

C++、Java、JavaScript中的正则表达式

编程思想之正则表达式 什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗*浩":那么"罗*浩"就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text).再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开始

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

从Java和JavaScript来学习Haskell和Groovy

直击现场 记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会: 学习和使用什么编程语言不重要,重要的是算法和设计: 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通. 简直就是是胡扯啊.也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的. 就说第一条,编程语言不但重要,而且太重要了.换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问

java,jsp,javascript的区别

在我回答你问题之前请允许我对Java语言作一个简单的介绍,你不了解这些很难和你说明白你的问题Java是一种面向对象独立于平台的安全的计算机语言,你也可以认为它是一个平台这种语言针对应用领域不同,共分为三个版本JavaSE Java平台标准版 其属于Java基础部分,用JavaSE可以开发C/S架构的桌面式应用程序JavaME Java平台迷你版 用于为嵌入式设备开发应用程序,如手机或掌上电脑的软件.游戏之类的JavaEE Java企业开发版本 用于企业级软件的开发,用JavaEE可以开发大型的B

Java和JavaScript中使用Json方法大全

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON採用全然独立于语言的文本格式,可是也使用了相似于C语言家族的习惯(包含C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写.同一时候也易于机器解析和生成

C++、Java、JavaScript中的日志(log)

编程思想之日志记录 什么是log? 相信你一定用日记写过点滴心事,或是用空间.微信.微博刷着动态,记录你每天的喜怒哀乐!在程序中也有一种类似的东西,记录着他主人(应用程序)每天的行踪,他叫日志(log).日记--是人类生活的记事本,日志(log)--是程序运行状况的记事本. 顾名思义,日志(log,后面均以log称之)就是用来记录程序每天的运行状况的,比如程序出现异常的情况,或是某个关键点,功某个重要的数据或交易等.这里的每天不是说每天一记,可以是伴随着程序运行的始终,只要程序在运行着就一直在记

Nashorn 在JDK 8中融合Java与JavaScript之力

从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎.Nashorn完全支

Java 和 JavaScript 的关系

Java 和 JavaScript 是两门不同的编程语言. 一般认为,当时 Netscape 之所以将 LiveScript 命名为 JavaScript,是因为 Java 是当时最流行的编程语言,带有 "Java" 的名字有助于这门新生语言的传播. 它们的相同之处包括: 它们的语法和 C 语言都很相似: 它们都是面向对象的(虽然实现的方式略有不同): JavaScript 在设计时参照了 Java 的命名规则: 它们的不同之处包括: JavaScript 是动态类型语言,而 Java

Nashorn——在JDK 8中融合Java与JavaScript之力--转

原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,N