一。运用场景:
考虑web登录的安全,在客户端使用javascript对密码进行MD5加密,这样在传输过程中密码就是密文而不是明文。在服务器端要使用同样的MD5加密算法对存储的密码进行处理。这样,同样一个算法要实现两套,不方便维护同一个代码库。
因此,考虑在java端调用javascript。
二。java脚本语言(来自网络)
JDK1.6加入了对Script(JSR223)的支持,JDK5 下需要添加 livetribe-jsr223.jar (未测试)java脚本语言框架提供的主要功能有:
1、使用ScriptEngine标准接口来执行脚本语言(包括代码段、函数、获取返回值等)
该接口是主要的使用接口,可以通过字符串、文件来执行给定的脚本并获取返回值。背后是各个脚本语言引擎的实现
2、使用Binds和ScriptContext提供java和脚本语言间的参数传递(支持命名空间)
对每个脚本引擎而言都有独立的命名空间来进行参数传递,同时也提供全局的命名空间和自定义命名空间。java程序和脚本语言可以通过命名空间相互传递参数
3、提供对脚本语言的编译/解析缓存(如groovy)以提高执行效率
这是针对实现了Compilable接口的引擎而言的,可以用来缓存编译/解析结果以提供重复执行的效率。比如groovy可以将代码编译为java字节码来执行,效率提高是非常明显的。
4、其他功能
其实我们使用前3个主要功能就够了,足可以满足我们在java程序中使用脚本语言的便利。java1.6版的JRE已经自带了javascript脚本语言的实现引擎,采用的是ECMAScript规范的实现Mozilla Rhino。因此,默认我们就可以使用脚本框架在java程序中执行和调用javascript代码了。对于javascript而言,和我们平常在浏览器中使用的基本上都一样,因为都是兼容ECMAScript规范的。有区别的是浏览器中的javascript扩展了可以对DOM对象操作的功能,这是ECMAScript规范中没有的,所以不用指望可以使用类似alert等这样的方言功能了(所有window对象的属性和方法都不可用用的)。
三。参考代码
0。环境
目前在tomcat6.0下出现错误:java.lang.NoClassDefFoundError: javax/script/ScriptException
,在weblogic10上运行正常。
1。web端代码:md5.js可以从网络找
2。服务器端代码:
调用:callMd5("D:/tmp/js/md5.js", "hex_hmac_md5", "bar", "123456");
public static Object callMd5(String funcName, String salt, String pwdhash) throws Exception{
ResourceBundle bundle = ResourceBundle.getBundle("config");
String jsName=bundle.getString("MD5JSFILE");
Object result = null;
String SCRIPT_NAME = "JavaScript";
// Get the JavaScript engine
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(SCRIPT_NAME);
if (engine == null) {
throw new ScriptException("Can not initialize "+SCRIPT_NAME+" engine!");
}
/*
* 如果读取javascript文件的时候,没有使用utf-8,那么出现以下错误。
* javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: illegal character (<Unknown source>#1) in <Unknown source> at line number 1
*/
// Run *.js
Reader scriptReader = new InputStreamReader(new FileInputStream(jsName),"utf-8");
try {
engine.eval(scriptReader);
} finally {
if(null!=scriptReader){
scriptReader.close();
scriptReader=null;
}
}
// Invoke a JavaScript function
if (engine instanceof Invocable) {
Invocable invEngine = (Invocable) engine;
result = invEngine.invokeFunction(funcName, salt, pwdhash);
System.out.println("[Java] result: " + result);
//System.out.println(" Java object: " + result.getClass().getName());
} else{
System.out.println("Engine does not support Invocable interface!");
throw new ScriptException("Engine does not support Invocable interface!");
}
return result;
}
3。为了性能,需要使用编译脚本
脚本在每次执行时都进行解析会浪费 CPU 资源。在多次执行相同的脚本时,若能编译脚本,就可以显著减少执行时间,而脚本编译所需要的方法可由另外一个可选接口 javax.script.Compilable 提供,JDK 6 所带的 JavaScript 引擎亦支持该接口。
分享到:
相关推荐
本文将深入探讨“Java调用JavaScript代码”的技术实现,以及它在实际项目中的应用场景。 Java和JavaScript虽然名字相似,但它们是两种完全不同的编程语言,各自有其特定的用途。Java是一种静态类型的、面向对象的...
Java调用Javascript的技术涉及了在Java Applet中通过脚本接口与Web页面上的JavaScript代码进行交互。这部分技术在当前的Web开发中已较少使用,因为Java Applet的安全性问题和浏览器的兼容性问题,使得现代浏览器逐渐...
而在某些场景下,可能需要从Java代码中调用JavaScript编写的函数,并获取这些函数的执行结果。为了实现Java和JavaScript之间的通信,Android WebView提供了addJavascriptInterface()方法。这个方法允许你向WebView...
其实使用javascript动态调试测试功能,是一个很好的方式,
【Java调用JavaScript技术】 Java调用JavaScript是一种常见的技术,特别是在网页应用中,它允许Java Applet与网页上的JavaScript代码进行交互。这种交互通常用于增强网页的动态性,比如实现内容的实时更新,无需...
**Java调用命令行** 在Java中,我们可以使用`Runtime`类或`ProcessBuilder`类来执行命令行操作。 1. **使用Runtime.exec()** `Runtime.getRuntime().exec(command)` 是最基础的方法,用于执行指定的系统命令。`...
Java 调用 JS 方法是指在 Java 代码中调用 JavaScript 代码的方法,从而实现 Java 和 JavaScript 之间的交互。在本文中,我们将详细介绍 Java 调用 JS 方法的实现步骤和相关知识点。 Java 调用 JS 方法的实现 在 ...
1. **Java调用JavaScript**: - `loadUrl`: 使用WebView的`loadUrl`方法可以加载网页URL或执行JavaScript代码。例如,要执行一段JavaScript代码,我们可以这样做: ```java webView.loadUrl("javascript:...
Java调用Chrome浏览器内核是开发桌面应用时一个常见的需求,尤其在需要嵌入Web页面或者与Web内容交互的场景下。CEF(Chromium Embedded Framework)是一个开源项目,它允许开发者将Google Chrome的Blink渲染引擎和V8...
接下来,将总结Java调用JavaScript实现字符串计算器的相关知识点: 1. 使用javax.script包中的类:要实现这一功能,必须使用javax.script包中的ScriptEngineManager类和ScriptEngine类。 2. 创建JavaScript脚本...
"java调用js方法.doc"很可能是详细描述如何从Java调用JS函数的步骤和示例。 在实际应用中,Java代码可能会通过Ajax发送一个请求到服务器,服务器解析请求后调用对应的JS函数,例如在"des.js"中执行解密操作,然后将...
总结来说,Java调用IE内核主要涉及Java与ActiveX控件的交互,这一技术虽然有一定的历史背景,但在现代Web开发中已经较少使用,更多的现代解决方案倾向于使用标准Web技术或者基于Chromium的框架。理解和学习这个知识...
在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...
用户可能需要手动开启全屏模式,或者使用JavaScript在页面加载时触发全屏,但这超出了Java调用浏览器的范畴。 总的来说,Java调用浏览器的关键在于理解如何与操作系统进行交互,以及利用标准API提供的功能。对于更...
1. **Java调用JavaScript** 当Java代码需要执行JavaScript时,可以使用`WebView`的`loadUrl()`或`evaluateJavascript()`方法。`loadUrl()`通常用于加载整个网页或者执行一段JS代码,例如: ```java webView....
从XSLT样式表调用JavaScript的知识点解析 在探讨如何从XSLT样式表调用JavaScript时,我们首先需要理解XSLT和JavaScript的基本概念及其在XML文档处理中的作用。XSLT(Extensible Stylesheet Language ...
"Android调用JavaScript.zip"这个压缩包可能包含了关于如何在Android中调用JavaScript代码的相关示例和资源。下面我们将深入探讨这一主题。 1. **WebView组件** Android中的WebView是一个可以加载和显示网页的控件...
源代码可能包括创建`ScriptEngine`、编写和执行JavaScript代码、以及调用JavaScript函数的示例。 总的来说,通过JSR 223,Java开发者可以轻松地在Java程序中嵌入JavaScript,实现两者的交互,从而利用JavaScript的...
标题“dwr测试,java调用js”表明我们将探讨如何通过DWR进行测试,并演示Java如何调用JavaScript代码。DWR提供了两种主要的交互模式:`Call`和`Reverse Call`。`Call`模式是常规的前端到后端的通信,而`Reverse Call...
本文将详细讲解如何在Android设备上实现Java代码调用JavaScript,以及JavaScript反过来调用Android Java代码的方法。 一、Android调用JavaScript 1. 使用`WebView`:Android中的`WebView`组件用于加载和显示网页...