javascript中怎样用java中的对象

javascript中怎样用java中的对象,第1张

为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavascriptInterface方法即可映射一个Java对象到JavaScript对象上。
1、映射Java对象到JavaScript对象上
代码如下:
mWebView = (WebView) findViewById(Ridwv_content);
mWebViewsetVerticalScrollbarOverlay(true);
final WebSettings settings = mWebViewgetSettings();
settingssetSupportZoom(true);
//WebView启用Javascript脚本执行
settingssetJavaScriptEnabled(true);
settingssetJavaScriptCanOpenWindowsAutomatically(true);
//映射Java对象到一个名为”js2java“的Javascript对象上
//JavaScript中可以通过"windowjs2java"来调用Java对象的方法
mWebViewaddJavascriptInterface(new JSInvokeClass(), "js2java");
代码如下:
/网页Javascript调用接口/
class JSInvokeClass {
public void back() {
activityfinish();
}
}
2、JavaScript调用Java对象示例
调用上述JSInvokeClass类对象的back方法,如下:
复制代码 代码如下:
windowjs2javaback();

body中部分代码如:<center><font size="4" color="red">吊灯</font> <input type="button" id="diaodeng" value=<%=state[0]%> onclick="dianji1()"><br><br><br><br></center>
script中的的代码如下:
function dianji1(){
var abc=documentgetElementById("diaodeng");
if(abcvalue=="on"){
abcvalue="off";
}
else{
abcvalue="on";
}
}
要求是通过点击按钮能够调用java类中的方法从而修改数据库中的内容
或者
$("button")click(function(){
$post("/foo/usr/11",function(data){
});
});
jquery post方法调用java方法修改数据库

好了上代码
/JsInterfacejava/
/该类是JS调用JAVA端的,JAVA端调用webview中的JS很简单,后面代码将给出/
[java] view plaincopy
public class JsInterface {
/interface for javascript to invokes/
public interface wvClientClickListener {
public void wvHasClickEnvent();
}

private wvClientClickListener wvEnventPro = null;
public void setWvClientClickListener(wvClientClickListener listener) {
wvEnventPro = listener;
}
public void javaFunction() {
if(wvEnventPro != null)
wvEnventProwvHasClickEnvent();
}
}
/Js2JavaActivityJAVA/
/程序入口/
[java] view plaincopy
public class Js2JavaActivity extends Activity{
private Button btn_show,btn_hide;
private WebView wv;
private JsInterface JSInterface2 = new JsInterface();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
superonCreate(savedInstanceState);
setContentView(Rlayoutjs2java);

btn_show = (Button)findViewById(Ridbtn_java2js_show);
btn_hide = (Button)findViewById(Ridbtn_java2js_hide);
wv = (WebView)findViewById(Ridwv_js2java);

wvgetSettings()setJavaScriptEnabled(true);
wvaddJavascriptInterface(JSInterface2,"JSInterface2");
wvsetWebViewClient(new webviewClient());

wvloadUrl("file:///android_asset/indexhtml");
}

class webviewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
superonPageFinished(view, url);
btn_showsetOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ToastmakeText(getBaseContext(), "You click show button", 1000)show();
wvloadUrl(Stringformat("javascript:java2js(0)"));//这里是java端调用webview的JS
}
});
btn_hidesetOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ToastmakeText(getBaseContext(), "You click hide button", 1000)show();
wvloadUrl(Stringformat("javascript:java2js(1)"));//这里是java端调用webview的JS
}
});

JSInterface2setWvClientClickListener(new webviewClick());//这里就是js调用java端的具体实现
}
}

class webviewClick implements wvClientClickListener {

@Override
public void wvHasClickEnvent() {
// TODO Auto-generated method stub
ToastmakeText(getBaseContext(), "link be on click", 1000)show();
}

}
}
/好吧,照顾码农需要,将布局的也贴上/
[html] view plaincopy
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android=">

 在Cocos2d-js 30beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用java的静态方法。它的使用方法很简单:

1 var o = jsbreflectioncallStaticMethod(className, methodName, methodSignature, parameters)

在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。下面介绍的类名和方法签名可能会有一点奇怪,但是Java的规范就是如此的。

类名

参数中的类名必须是包含Java包路径的完整类名,例如我们在orgcocos2dxjavascript这个包下面写了一个Test类:

123456789101112 package orgcocos2dxjavascript;public class Test {    public static void hello(String msg){        Systemoutprintln(msg);    }    public static int sum(int a, int b){        return a + b;    }    public static int sum(int a){        return a + 2;    }}

那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test,注意这里必须是斜线/,而不是在Java代码中我们习惯的点。

方法名

方法名很简单,就是方法本来的名字,例如sum方法的名字就是sum。

方法签名

方法签名稍微有一点复杂,最简单的方法签名是()V,它表示一个没有参数没有返回值的方法。其他一些例子:

(I)V表示参数为一个int,没有返回值的方法;

(I)I表示参数为一个int,返回值为int的方法;

(IF)Z表示参数为一个int和一个float,返回值为boolean的方法;

现在有一些理解了吧,括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为Java是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。

目前Cocos2d-js中支持的Java类型签名有下面4种:

通过使用 AJAX 技术 ,去完成 的,具体参考 jquery
~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~
~~~~~~~~~~
~~~~~~

在Java中调用js文件中的function,传入调用参数,并获取返回值
js文件中的merge函数将两个参数a,b相加,并返回c。
// expressionjs
function merge(a, b) {
c = a b;
return c;
}
在Java代码中读取js文件,并参数两个参数,然后回去返回值。
package comsinaappmanjushri;
import javaioFileReader;
import javaxscriptInvocable;
import javaxscriptScriptEngine;
import javaxscriptScriptEngineManager;
/ Java调用并执行js文件,传递参数,并活动返回值 @author manjushri /
public class ScriptEngineTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = managergetEngineByName("javascript");
String jsFileName = "expressionjs"; // 读取js文件
FileReader reader = new FileReader(jsFileName); // 执行指定脚本
engineeval(reader);
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine; // 调用merge方法,并传入两个参数
// c = merge(2, 3);
Double c = (Double)invokeinvokeFunction("merge", 2, 3);
Systemoutprintln("c = " + c);
}
readerclose();
}
}
输出结果:
c = 50

可参考:
package javaIjs;
/
@param args
/
import javaioFileReader;
import javaxscriptInvocable;
import javaxscriptScriptEngine;
import javaxscriptScriptEngineManager;
/
Java调用并执行js文件,传递参数,并活动返回值

@author manjushri
/
public class ScriptEngineTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = managergetEngineByName("javascript");
String jsFileName = SystemgetProperty("userdir")+"/src/javaIjs/expressionjs";
// 读取js文件
FileReader reader = new FileReader(jsFileName);
// 执行指定脚本
Systemoutprintln(enginegetContext()getReader());
engineeval(reader);
if (engine instanceof Invocable) {
Invocable invoke = (Invocable) engine;
// 调用merge方法,并传入两个参数
// c = merge(2, 3);
Double c = (Double) invokeinvokeFunction("merge1", 21, 3);
Systemoutprintln("c = " + c);
}
readerclose();
}
}

思路:

通过页面提交或者ajax等方式把页面参数传入到java中。

代码示例:

<select name="test" name="test" onchange="test1($(this)val())">
    <option value="1">test</option>
</select>
<div id="display"></div>
function test1(val)
{
    $ajax({
        url:"新建的服务器的URL地址,比如servlet",
       data:{selectValue:val},//这把val值传入到后台java,后台可以通过requestgetParameter("selectValue")获取到val值
       dataType:"json",   //如果JSP里输出的数据格式为json的话,这里就必须要写了,如果不是,这里可以省去
       type:"GET",
       beforeSend:function(){},
       success:function(data){
            $("#display")html(data);  //如果返回格式为文本格式的话,直接这样就可以,如果是JSON的话,就看你输出的是什么数据了
       }
    });
}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12907033.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-28
下一篇 2023-05-28

发表评论

登录后才能评论

评论列表(0条)

保存