怎么java实现接口调用javascript中调用java类中的方法

6503人阅读
java(10)
使用DWR实现JS调用服务端Java代码
DWR全称Direct Web Remoting,是一款非常优秀的远程过程调用(Remote Procedure Call)框架,通过浏览器提供的Ajax引擎实现在前端页面的JS代码中调用服务端Java代码。使用它我们可以非常方便的和服务端进行交互,轻松获取服务端返回的数据。&
下面是DWR官方网站地址:&
2 DWR的使用
接下来我们看一下如何使用这款框架:
2.1 获取DWR所需Jar包
要想使用dwr框架,我们首先需要获取dwr框架的jar包,读者可以从官网中获取,官网下载地址:
点击dwr.jar进行下载即可,除此之外dwr依赖的commons-logging.jar日志工具包我们可以从Maven资源库下载:&
下载完成后將两个jar包拷贝到web工程的WEB-INF/lib目录下。
2.2 在web.xml文件中配置DwrServlet
打开web工程WEB-INF目录下的web.xml文件,配置处理请求的Servlet,具体内容如下:
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns=&/xml/ns/javaee& xsi:schemaLocation=&/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd& id=&WebApp_ID& version=&3.0&&
&display-name&dwr_web&/display-name&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&servlet-name&dwr&/servlet-name&
&servlet-class&org.directwebremoting.servlet.DwrServlet&/servlet-class&
&init-param&
&param-name&debug&/param-name&
&param-value&true&/param-value&
&/init-param&
&/servlet&
&servlet-mapping&
&servlet-name&dwr&/servlet-name&
&url-pattern&/dwr/*&/url-pattern&
&/servlet-mapping&
&/web-app&
2.3 创建dwr配置文件dwr.xml
在web.xml所在目录下创建dwr的配置文件dwr.xml,配置文件内容如下:
&?xml version=&1.0& encoding=&UTF-8&?&
&!DOCTYPE dwr PUBLIC
&-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN&
&http://getahead.org/dwr/dwr30.dtd&&
&create creator=&new& javascript=&helloworldService&&
&param name=&class& value=&com.csii.dwr.service.HelloWorldService&&&/param&
在dwr.xml文件中我们通过allow标签定义了一个支持JS调用的服务端的类com.csii.dwr.service.HelloWorldService,接下来的工作就是编写HelloWorldService类。
2.4 创建支持JS调用的服务器端的Java类
package com.csii.dwr.
public class HelloWorldService {
public String sayHello(String username)
return &Hello World!& +
在HelloWorldService 类中我们定义了一个sayHello方法,该方法返回一个字符串。在JS中我们就可以通过helloworldService.sayHello(str)形式直接调用服务器端定义的函数。
2.5 查看服务端公开的支持JS调用的服务
部署应用后,在浏览器中输入http://localhost:8080/dwr_web/dwr/可以查看服务端公开了哪些支持JS调用的服务。
可以看到我们在dwr配置文件dwr.xml中定义的helloworldService,点击连接可以进入服务的测试界面。&
这里我们可以测试sayHello方法。在文本框中输入内容,点击Execute按钮即可。
2.6 在JS调用公开的服务
要想在JS中调用服务端公开的服务,我们需要將engine.js和helloworldService.js引入到页面中(上图测试界面有相关说明),
引入代码上如下:
&script type='text/javascript' src='/dwr_web/dwr/engine.js'&&/script&
&script type='text/javascript' src='/dwr_web/dwr/interface/helloworldService.js'&&/script&
接下来我们编写一个JSP页面,在JSP中使用helloworldService服务:
&pre name=&code& class=&html&&&%@ page language=&java& contentType=&text/ charset=utf-8&
pageEncoding=&utf-8&%&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
&meta http-equiv=&Content-Type& content=&text/ charset=utf-8&&
&title&Index Page&/title&
&script type='text/javascript' src='/dwr_web/dwr/engine.js'&&/script&
&script type='text/javascript' src='/dwr_web/dwr/interface/helloworldService.js'&&/script&
&script type='text/javascript' src='/dwr_web/dwr/util.js'&&/script&
&button onclick=&sayHello()&&测试&/button&
&script type=&text/javascript&&
var sayHello = function(){
return helloworldService.sayHello(&Rongbo_J&,callBack);
var callBack = function(data)
alert(data);
我们在页面中添加了一个按钮,点击按钮是调用sayHello方法,在sayHello方法中通过helloworldService.sayHello(&Rongbo_J&,callBack)形式调用服务端sayHello函数,第二个参数是一个回调函数用于接收服务端返回的数据。在回调函数中我们弹出服务器端返回的内容。
在浏览器中预览效果如下:&
可以看到服务端返回的数据HelloWorld!Rongbo_J
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:22474次
排名:千里之外
原创:20篇
(2)(1)(2)(7)(7)(2)(1)(2)(2)(1)(1)javascript 实现 java 中String的hashcode方法 -
- ITeye博客
博客分类:
javascript中有需要用到像类似java中的hashcode方法,想把java中的hashcode方法直接搬到js中发现不行
* Returns a hash code for this string. The hash code for a
* &code&String&/code& object is computed as
* &blockquote&&pre&
* s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
* &/pre&&/blockquote&
* using &code&int&/code& arithmetic, where &code&s[i]&/code& is the
* &i&i&/i&th character of the string, &code&n&/code& is the length of
* the string, and &code&^&/code& indicates exponentiation.
* (The hash value of the empty string is zero.)
a hash code value for this object.
public int hashCode() {
if (h == 0 && len & 0) {
char val[] =
for (int i = 0; i & i++) {
h = 31*h + val[off++];
关键是hash的类型是int,int的范围是MIN_VALUE = 0x; MAX_VALUE = 0x7
这样在执行
h = 31*h + val[off++];
的时候当超有可能超过int的最大值,变成负数。但js里面是不区分int,long的直接显示,显示不下用科学技术法,所以需要一个模拟java中int超出范围变负数的方法。
最终的实现如下:
function isNull(str){
return str == null || str.value == "";
* java String hashCode 的实现
* @param strKey
* @return intValue
function hashCode(strKey)
var hash = 0;
if(!isNull(strKey))
for (var i = 0; i & strKey. i++)
hash = hash * 31 + strKey.charCodeAt(i);
hash = intValue(hash);
* 将js页面的number类型转换为java的int类型
* @param num
* @return intValue
function intValue(num)
var MAX_VALUE = 0x7
var MIN_VALUE = -0x;
if(num & MAX_VALUE || num & MIN_VALUE)
return num &= 0xFFFFFFFF;
浏览: 74759 次
来自: 杭州
很不错的文章,最近看了看了夜行侠老师讲的Netty深入浅出源码 ...
为之疯狂的颜值,陶醉天年。
swingboat 写道请问,你那第三幅图是用什么工具画的?谢 ...
请问,你那第三幅图是用什么工具画的?谢谢!
我也正在寻找return getBufIfOpen()[pos ...在JavaScript中使用Java
我的图书馆
在JavaScript中使用Java
12.3 在JavaScript中使用Java
利用JavaScript可以把Java语言的小应用程序(applet),插件以及包括表单、超级链接和图象在内的各种Web元素有机地联系起来。
JavaScript用一个叫做applets的applet对象数组来访问Java的applet。applets数组是浏览器对象document的一个属性。这个数组中的每一个applet对象都按照它们在HTML源代码中出现的顺序排列,下标值从0开始。
&applet code="Blink.class" name="Blink" width=300 height=100&
则相应的JavaScript语言中的applet对象既可以使用类似document.applets[0]形式表示,也可以使用document.Blink来访问,Blink是这个小应用程序的名称。
有一种特殊的情况,在JavaScript中不能通过网络访问Java的属性,也就是说JavaScript只能调用本地的Java小应用程序中的各种公用变量和属性。这样的设计是为了保障Java的安全性。
除了可以在JavaScript中访问Java的小应用程序以外,还可以利用JavaScript访问Java包名字空间的任何一个类。Java语言中提到的类(class)的概念同JavaScript中的对象概念是一致的。
提示:Java中的各种对象被组织成类,类又被组织成包,包中的子类从它的基类中继承属性和方法,并加以扩充和改变。
任何一个Java中的类都可以使用一个简单的语法对应一个JavaScript中的对象。例如:var javaSystem=Java.lang.S
则JavaScript中的对象javaSystem就对应Java语言中的Java.lang.System对象,从而直接在JavaScript中访问Java.lang.System中的各种方法和属性。例如可以在JavaScript中使用javaSystem.err.println("从JavaScript中调用Java!!");来利用Java的方法输出一个字符串。
除了可以直接使用Java提供的类以外,还可以在JavaScript中动态地创建一个Java类的实例,就好象这个类是JavaScript本身定义的一样。例如可以在JavaScript中创建一个Java中的Date类:var myNewDate=new Java.util.Date();这样创建的myNewDate对象就可以访问所有Java类Date的数据。
通过使用JavaScript的这些直接访问Java类库的功能,就可以大大地扩展JavaScript的使用范围,使它不再局限在狭小的范围之内,而可以拥有Java语言能够实现的大多数功能,例如网络访问和复杂的窗口响应等。
例:一个小应用程序import java.applet.Aimport java.awt.Gimport java.awt.F
public class ControlJava extends Applet {Font f=new Font("TimesRoman",Font.BOLD,60);String T
public void init() {Text=new String("这是一个Java的小应用程序,可以在JavaScript中控制。");}
public void SetText(String newText) {Text=newTrepaint();}
public void paint(Graphics g) {g.setFont(f);g.drawString(Text,15,50);}}
这个小应用程序提供一个叫做SetText()的公共方法,这个方法可以设置这个小应用程序所显示的文字,下面在JavaScript中使用这个方法来控制Java小应用程序的输入。
例:&html&&body&&form name="JavaScriptForm"&&input type="Text" name="text1"&&input type="Button" value="出现在Java小应用程序中"onClick="document.Java1.SetNewText(document.JavaScriptForm.text1.value);"&&/form&
&applet name="Java1" code="ControlJava.class" width=450 height=125&&/applet&&/body&&/html&
只要在网页中输入一个字符串,JavaScript就负责接受这个字符串。由于Java小应用程序提供一个公共的接口方法SetNewText(),这个新输入的字符串也就可以被Java小应用程序所访问到。
Java语言还允许从applet中直接调用JavaScript的方法和访问JavaScript对象的属性。
由于Java语言本身的安全机制,必须显式地指定让applet访问相对较不安全的JavaScript代码,这可以通过在&applet&标记中加上MAYSCRIPT属性来实现。例如:&applet code="some.class" width=java Applet" mayscript&
在Java语言中处理和JavaScript通信的类库是netscape.javaScript.*。这个包定义了JSObject类和JSException对象。在JavaScript中使用的对象都可以表示成netscape.javaScript.JSObject的实例。
在Java中准备这个包后,访问一个JavaScript对象的属性可以分两步进行:创建一个netscape.javaScript.JSObject实例,用来对应JavaScript中的对象;使用JSObject类的getMember()方法可以访问相应JavaScript中的属性。
提示:如果通过这样的getMember()方法得到的JavaScript属性是一个对象,这样的操作还可以进行下去。
JavaScript中的各种浏览器和界面对象都是分层的。处于对象从属表最顶层的是浏览器对象window,再下面是document对象,这个对象可以包容表单以及表单中的界面对象。每一个下层对象是上层对象的一个属性。所以,按照刚才的方法,可以采用如下的代码得到JavaScript语言中的一个界面对象:JSObject windowHandle=JSObject.getWindow(this);JSObject documentHandle=(JSObject) windowHandle.getMember("document");JSObject formHandle=(JSObject) documentHandle.getMember("myform");JSObject buttonHandle=(JSObject) formHandle.getMember("mybutton");在得到这个JavaScript对象后,就可以获得或设定对象的属性。
为了调用JavaScript对象的有关方法,可以采用下面的两种方法之一:使用JSObject类中的call("methodName",arguments)方法:这个Java方法接受一个JavaScript对象的方法名称以及必要的参数,自动调用对应JavaScript的对象中的方法。使用JSObject类中的eval("expression")方法:这个Java方法接受一个字符串,这个字符串由JavaScript的命令组成,这个方法自动执行这个字符串中的命令,就好象这个命令是在JavaScript中的一样。
例:Java程序在代码中访问JavaScript中的window对象的alert()方法import netscape.javascript.JSOimport netscape.javascript.JSE
public class jsAlert extends java.applet.Applet implements Runnable {JSObject windowO
public void init() {windowObject=JSObject.getWindow(this);}
public void main() {windowObject.eval("alert(/"Hello, World!/");");}
public void stop(){}
public void paint(){}
public void run(){}}
12.4 JavaScript的局限性以及未来的展望
这里说的局限性首先是指JavaScript在安全处理上的局限性,其次是指JavaScript在功能上的局限性。
已经报告的JavaScript安全性缺陷主要有:JavaScript脚本程序可以读取用户计算机上URL的历史信息,并在用户不知道的情况下把这些信息发送到远方的服务器上。JavaScript脚本程序可以得到用户计算机硬盘上的文件列表。JavaScript脚本程序可以在用户不知道的情况下使用用户的E-mail帐号发送E-mail。
由于JavaScript只能在浏览器的小空间中运行,所以除了特别重要的场所以外,一般使用的用户不必太担心浏览网页中的JavaScript程序会给用户计算机带来怎样的损失,至少JavaScript程序不能越过浏览器的限制而强行把用户的硬盘格式化掉。上面提到的一些小的安全性隐患也会在将来的JavaScript发布版本中逐步予以清除。
JavaScript的第二个局限性体现在功能上:由于JavaScript只是一种脚本设计语言,在图形和多媒体处理方面的功能非常弱。若想实现比较完整的媒体操纵功能,目前比较好的解决方法可能是利用Java小应用程序来补充。JavaScript是解释执行的,所以执行的速度非常慢,这是所有脚本语言的通病。
TA的推荐TA的最新馆藏
喜欢该文的人也喜欢js中如何调用java的后台方法?
js中如何调用java的后台方法
通过调用后台的servlet来实现
也就是说相当于想后台发一次请求,请求的参数中有必要的数据可以确定后台的对应的bean的特定的方法
这种做法最好通过异步处理来实现
其他答案(共1个回答)
调用后台方法。
jquery的 ajax比较简单 楼主可稍微学习下 就可以用..
各位马头们好,各位小兵
tElementById("tab_head_"+i).className=(i==n)?"headMenu2":"headMenu1";
检查下浏览器是否支持跳转js代码,你也可以直接在模板页面添加相关代码,或者安装广告插件也是可以的。
希望能给你帮助。
被static修饰的方法可以直接调用,被称作静态方法
#丽枫酒店(麗枫LAVANDE三亚解放路第一市场店)#怎么只有一个房型?其他的房型呢?
答: 这个要设计到JNI的开发,就是用Java来调用C语言的函数库,还要编写缓冲器来解决传输问题,还有就是网络协议一定要了解,做的时候要用多线程来控制你所有的缓冲器,...
答: 所谓的网络编程,不论c还是java,本质上都是通过socket进行数据传输;
一般情况下可以使用的传输协议有tcp、udp、ftp等等,这些协议为网络变成提供...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415Js通过PhoneGap调用Java方法并互相传参的。
一、JAVA代码
写一个类,该类继承自Plugin并重写execute方法。
import org.json.JSONA
import android.app.A
import android.app.AlertD
import android.content.ActivityNotFoundE
import android.content.DialogI
import android.content.I
import android.net.U
import android.os.B
import com.phonegap.api.PhonegapA
import com.phonegap.api.P
import com.phonegap.api.PluginR
public class PluginTest extends Plugin {   public&static&String&ACTION&=&"hello";
public PluginTest() {
* Executes the request and returns PluginResult.
* @param action
The action to execute.
* @param args
JSONArray of arguments for the plugin.
* @param callbackId
The callback id used when calling back into JavaScript.
A PluginResult object with a status and message.
public PluginResult execute(String action, JSONArray args, String callbackId) {
JSONObject jsonObj = new JSONObject();//可以返回给JS的JSON数据
if (action.equals("hello")) {
String str1= args.getString(0); //获取第一个参数
String str2= args.getString(1); //获取第二个参数
jsonObj.put("str1", str1+"1");
//把参数放到JSONObject对象中
jsonObj.put("str2", str2+"2");  //把参数放到JSONObject对象中
PluginResult r = new PluginResult(PluginResult.Status.OK,jsonObj);
} catch (Exception e) {
e.printStackTrace();
二、在plugins.xml中配置插件
在plugins.xml文件中添加对新插件的配置信息
&?xml version="1.0" encoding="utf-8"?&
&plugin name="App" value="com.phonegap.App"/&
&plugin name="Geolocation" value="com.phonegap.GeoBroker"/&
&plugin name="Device" value="com.phonegap.Device"/&
&plugin name="Accelerometer" value="com.phonegap.AccelListener"/&
&plugin name="Compass" value="passListener"/&
&plugin name="Media" value="com.phonegap.AudioHandler"/&
&plugin name="Camera" value="com.phonegap.CameraLauncher"/&
&plugin name="Contacts" value="com.phonegap.ContactManager"/&
&plugin name="Crypto" value="com.phonegap.CryptoHandler"/&
&plugin name="File" value="com.phonegap.FileUtils"/&
&plugin name="Network Status" value="com.phonegap.NetworkManager"/&
&plugin name="Notification" value="com.phonegap.Notification"/&
&plugin name="Storage" value="com.phonegap.Storage"/&
&plugin name="Temperature" value="com.phonegap.TempListener"/&
&plugin name="FileTransfer" value="com.phonegap.FileTransfer"/&
&plugin name="Capture" value="com.phonegap.Capture"/&
&!-- 新增的插件类配置 name 写你的类名,value写 包名.类名--&
&plugin name="PluginTest" value="com.easyway.barcode.PluginTest "/&
&/plugins&
三、Javascript文件中注册插件
新建一个.js文件,并把该文件和phonegap文件放在同一目录。(新建一个simplePlugin.js文件)
var SimplePlugin = function() {};
//str1和str2是传到JAVA的参数
SimplePlugin.prototype.hello = function(successCallback, failureCallback, str1, str2) {
// exec 內的參數分別是: Success Callback, Failure Callback, Registered Plugin name:就是在XML文件配置的那个所对应的name,
// 'hello'是传入Java文件的execute方法中的参数String action
// name (從 HTML 傳進來的參數)
return PhoneGap.exec(successCallback, failureCallback, 'PluginTest', 'hello', [str1,str2]);
// 这里是 PhoneGap Plugin 的註冊,Plugin 的名稱還有 Native Class 的名稱別打錯了,就是我們剛剛輸入的那些
PhoneGap.addConstructor(function() {
// Register the javascript plugin with PhoneGap
PhoneGap.addPlugin('simpleplugin', new SimplePlugin());
//simpleplugin是插件名称, new SimplePlugin()实例化的是本Javascript的类名
四、在HTML文件中调用方法
在html文件中引入phonegap和插件的js文件,调用方法
&!DOCTYPE html&
&meta charset="utf-8"&
&title&JAVA传参&/title&
&script src="phonegap.js"&&/script& &!--phonegap包--&
&script src="js/jquery.js"&&/script&
&script src="simplePlugin.js"&&/script&&!--自定义的插件文件--&
$(document).ready(function(e) {
$("#btn_test").click(function(){
window.plugins.simplePlugin.hello(
function(result) {
alert("返回的第一个参数:"+result.str1+"返回的第二个参数"+result.str2);
function(error) {
"第一个参数",
"第二个参数"
&button type="button"
id="btn_test"&Click Me!&/button&
阅读(...) 评论()

我要回帖

更多关于 java调用javascript 的文章

 

随机推荐