网页脚本编程的原理
html语言只是一种标记语言,只能定义内容的表现形式,比如颜色、字体等。不具有逻辑性,不能与用户进行交互。如果浏览器在解释html语言的基础上,还能够解释运行嵌入在网页文件中的一种具有程序逻辑的语言,那么网页就像平时用到的windows程序一样,能够与程序交互。这种嵌入在html中的程序语言,就称为脚本语言。浏览器中要有能解释脚本语言的模块,即脚本引擎。在script标签之间的便是这种脚本程序。java Applet就是这样一种脚本程序,必须嵌套在网页中使用。
Applet中没有main方法,有浏览器启动,执行过程如下:
首先由浏览器载入HTML文件,当浏览器解释这个HTML文件时,发现其中引用的applet以后,浏览器会载入HTML文件中Applet程序的字节码,最后浏览器启动java虚拟机执行Applet。
Applet类小程序通常需要覆盖的方法:
init()方法:在Applet对象创建以后,java解释器就会立即调用此方法,以通知Applet对象进行初始化。在Applet对象生存期间只调用一次。
start()方法:在执行完init方法后,便执行start方法,浏览器离开创建Applet的页面后,Applet程序停止运行,但Applet对象不会消失,当浏览器回到这个页面后,不需要创建新的对象,而是(自动)调用原对象的sart方法。
stop()方法:与sart方法配合,使得浏览器离开创建Applet的页面后,自动调用此方法,使得Applet程序停止运行,以节省资源的开销。
destroy()方法:当关闭浏览器,Applet对象被销毁之前调用,释放init中初始化的资源。再该方法调用之前,肯定调用过了stop方法。
paint()方法:因为Applet是Panel的子类,所以可以在上面添加组件,显示图像,绘制图形等,同其他的组件一样,Applet每次在启动后,其paint方法会被调用。
变成举例:在applet中实现动画。
import java.awt.*;
import java.applet.*;
public class MyApplet extends Applet implements Runnable{
int index;
Image []imgs=new Image[10];
public void init() {
for(int i=0;i<10;i++)
{
imgs[i]=this.getImage(getCodeBase(),"imgs//T"+(i+1)+".gif");
//Applet有自己的getImage方法,getCodeBase():获取其所在的Applet的基准URL地址
//因为Applet运行在网络中,所以getImage方法的第二个参数应为相对地址,即
//相对Applet字节码文件的相对地址。以上两个参数便可确定图像的绝对地址。
}
new Thread(this).start();
}
public void paint(Graphics g) {
g.drawImage(imgs[index],0,0,this);//先执行此句
g.setFont(new Font(null,Font.BOLD|Font.PLAIN,30));
g.drawString(""+index,0,60);
}
public void run()
{
while(true)
{
try
{
Thread.sleep(100);
}
catch(Exception e)
{
e.printStackTrace();
}
index=(index+1)%10;
repaint();
}
}
}
容器与插件的程序架构设计模式
例如,浏览器是Applet运行的一个容器,Applet就是浏览器中的一个插件,插件的运行完全是由容器来控制和调度的,容器是真正的应用程序,插件只是提供了一些约定的函数或者方法供容器去调用。
因为Applet的运行是从服务器主机上动态下载到浏览器所在的客户机上进行的,所以为了保障Applet运行时的安全性,Applet有些限制:不能启动执行其他应用程序;不能进行文件I/O操作;不能调用本机代码;不能与Applet所在的主机之外的其他主机进行网络连接。
HTML中的<applet>标记
<applet>标记被用来在HTML文件当中引用Applet小程序,在一个网页当中可以使用多个<applet>标记来引用多个Applet小程序。<applet>标记中用中括号包起来的属性为可选属性,没有用中括号包起来的属性为必不可少的属性。
archive属性用于指定Applet程序执行前,要被预先载入到浏览器中的java字节代码和一些资源的压缩文件。我们可以将Applet程序和一些资源打包成jar文件,然后用archive属性指明压缩文件的名称。浏览器在解释执行Applet程序时,就会从jar文件当中查找运行Applet所需的资源文件,如果要在archive属性当中指定多个压缩文件,这多个压缩文件之间要用逗号隔开。
code属性用于指定要执行的Applet的类名,这个类名中的.class后缀有无均可。浏览器查找这个Applet类的完整路径,是由引用这个<applet>标记的HTML文件的路径地址和codebase属性共同决定的
width、height指定Applet程序在浏览器中的初始显示大小
codebase属性指定Applet与HTML文件的相对路径,或Applet绝对路径,如果没有设置该属性,则表明Applet与引用Applet的HTML文件在同一目录文件中。若该属性指定的是Applet绝对路径,则Apple可以不与引用它的HTML文件在同一主机上。
alt属性指定浏览器不支持<applet>标签时,在applet的显示区域显示一些替代文本,说明applet的作用。可以直接在Applet的标签对当中,插入普通的html文本或者其他的标记。也可以在applet不能正常现实的情况下,作为替代信息显示在applet当中。
name属性指明了applet的实例名称,通过对applet的命名,相同网页当中的applet就可以调用getApplet的方法来访问另一个applet实例对象。从而实现同一网页中的个applet的通信。javascript也可以通过该属性访问applet。
align属性指定applet的对齐方式。applet的实际显示大小(内部矩形区域)与它在浏览器中所占用的空间(外部矩形区域)是不一样的,那么这个内部矩形区域与外部矩形区域的
对齐方式就有该属性决定。
vspace、hspace属性制定了applet实际显示区域即内部矩形区域与外部矩形区域的水平、垂直间隔。
嵌套在applet标记对中的param标记,指定了传递给applet的初始化参数,param的name属性指定了参数的名称,value属性指定了要传递的参数的值,applet内程序代码可以调用getParam方法获得param要传递的参数的信息。如:
<applet
[archive=archiveList]
code=appletFile.class
width=piexls height=pixels
[codebase=codebsseURL]
[alt=alternateText]
[name=appletInstanceName]
[align=alignment]
[vapace=pixels] [hspace=pixels]
>
[<param name=appletAttrbute1 value=value>]
…….
</applet>
使用HTMLConverter将<applet>标记转换成<OBJECT>标记时,注意转换后的文件与原文件重名,即会把原文件覆盖掉,因此必要时要做个备份。用HTMLConverter将<applet>标记转换成<OBJECT>标记在命令行中的输入例如:htmlconverter MyApplet.htm。HTMLConverter转换后的文件格式是linux操作系下的文本格式,window记事本下无法正常显示回车换行。
使用<OBJECT>标记执行applet小程序的java解释器被作为一个ActionX插件引用。这时候作为网页中的插件的是java解释器,而不是applet小程序本身,使用<OBJECT>标记比
applet标记多了自动下载和安装java解释器的功能,能通过<OBJECT>标记的codebase属性获得下载路径与版本。
当不同的网页中调用同一个Applet类的时候,浏览器访问每一个网页时,Applet一般都会产生一个新的实例对象。但是如何产生和调用Applet的实例对象,完全由嵌套在浏览器中的java解释器来控制,不同的厂家,甚至同一厂家的java解释器也存在差异,因此会出现不同效果。