服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在javascript程序中整合java函数(上)


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

  <form>
  <input type="text" name="textfield">

  <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

扫描关注微信公众号