分享
 
 
 

在JavaScript程序中整合Java函数(上)

王朝html/css/js·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

问题的提出:

假定我们的HTML 页中有一些表单需要处理,并且我们需要初始化数据库中的字段,我们该怎么办?标准的解决办法就是使用CGI脚本或是使用Java Servlet等服务器端程序,但是你有没有想过,还可以编写一个脚本程序使你可以用JavaScript直接调用服务器端Java程序进行任何计算的结果,就像下面代码中列的那样:

<html>

我们的表单<br>

<form>

<input type="text" name="textField"><br>

<input type="button" value="Click" onClick="updateField();">

</form>

<script>

function updateField()

{

document.forms[0].textField.value=java.dbConnection.getData('SQL_expr');

}

</script>

</html>

所以,当用户点击按钮,该程序就会调用Java的dbConnection类,然后就可以在JavaScript应用程序中使用Java返回的结果了。上面的程序只是更新了textField的值,我们不必刷新整个页面。由于这个程序也不是JSP文件,所以不必把你的页面编译成Java Servlet。

你还可以使用调用某些Java函数返回的结果替代段落中的文字;在一个非常大的HTML表中,你可以使用同样的方法,只要更新一行信息:

<script language="JavaScript">

function changeCol()

{

document.all.quote.rows[0].cells[1].innerText=java.Stock.getQuote('Wayne');

}

</script>

<table id="quote" border=1>

<tr><td>Wayne</td><td>123</td></tr>

<tr><td>Another one</td><td>34</td></tr>

</table>

怎么样,能够直接在JavaScript中嵌入Java对象的调用,而且可以保证你的页面的其它部分不会被改变,你一定对这个问题比较感兴趣吧。好吧,现在就让我们用Java Servlet来实现它吧。

工作原理

我的构思是使用Java Servlet编写一个JinJ(Java in JavaScript)程序,能够让 HTML 页面内整合 Java 类和 JavaScript脚本,将所有使用JavaScript调用Java函数的HTML页面都传送到这个Servlet中处理,JinJ将即时产生带有Java applet的隐藏帧,这个applet起着桥梁的作用,用来和Java通讯,它的大小还不到2KB,为了调用对象,Applet使用HTTP连接同一个JinJ Servlet。JinJ用相应的JavaScript结构来替换所有的Java调用(其实每一个调用前都有前缀java),并且保持页面的其它部分不变。所以,为了能够让JinJ正确识别,你的JavaScript代码中的任何Java调用,都要使用如下的结构: java.object_name.function_name(list_of_parameters) 其中:

java:是一个标准的前缀:

object_name:是一个变量名,保存某些Java类的实例(在后面,我们会详细的探讨如何创建/定义这样的变量),比如说它可以是一个类名。

function_name:是一个Java类的函数名。

list_of_parameters:是调用的函数的参数列表(可以为空)。

下面也将会探讨如何把参数传给Java,每个参数显然是某个JavaScript表达式。你也可以使用预编译页,换句话说就是在使用HTML页面之前编译它。

服务器实现

在谈编程之前我还想说一说JinJ的服务器实现。在你的服务器中需要两个组成部分:JINJ servlet和bridge applet.。你所有需要被整合的HTML页面都是被JinJ servlet预处理,你可以通过以下方法实现:

a)把你的页面当作一个参数传递给JinJ servlet

所以你可以把你HTML页中如下的超链接<a href="mypage.html">我的页面</a>改为:<a href="http://myhost/servlet/JinJ?mypage.html" target="_top">我的页面</a>

JinJ servlet 随即把所有的Java调用转化成JavaScript,然后产生页面并输出出来。

b)定义某种映射。举例来说,这里我们设置Servlet调用扩展名为.JinJ的文件 (这里介绍的方法针对运行于NT上的JSWDK,你所使用的Servelt系统的具体定义映射的方法请参看你的用户指南)

JinJ.code=JinJ

JinJ.initparams=servlet=http://myhost/servlet/JinJ, root=c:\\jswdk\\webpages objects=c:\\jswdk\\obj.txt,

codebase=http://myhost/

设置了以后,你就可以使用http://myhost/some_file.JinJ然后JinJ servlet将会自动被调用了

Servlet参数

为了让JinJ正常运行,还应当能够为JinJ servlet设置一些全局参数,这也是我们在编程是应当注意到的问题。对于JSWDK, Servlet属性是参数'initparams'的一部分;对于Tomcat,则应当编辑系统中的web.xml

1)需要设置JinJ servlet的路径,参数名是servlet,就像这样:

http://your_host:port/servlet/JINJ

2) 需要设置存放HTML页的根目录,参数名是root,其值就像这样: /home/webpages (或c:\webpages) (默认值是一个空的字符串)。 例如,如果你的根目录是:/home/webpages,并且你使用http://host/servlet/JINJ?myfile.htm 的话,那你的真实的文件名是/home/webpages/myfile.htm

3) 需要设置你定义的Java对象的文件的完全目录,参数名是objects,其值只是一个存放在你的服务器中的一个文件的文件名。

4) 需要设置用于java applet的codebase,参数名是codebase,定义了存放applet的类的路径,比如http://your_host/ 。

以下为Tomcat中web.xml 中的相应设置:

<servlet>

<servlet-name>JinJ</servlet-name>

<servlet-class>JinJ</servlet-class>

<init-param>

<param-name>servlet</param-name>

<param-value>http://your_host/servlet/JinJ</param-value>

</init-param>

<init-param>

<param-name>root</param-name>

<param-value>path_to_the_root_directory</param-value>

</init-param>

<init-param>

<param-name>objects</param-name>

<param-value>path_to_your_objects_file</param-value>

</init-param>

<init-param>

<param-name>codebaset</param-name>

<param-value>http://your_host/</param-value>

</init-param>

</servlet>

在编程时还应当注意实现读取对象文件中所包含的对象,或创建新的Java对象

1. 在初始化JinJ Servlet时将创建一些Java对象,因此你必须在某个文本文件中定义这些对象,并且在参数objects中设置这个文件的路径,这是一个文本文件,每一行描述了一个元素(空行和以#或//开头的行将被忽略),使用下面的格式来描述参数:

object_name=new class_name(list_of_parameters);

换句话说,它很象每次调用类构造器的new操作符,object_name 是就是某个你将在JavaScript中使用到的标识符,例如:

file://数据池

A=new dbPool(5);

file://哈希表

B=new java.util.Hashtable();

或者使用你自己定义的包和类:c=new myPackage.myClass(true);

然后在JavaScript中,你就可以使用它们了,如A.connect(),其中connect() 是类dbPool的一个函数,或者使用B.put('key',value)

注意:

1)你的类应当放在你的CLASSPATH指定的目录下面。

2)你可以使用类名作为对象名 (不过这必须在没有重名的情况下,因为对象名必须是唯一的),如:dbPool=new dbPool();

2. 为了更优化程序,应当在编程的时候就预建一些对象组成标准化库,通过标准化库,你可以在运行中创建/删除对象的实例,查看存在的对象等。

下面就是我们需要实现的标准化库(预定义的对象) ,对象名是JinJ,所以服务器端名为JinJ的实例将会被自动创建,这给类中有下面几个函数:

public boolean create(String object_name,String class_name,list_of_constructors_parameters);

public void delete(String object_name);

public boolean exists(String object_name);

public String id();

public int random(int n1, int n2);

public String rewriteURL(document,String id_name);

public String rewriteURL(document,String id_name,String id_value);

create(创建):能够让你在运行时创建某个对象的实例:

参数为:

- 新的对象名

- 类名

- 参数列表 (如果你使用默认构造函数的时候,可以为空)。

返回值:

- 根据创建的接过返回true 或 false

例如:

<script language="JavaScript">

<!--创建myHash 作为一个新的哈希表Hashtable -->

java.JinJ.create("myHash","java.util.Hashtable");

<!-- 使用myHash -->

java.myHash.put('key1','shop1');

</script>

delete:让你删除任何对象的实例。

参数为:

- 对象名

例如:

<script language="JavaScript">

<!-- 删除myHash -->

java.JinJ.delete("myHash");

</script>

exists:查看对象的实例是否存在。

参数为:

- 对象名

返回值:

true 或 false

例如:

<script language="JavaScript">

if (java.JinJ.exists("myHash")=='false')

{

<!--创建myHash 作为一个新的哈希表Hashtable -->

java.JinJ.create(myHash,"java.util.Hashtable");

<!--使用myHash -->

java.myHash.put('key1','shop1');

</script>

id: 返回唯一的标示符,比如你可以在支持session的程序中使用这个函数。

R

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有