Flash的出现使Applet的地位受到严重影响;
浏览器显示网页的原理
网页文件是普通的文本文件;
标记语言只能控制显示,但不具有
逻辑性,比如不可以判断用户的输入是否真确;
正是为了在瘦客户端实现交互,我们用
网页脚本;浏览器遇见脚本标签的时候
就用引擎来执行;
<script language="vbscript">
<!--
...
...
..
-->
也就是说,如果想要使用脚本,则浏览器必须
有调用脚本引擎的能力;
那么我们可以说applet是脚本吗?
好像不是啊!
IE在一段时间里去掉了了对Java的支持;
因此Applet被人们遗忘了很久;pity;
Sun与MicroSoft的仇恨!!
后来Sun把执行applet的虚拟机做成浏览器的
插件,你在安装jdk的最后时刻一定看到了
Java(TM) plugin 安装到IE的提示;
浏览器总是试图纠正用户的错误标签而不是
报错;
再次说明基础:
init()被调用一次;
每次进入包含applet的页面就调用一次
start();
浏览器离开包含applet的页面时调用stop()
方法;
//这说明applet在没被看见的时候不运行的,
有效地节省了资源;
destroy()在浏览器关闭时销毁applet对象;
paint()在每次Applet的界面需要被画的时候被调用;
paint(Graphics g)中g描述了Applet界面的环境;
一个定时器的实现思想:
如果你的主线程程序强烈要求在特定的时间
间隔就做出某一个动作,那么如果你使用本线程
来睡眠的方法十分不合理:因为你的程序还希望做
别的更有意义的事情而不是只是每个一个时间段
就做那个机械的动作;所以我们可以用主线程来
启动一个线程,让这个副线程睡眠一个时间间隔后
回调主线程做出那个动作的方法;
而整个过程中主线程根本就不要任何地关注;
两种模式的区别:
一:
mainThread:
{
while(true)
{
Thread.sleep(400);
action();
}
}
二:
mainThread
{
sonThread=new Thread();
otheraction();
}
sonThread
{
while(true)
{
Thread.sleep();
mainThread.action();
}
}
因为applet是运行在客户端而资源在服务器
端,所以不要在你写的Applet里使用绝对路径
访问资源;而且一个applet可能被卖到多个不同的
服务器上使用;
有一个原则就是:applet源文件和资源的相对
路径不要改变;
Component.update(Graphics g)方法:
repaint()方法调用update()方法;
默认的系统实现的update()方法
先调用了调用了paint()方法;
最小化,最大化的暴光操作是直接
调用paint()方法的;
而调用repaint()方法则一定会
通过update()方法来调用paint()方法;
所以你有机会在覆盖update()方法,试图
不调用paint()方法;
*****关于paint(),repaint(),update()方法的一些 试验与解释:
*****paint(Graphics g)方法就是在组件上绘图;
*****repaint()方法做以下调用:
***** 调用update(Grpahics g)方法;
***** update(Graphics g)做以下调用:
***先调用clear()清除组件上已绘制图像;
***再调用paint(Graphics g)方法绘制图像;
***所以我们有这样一些试验:
如果你没有重写update()方法,则每次调用repaint()之后,
都可以在组件上重新绘制一副新图像;
如果你重写的update()方法什么都没做,则每次调用repaint()
方法后,你的组建上的图像不会变化;
如果你重写的update()方法只调用了paint(Graphics g)而没有
调用clear(),则每次调用repaint()之后,你的组件上的图像是重叠
了新旧图像的图像;
****注意:repaint()方法可以手动调用从而间接调用了paint(Graphics g)方法;
但是paint(Graphics g)是不能手动调用的;
****TMD面向对象就是牛!
Applet的相关知识:
WWW浏览器是applet运行的容器,或者你
就说是引擎吧!
applet是浏览器的插件;
注意:容器才是真正的应用程序,插件只是容器能够使用的
函数;这么一来,我们知道,其实服务器上的应用
程序是Tomcat而不是我们写的servlet和jsp,
我们只是在给Tomcat写可以调用的插件而已;
servlet,ejb技术都是这种容器与插件的程序架构设计模式;
Applet的控制台输出:Java控制台;
控制台可以输出如同System.out.print()
之类的语句;
解释器一般有两个:
MicroSoft vm;
Sun Jre;
Applet的限制:
不能启动执行其他的应用程序;
不能进行文件I/O操作;
不能调用本机代码;
不能与Applet所在的主机之外的其他
主机进行网络连接;
解释:如果恶意的Web服务器提供给用户下载
applet,如果applet被下载到客户机上能够进行
I/O操作和启动别的程序,那客户上的信息有可能被
发送到Web服务器上,或者客户机会受到病毒感染;
提供Applet的服务器将applet下载到客户机上,
如果在客户机上applet能够与提供applet的服务器之外
的主机连接,进行恶意攻击,那这个主机查回来
之后发现的元凶是这个客户机而不是提供applet
的服务器;
<applet>标记
一个网页中可以有多个<applet>标记
<applet
[archive=archiveList] //预先要载入的资源,如.jar;
code=appletFile.class
width=pixels
height=pixels
[codebase=codebaseURL]
[alt=alternateText]
[name=appletInstanceName]//用于一个Applet调用另一个
[align=alignment] //applet,进行通信;
[vspace=pixels]
[hspace=pixels]
>
[<param name=appletAttribute 1 value=value>]
[<param name=appletAttribute 2 value=value>]
[apternameHTML]
</applet>
getParameter()的参数对大小写是不敏感的;
但是我们应该保持一致;
<object>标记
W3C协会建议人们用<object>标记代替<applet>标记;
可以使用jdk提供的HTMLConverter将<applet>
标记转换为<object>标记;
HTMLConverter的使用:
1,转换后的.html文件名与原来的.html文件名一样;
使用<object>标记,执行applet的Java解释器被
作为一个ActiveX插件引用;
这时候,插件是解释器而不是Applet程序本身了;
<object>中有一个属性是
classid来指定ActiveX控件的唯一标识号;
codebase = "http://java.sun.com/update/1.5.0
/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"
指定了虚拟机,如果机器上没有装,则会自动下载安装;
可见,<Applet>标记没有自动下载安装解释器的功能,
而<object>标记可以,这就是为什么我们用
<object>标记;
在多个网页中引用同一个Applet
如果两个网页中都用到了同一个Applet类,
当浏览器访问了第一个后,再去访问第二个网页的时候,
是否还为第二个网页创建一个新的Applet实例??
结论:
当不同的网页访问同一个applet的时候,浏览器都会
创建一个新的实例对象;
注意:只有使用同一个浏览器窗口的时候才会提供Applet中
的静态变量的共享;也就是如果你用同一个浏览器窗口
多次访问一个applet,这个applet中的静态变量是每次创建的
实例对象共享的,也就是说这些多次访问过程中使用的是同一个
Applet的Class对象;
但是如果你用不同的窗口来多次访问同一个Applet的话,那么这些
访问中并不是用了同一个Applet的Class对象;
从而静态变量也无法共享;因为静态变量是由Class对象
来保持的;
张老师丢人了啊,做的试验结果竟然与讲的理论不一样;
烦人的浏览器机制,我们不必详细了解了;
不同的厂家的解释器,同一厂家的不同版本的
计时器的内部实现方式的差异,使得理论与
现实有所出入,这在计算机界很正常,
所以不要死记硬背是正道;