整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java Applet基础

applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。

如下所示是独立的Java应用程序和applet程序之间重要的不同:

  • Java中applet类继承了 java.applet.Applet类

  • Applet类没有定义main(),所以一个 Applet程序不会调用main()方法,

  • Applets被设计为嵌入在一个HTML页面。

  • 当用户浏览包含Applet的HTML页面,Applet的代码就被下载到用户的机器上。

  • 要查看一个applet需要JVM。 JVM可以是Web浏览器的一个插件,或一个独立的运行时环境。

  • 用户机器上的JVM创建一个applet类的实例,并调用Applet生命周期过程中的各种方法。

  • Applets有Web浏览器强制执行的严格的安全规则,applet的安全机制被称为沙箱安全。

  • applet需要的其他类可以用Java归档(JAR)文件的形式下载下来。



Applet的生命周期

Applet类中的四个方法给你提供了一个框架,你可以再该框架上开发小程序:

  • init: 该方法的目的是为你的applet提供所需的任何初始化。在Applet标记内的param标签被处理后调用该方法。

  • start: 浏览器调用init方法后,该方法被自动调用。每当用户从其他页面返回到包含Applet的页面时,则调用该方法。

  • stop:当用户从包含applet的页面移除的时候,该方法自动被调用。因此,可以在相同的applet中反复调用该方法。

  • destroy: 此方法仅当浏览器正常关闭时调用。因为applets只有在HTML网页上有效,所以你不应该在用户离开包含Applet的页面后遗漏任何资源.

  • paint: 该方法在start()方法之后立即被调用,或者在applet需要重绘在浏览器的时候调用。paint()方法实际上继承于java.awt。

"Hello, World" Applet:

下面是一个简单的Applet程序HelloWorldApplet.java:

import java.applet.*;

import java.awt.*;

public class HelloWorldApplet extends Applet

{

public void paint (Graphics g)

{

g.drawString ("Hello World", 25, 50);

}

}

这些import语句将以下类导入到我们的applet类中:

java.applet.Applet.

java.awt.Graphics.

没有这些import语句,Java编译器就识别不了Applet和Graphics类。

Applet 类

每一个applet都是java.applet.Applet 类的子类,基础的Applet类提供了供衍生类调用的方法,以此来得到浏览器上下文的信息和服务。

这些方法做了如下事情:

  • 得到applet的参数

  • 得到包含applet的HTML文件的网络位置

  • 得到applet类目录的网络位置

  • 打印浏览器的状态信息

  • 获取一张图片

  • 获取一个音频片段

  • 播放一个音频片段

  • 调整此 applet 的大小

除此之外,Applet类还提供了一个接口,该接口供Viewer或浏览器来获取applet的信息,并且来控制applet的执行。

Viewer可能是:

  • 请求applet作者、版本和版权的信息

  • 请求applet识别的参数的描述

  • 初始化applet

  • 销毁applet

  • 开始执行applet

  • 结束执行applet

Applet类提供了对这些方法的默认实现,这些方法可以在需要的时候重写。

"Hello,World"applet都是按标准编写的。唯一被重写的方法是paint方法。

Applet的调用

applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。

<applet>标签是在HTML文件中嵌入applet的基础。以下是一个调用"Hello World"applet的例子;

<html>

<title>The Hello, World Applet</title>

<hr>

<applet code="HelloWorldApplet.class" width="320" height="120">

If your browser was Java-enabled, a "Hello, World"

message would appear here.

</applet>

<hr>

</html>

注意: 你可以参照HTML Applet标签来更多的了解从HTML中调用applet的方法。

<applet>标签的属性指定了要运行的Applet类。Width和height用来指定applet运行面板的初始大小。applet必须使用</applet>标签来关闭。

如果applet接受参数,那么参数的值需要在标签里添加,该标签位于<applet>和</applet>之间。浏览器忽略了applet标签之间的文本和其他标签。

不支持Java的浏览器不能执行<applet>和</applet>。因此,在标签之间显示并且和applet没有关系的任何东西,在不支持的Java的浏览器里是可见的。

Viewer或者浏览器在文档的位置寻找编译过的Java代码,要指定文档的路径,得使用<applet>标签的codebase属性指定。

如下所示:

<applet codebase="http://amrood.com/applets"

code="HelloWorldApplet.class" width="320" height="120">

如果applet所在一个包中而不是默认包,那么所在的包必须在code属性里指定,例如:

<applet code="mypackage.subpackage.TestApplet.class"

width="320" height="120">

获得applet参数

下面的例子演示了如何使用一个applet响应来设置文件中指定的参数。该Applet显示了一个黑色棋盘图案和第二种颜色。

第二种颜色和每一列的大小通过文档中的applet的参数指定。

CheckerApplet 在init()方法里得到它的参数。也可以在paint()方法里得到它的参数。然而,在applet开始得到值并保存了设置,而不是每一次刷新的时候都得到值,这样是很方便,并且高效的。

applet viewer或者浏览器在applet每次运行的时候调用init()方法。在加载applet之后,Viewer立即调用init()方法(Applet.init()什么也没做),重写该方法的默认实现,添加一些自定义的初始化代码。

Applet.getParameter()方法通过给出参数名称得到参数值。如果得到的值是数字或者其他非字符数据,那么必须解析为字符串类型。

下例是CheckerApplet.java的梗概:

import java.applet.*;

import java.awt.*;

public class CheckerApplet extends Applet

{

int squareSize = 50;// 初始化默认大小

public void init () {}

private void parseSquareSize (String param) {}

private Color parseColor (String param) {}

public void paint (Graphics g) {}

}

下面是CheckerApplet类的init()方法和私有的parseSquareSize()方法:

public void init ()

{

String squareSizeParam = getParameter ("squareSize");

parseSquareSize (squareSizeParam);

String colorParam = getParameter ("color");

Color fg = parseColor (colorParam);

setBackground (Color.black);

setForeground (fg);

}

private void parseSquareSize (String param)

{

if (param == null) return;

try {

squareSize = Integer.parseInt (param);

}

catch (Exception e) {

// 保留默认值

}

}

该applet调用parseSquareSize(),来解析squareSize参数。parseSquareSize()调用了库方法Integer. parseInt(),该方法将一个字符串解析为一个整数,当参数无效的时候,Integer.parseInt()抛出异常。

因此,parseSquareSize()方法也是捕获异常的,并不允许applet接受无效的输入。

Applet调用parseColor()方法将颜色参数解析为一个Color值。parseColor()方法做了一系列字符串的比较,来匹配参数的值和预定义颜色的名字。你需要实现这些方法来使applet工作。

指定applet参数

如下的例子是一个HTML文件,其中嵌入了CheckerApplet类。HTML文件通过使用标签的方法给applet指定了两个参数。

<html>

<title>Checkerboard Applet</title>

<hr>

<applet code="CheckerApplet.class" width="480" height="320">

<param name="color" value="blue">

<param name="squaresize" value="30">

</applet>

<hr>

</html>

注意: 参数名字大小写不敏感。

应用程序转换成Applet

将图形化的Java应用程序(是指,使用AWT的应用程序和使用java程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的。

下面是将应用程序转换成applet的几个步骤:

  • 编写一个HTML页面,该页面带有能加载applet代码的标签。

  • 编写一个JApplet类的子类,将该类设置为public。否则,applet不能被加载。

  • 消除应用程序的main()方法。不要为应用程序构造框架窗口,因为你的应用程序要显示在浏览器中。

  • 将应用程序中框架窗口的构造方法里的初始化代码移到applet的init()方法中,你不必显示的构造applet对象,浏览器将通过调用init()方法来实例化一个对象。

  • 移除对setSize()方法的调用,对于applet来讲,大小已经通过HTML文件里的width和height参数设定好了。

  • 移除对 setDefaultCloseOperation()方法的调用。Applet不能被关闭,它随着浏览器的退出而终止。

  • 如果应用程序调用了setTitle()方法,消除对该方法的调用。applet不能有标题栏。(当然你可以给通过html的title标签给网页自身命名)

  • 不要调用setVisible(true),applet是自动显示的。

事件处理

Applet类从Container类继承了许多事件处理方法。Container类定义了几个方法,例如:processKeyEvent()和processMouseEvent(),用来处理特别类型的事件,还有一个捕获所有事件的方法叫做processEvent。

为了响应一个事件,applet必须重写合适的事件处理方法。

import java.awt.event.MouseListener;

import java.awt.event.MouseEvent;

import java.applet.Applet;

import java.awt.Graphics;

public class ExampleEventHandling extends Applet

implements MouseListener {

StringBuffer strBuffer;

public void init() {

addMouseListener(this);

strBuffer = new StringBuffer();

addItem("initializing the apple ");

}

public void start() {

addItem("starting the applet ");

}

public void stop() {

addItem("stopping the applet ");

}

public void destroy() {

addItem("unloading the applet");

}

void addItem(String word) {

System.out.println(word);

strBuffer.append(word);

repaint();

}

public void paint(Graphics g) {

//Draw a Rectangle around the applet's display area.

g.drawRect(0, 0,

getWidth() - 1,

getHeight() - 1);

//display the string inside the rectangle.

g.drawString(strBuffer.toString(), 10, 20);

}

public void mouseEntered(MouseEvent event) {

}

public void mouseExited(MouseEvent event) {

}

public void mousePressed(MouseEvent event) {

}

public void mouseReleased(MouseEvent event) {

}

public void mouseClicked(MouseEvent event) {

addItem("mouse clicked! ");

}

}

如下调用该applet:

<html>

<title>Event Handling</title>

<hr>

<applet code="ExampleEventHandling.class"

width="300" height="300">

</applet>

<hr>

</html>

最开始运行,applet显示 "initializing the applet. Starting the applet.",然后你一点击矩形框,就会显示"mouse clicked" 。

显示图片

applet能显示GIF,JPEG,BMP等其他格式的图片。为了在applet中显示图片,你需要使用java.awt.Graphics类的drawImage()方法。

如下实例演示了显示图片的所有步骤:

import java.applet.*;

import java.awt.*;

import java.net.*;

public class ImageDemo extends Applet

{

private Image image;

private AppletContext context;

public void init()

{

context = this.getAppletContext();

String imageURL = this.getParameter("image");

if(imageURL == null)

{

imageURL = "java.jpg";

}

try

{

URL url = new URL(this.getDocumentBase(), imageURL);

image = context.getImage(url);

}catch(MalformedURLException e)

{

e.printStackTrace();

// Display in browser status bar

context.showStatus("Could not load image!");

}

}

public void paint(Graphics g)

{

context.showStatus("Displaying image");

g.drawImage(image, 0, 0, 200, 84, null);

g.drawString("www.javalicense.com", 35, 100);

}

}

如下调用该applet:

<html>

<title>The ImageDemo applet</title>

<hr>

<applet code="ImageDemo.class" width="300" height="200">

<param name="image" value="java.jpg">

</applet>

<hr>

</html>

播放音频

Applet能通过使用java.applet包中的AudioClip接口播放音频。AudioClip接口定义了三个方法:

  • public void play(): 从一开始播放音频片段一次。

  • public void loop(): 循环播放音频片段

  • public void stop(): 停止播放音频片段

为了得到AudioClip对象,你必须调用Applet类的getAudioClip()方法。无论URL指向的是否是一个真实的音频文件,该方法都会立即返回结果。

直到要播放音频文件时,该文件才会下载下来。

如下实例演示了播放音频的所有步骤:

import java.applet.*;

import java.awt.*;

import java.net.*;

public class AudioDemo extends Applet

{

private AudioClip clip;

private AppletContext context;

public void init()

{

context = this.getAppletContext();

String audioURL = this.getParameter("audio");

if(audioURL == null)

{

audioURL = "default.au";

}

try

{

URL url = new URL(this.getDocumentBase(), audioURL);

clip = context.getAudioClip(url);

}catch(MalformedURLException e)

{

e.printStackTrace();

context.showStatus("Could not load audio file!");

}

}

public void start()

{

if(clip != null)

{

clip.loop();

}

}

public void stop()

{

if(clip != null)

{

clip.stop();

}

}

}

如下调用applet:

<html>

<title>The ImageDemo applet</title>

<hr>

<applet code="ImageDemo.class" width="0" height="0">

<param name="audio" value="test.wav">

</applet>

<hr>

你可以使用你电脑上的test.wav来测试上面的实例。

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

构设计相关概念

架构体系结构风格是描述某一个特定领域中系统组织方式的惯用模式,组织方式描述了系统组成构件的组织方式,惯用模式则反映众多软件系统共有的结构和语义

1. 架构风险:系统架构风险是指架构设计中潜在的、存在问题的架构决策所带来的的隐患

2. 风险点:可能引起风险的因素,称为风险点。如果某个做法有隐患,有可能导致一些问题,则称为风险点

3. 非风险点:如果某件事情是可行的, 可以接收的,则为非风险点

4. 敏感点:敏感点是指为了实现某种特定的质量属性,一个或多个构件所具有的特性

5. 权衡点:权衡点是影响多个质量属性的特性,是多个质量属性的敏感点

ESB 的特点

1. SOA的实现方式,总线作用,服务连接和整合

2. 描述服务的元数据和服务注册管理

3. 传递数据、数据转换、同步、异步

4. 发现、路由、匹配、选择

架构评估方法

1. 基于问卷调查的方式:架构方面的问卷,要求评估人员对架构熟悉

2. 基于度量的方式:定量来度量的架构,比如代码行数,要求评估人员对架构熟悉

3. 基于场景的方式:主要方式,首先确定应用领域功能与架构的结构映射,然后用4+1视图(场景、物理、进程、逻辑、开发)分析架构对场景的支持度。分为 ATAM、SAAM、CBAM

DSSA 特定领域的软件架构

三个活动

1. 领域分析:领域模型或领域需求、识别信息源

2. 领域设计:DSSA,是领域模型的解决方案,高层次设计

3. 领域实现:开发和组织可重用信息

四种角色

1. 领域专家:用户、软件工程师

2. 领域分析人员:系统分析人员

3. 领域设计人员:软件设计人员

4. 领域实现人员:程序设计人员

三层次模型

1. 领域开发环境:领域架构师、产出参考架构、参考需求、架构、领域模型、开发工具

2. 领域特定的应用开发环境:应用工程师、核心架构实例化

3. 应用执行环境:操作员,实例化后的架构

并发控制

丢失更新、不可重复读、读脏数据

三级封锁协议

X 排它锁、S 共享锁

1. 一级:一级加X锁,解决丢失更新问题

2. 二级:读脏数据前加 S 锁,解决读脏数据问题

3. 三级:先加 S 锁、再加 X 锁,直到事务结束,解决丢失更新、读脏数据、不可重复读问题

多个数据库数据同步的方式

定时任务、触发器、数据库插件

数据备份

完整备份、增量数据(仅上一次完整备份后变化的数据)、差异备份(仅上次备份后变化的数据)

反规范化技术

定义:牺牲部分规范化提升性能

优点:降低连接、降低外码、降低索引目录、降低表的数据、提高效率

问题:重复存储、浪费空间、可能存在完整性问题、增加维护复杂性、降低修改速度

方法:增加冗余列、增加派生列、水平分割表、垂直分割表

四大问题:数据冗余、插入异常、修改异常、删除异常

分布式数据库

定义:由一组数据组成,存放在不同的计算机上,有独立处理数据的能力

特点

1. 数据独立性:逻辑、物理、分布独立

2. 集中与自治共享结合的控制结构

3. 适当增加数据冗余度:多副本、提升可靠性、可用性、性能

4. 全局唯一性、可串行性、可恢复性

优点

1. 企业部门分散而需要互相联系

2. 对当前机构影响最小的情况下进行扩充

3. 对于已存在的数据库直接自上而下地生成分布式数据库

4. 满足负载均衡的需要

5. 故障率比集中式数据库低,可靠性高

JAVA

J2EE

1. 结构:客户层、Web层、业务层、企业信息系统层

2. 表示:HTML、Applet

3. 应用:JSP、Servlet

4. 服务:EJB(SimpleBean,SessionBean)

5. 域:EntityBean

6. 持久化:DB

EJB

定义:JavaEE 服务器端组件模型 企业级Bean:会话(SessionBean)、实体(EntityBean)、消息驱动(Message-driven) DAO:数据库客户端 JavaBean:基于DAO的封装

设计模式二次总结

设计模式是提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案

创建型:对象创建,封装复杂创建过程,接口对象的创建与使用代码。

1. 单例(Singleton):唯一实例

2. 抽象工厂(Abstract Factory):抽象接口

3. 原型(Prototype):原型实例,拷贝

4. 构造器(Builder):类和构造分离

5. 工厂方法(Factory Method):子类决定实例化

结构型:负责处理类和对象的关系,用于构建结构更加复杂庞大的系统

1. 外观(Facade):对外统一接口

2. 桥接(Bridge):抽象和实现分离

3. 组合(Composite):整体 - 部分,树形结构

4. 享元(Flyweight):细粒度、共享

5. 代理(Proxy):代理控制

6. 适配器(Adapter):转换、兼容接口

7. 装饰(Decorator):附加职责

行为型:主要是对类和对象如何交互以及类和对象分配具体职责进行描述

1. 职责链(Chain of Responsibility):传递请求、职责、链接

2. 命令(Command):日志记录、可撤销

3. 解释器(Interpreter):解析器、虚拟机

4. 迭代器(Iterator):顺序访问,不暴露内部

5. 中介者(Mediator):不直接引用

6. 备忘录(Memento):保存、恢复

7. 观察者(Observer):通知、自动更新

8. 状态(State):状态变成类、服务升级、会员等级

9. 策略(Strategy):算法替换

10. 模板方法(Template):部分步骤延迟到子类中

11. 访问者(Visitor):数据和操作分离

里的想法很简单:用户从Internet 下载Java字节码,并在自己的机器上运行。在网页中运行的Java程序称为 applet。要使用applet,只需要一个启用Java的Web浏览器,它会为你执行字节码。不需要安装任何软件。只要你访问包含applet 的网页,都会得到这个程序的最新版本。最重要的是,归功于虚拟机的安全性,我们不必担心来自恶意代码的攻击。

在网页中插入一个applet就如同在网页中嵌入一副图片。applet会成为页面的一部分。文本环绕在applet占据的空间周围。关键是,这个图片是活动的(alive)。它会对用户命令做出响应,改变外观,在显示它的计算机和提供它的计算机之间交换数据。

图片1-1展示Jmol applet ,它会显示分子结构。可以利用鼠标旋转和放大各个分子,从而更好地理解分子结构。在发明applet 的时代,用网页是无法实现这种直接的操作的,那时只有基本的JavaScript而没有HTML画布。

applet首次出现时,人们欣喜若狂。许多人相信applet的魅力会让Java迅速流行起来。然而,初期的兴奋很快就变成了沮丧。不同版本的Netscape与Internet Explorer运行不同版本的Java,其中有些早已过时。这种糟糕的情况导致更加难以利用Java的最新版本开发applet。实际上,为了在浏览器中得到动态效果,Adobe的Flash技术变得相当流行。后来Java受到严重安全问题的困扰时,浏览器也放弃了对applet的支持。当然Flash的命运也好不到哪里去。

applet demo

关于applet,现在已经不需要关心了。这种技术现在已经凉的透透的了,现在可以完全当做没有这种东西。

当然,如今Java依然与Internet关联密切,不过已经变成了为网页提供数据支持。

Java与网页的关系经历了 applet - jsp - server 的阶段,也是一个逐渐解耦的过程,Java越来越脱离了与用户交互的界面,而是作为服务端,只通过接口对外提供服务,甚至可以说不关心到底是谁在调用这个接口,只要符合标准的请求,都会正确地返回相应数据。而Java已经渐渐地成为冰山下的庞然大物,隐藏在无数互联网、软件公司之后,为网民提供数据服务。


上一篇:HTML大整合(上)
下一篇:HTML 链接