标题：javaBean
概述
JavaBean 图册(6张)用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包，并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能，而不用关心任何改变。
JavaBean可分为两种：一种是有用户界面（UI，User Interface）的JavaBean；还有一种是没有用户界面，主要负责处理事务（如数据运算，操纵数据库）的JavaBean。JSP通常访问的是后一种JavaBean。
发展
最初，JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用于帮助厂家开发在综合开发环境（IDE）下使用的java软件部件。这些包括如Grid控件，用户可以将该部件拖放到开发环境中。从此，JavaBean就可以扩展为一个java web 应用的标准部件，并且JavaBean部件框架已经扩展为企业版的 Bean（EJB）。
组成
一个JavaBean由3部分组成：　　　　（1） 属性（properties）　　JavaBean提供了高层次的属性概念，属性在JavaBean中不只是传统的面向对象的概念里的属性，它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如，可能bean有一个名字属性，这个属性的值可能需要调用String getName（）方法读取，而写入属性值可能要需要调用void setName（String str）的方法。　　每个JavaBean属性通常都应该遵循简单的方法命名规则，这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性，然后查询或修改属性值，对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean，如果改变时钟的时区属性，则时钟会立即重画，显示当前指定时区的时间。　　（2） 方法（method）　　JavaBean中的方法就是通常的Java方法，它可以从其他组件或在脚本环境中调用。默认情况下，所有bean的公有方法都可以被外部调用，但bean一般只会引出其公有方法的一个子集。　　由于JavaBean本身是Java对象，调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑，不让外部世界访问其任何字段（没有public字段）。这样，方法调用是接触Bean的唯一途径。　　但是和普通类不同的是，对有些Bean来说，采用调用实例方法的低级机制并不是操作和使用Bean的主要途径。公开Bean方法在Bean操作中降为辅助地位，因为两个高级Bean特性--属性和事件是与Bean交互作用的更好方式。　　因此Bean可以提供要让客户使用的public方法，但应当认识到，Bean设计人员希望看到绝大部分Bean的功能反映在属性和事件中，而不是在人工调用和各个方法中。　　（3） 事件（event）　　Bean与其他软件组件交流信息的主要方式是发送和接受事件。我们可以将bean的事件支持功能看作是集成电路中的输入输出引脚：工程师将引脚连接在一起组成系统，让组件进行通讯。有些引脚用于输入，有些引脚用于输出，相当于事件模型中的发送事件和接收事件。　　事件为JavaBean组件提供了一种发送通知给其他组件的方法。在AWT事件模型中，一个事件源可以注册事件监听器对象。当事件源检测到发生了某种事件时，它将调用事件监听器对象中的一个适当的事件处理方法来处理这个事件。　　由此可见，JavaBean确实也是普通的Java对象，只不过它遵循了一些特别的约定而已。
需求
JavaBean是java类，属于某些特定的译码指导方针，并且扩展了适应性和范围，允许用户访问内部的属性和方法。通过这些，JavaBean类可以用于下列方法：
1． 在IDE中，JavaBean的功能允许应用开发者浏览其中的方法，即JavaBean是被编译的，并且无法利用原始的源文件。
2． 在 Remote Method Invocation(RMI) 的分布式风格中，这项功能听起来并不让人兴奋，但是在未来的包含企业版的JavaBean后，将改变这种情况。
3． 为了JavaBean的属性值和状态可以保存到磁盘上。
这里说的有些简单，如果想了解更多的东西，可以查阅一些资料。
范围
JavaBean 的范围 Scope 是一个具有生命时间的变量。JavaBean的范围在
<jsp:useBean scope=”….>标志中右边进行表示。将产生一个JavaBean的快捷参考。
说明：jsp服务器引擎将剥离<jsp。。。。标记。并且在最终用户的浏览器上无法显示实际代码。
存在下面四种范围： 页面page、 请求request、 对话session、 应用application。对话范围对话范围的JavaBean 主要应用于跨多个页面和时间段： 例如填充 用户信息。 添加信息并且接受回馈，保存用户最近执行页面的轨迹。对话范围JavaBean保留一些和用户对话 ID 相关的信息。这些信息来自临时的对话cookie，并在当用户关闭浏览器时，这个cookie将从客户端和服务器删除。请求范围页面和请求范围的JavaBean有时类似表单 的bean ， 这是因为 他们大都用于处理表单。表单需要很长的时间来处理用户的输入，通常情况下用于页面接受HTTP/POST或者GET请求。另外页面和请求范围的bean可以用于减少大型站点服务器上的负载，如果使用对话bean，耽搁的处理就可能会消耗掉很多资源。应用应用范围通常应用于服务器的部件，例如 JDBC 连接池、应用监视、用户计数和其他参与用户行为的类。
在Bean中限制HTML的产生：
理论上，JavaBean 将不会产生任何HTML，因为这是jsp层负责的工作；然而，为动态消息提供一些预先准备的格式是非常有用的。产生的HTML将被标注的 JavaBean方法返回。
这里有一些非常重要的事情：
1. 不要试图在JavaBean返回的HTML中放置任何字体尺寸。
并不是所有的浏览器都相同。很多浏览器无法处理完整的字体尺寸。 
2. 不要试图在JavaBean返回的HTML中放置任何脚本或者DHTML。
向页面直接输出脚本或者DHTML相当于自我毁灭，因为某些浏览器版本在处理不正确的脚本时会崩溃（非常少但是有）。如果用户的JavaBean在运行时是动态的推出复杂的HTML语言，用户将陷入调试的噩梦。另外，复杂的HTML将限制JavaBean的寿命和灵活性。
3. 不要提供任何的选择。
如果用户使用不同的系统浏览页面，可以提供一种可以替换的方法。
按着Sun公司的定义，JavaBean是一个可重复使用的软件组件。实际上JavaBean是一种Java类，通过封装属性和方法成为具有某种功能或者处理某个业务的对象，简称bean。由于javabean是基于java语言的，因此javabean不依赖平台，具有以下特点： 
1． 可以实现代码的重复利用 
2． 易编写、易维护、易使用 
3． 可以在任何安装了Java运行环境的平台上的使用，而不需要重新编译。 
编写javabean就是编写一个java的类，所以你只要会写类就能编写一个bean，这个类创建的一个对象称做一个bean。为了能让使用这个bean的应用程序构建工具（比如JSP引擎）知道这个bean的属性和方法，只需在类的方法命名上遵守以下规则： 
1． 如果类的成员变量的名字是xxx，那么为了更改或获取成员变量的值，即更改或获取属性，在类中可以使用两个方法： 
getXxx()，用来获取属性xxx。 
setXxx()，用来修改属性xxx.。 
2． 对于boolean类型的成员变量，即布尔逻辑类型的属性，允许使用"is"代替上面的"get"和"set"。 
3． 类中方法的访问属性都必须是public的。 
4． 类中如果有构造方法，那么这个构造方法也是public的并且是无参数的。
区别
JavaBean 和 Server Bean（通常称为 Enterprise JavaBean (EJB)）有一些基本相同之处。它们都是用一组特性创建，以执行其特定任务的对象，获得其它特性的能力。这使得 bean 的行为根据特定任务和所在环境的不同而有所不同。 
Enterprise Bean 与 JavaBean 不同。JavaBean 是使用 java.beans 包开发的，它是 Java 2 标准版的一部分。JavaBean 是一台机器上同一个地址空间中运行的组件。JavaBean 是进程内组件。Enterprise Bean 是使用 javax.ejb 包开发的，它是标准 JDK 的扩展，是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多台机器上跨几个地址空间运行的组件。因此 Enterprise Bean 是进程间组件。JavaBean 通常用作 GUI 窗口小部件，而 Enterprise Bean 则用作分布式商业对象。
注意事项
实际应用中，在表现对象或者处理前扩展JavaBean的设计非常有用。通常认为如果提供信息，web开发者将在功能上满足用户对JavaBean的需求。例如： HTML中显示敏感的数据时，用户可以屏蔽的条目，如密码、电话号码等。
良好规划设计的JavaBean是值得信赖的。
Java 中的 null 不同于 SQL中的 null
看这样一道测试程序：
public class NullTest
{
public static void main(String[] args)
{
int I = 0;
// int I = null;// not a valid initialization;
String str = null;
String strZeroOutValue = "";
StringBuffer sb = new StringBuffer("ull test: String initialized asnull =");
sb.append(str);
sb.append(" String representing a Zero Out Value:")
sb.append(strZeroOutValue);
System.out.println(sb.toString());
}
}
这个程序将产生下面的结果：
Null test: String initialized as null = null
n String representing a Zero Out Value:
在JavaBean中， 我们将 I 变量声明为一个 int， 我们必须处理与该变量相关的值，因为I 默认的没有值，int 类型无法初始化为 null， 如果int 值没有进行明确的初始化，编译器将提示错误。 
执行 NullTest 程序，将验证在文本中空字符串是空值的替代，用于显示 SQL 的插入和更新。如果我们需要删除一些信息，通过删除表单区域的文本，需要将数据库发送长度为0的字符串。
尽管大多数数据库将空字符串作为空值进行操作，如果我们使用的数据库不支持处理空字符串的话，我们必须写入附加的java代码，来创建自己的SQL插入声明。
例如：
if(test.length==0)
{
sb.append("null");
}
else
{
sb.append(test);
}
任务
JavaBean的任务就是: “Write once, run anywhere, reuse everywhere”，即“一次性编写，任何地方执行，任何地方重用”。这个任何实际上就是要解决困扰软件工业的日益增加的复杂性，提供一个简单的、紧凑的和优秀的问题解决方案。
1. 一个开发良好的软件组件应该是一次性地编写，而不需要再重新编写代码以增强或完善功能。因此，JavaBean应该提供一个实际的方法来增强现有代码的利用率，而不再需要在原有代码上重新进行编程。除了在节约开发资源方面的意义外，一次性地编写JavaBean组件也可以在版本控制方面起到非常好的作用。开发者可以不断地对组件进行改进，而不必从头开始编写代码。这样就可以在原有基础上不断提高组件功能，而不会犯相同的错误。
2. JavaBean组件在任意地方运行是指组件可以在任何环境和平台上使用，这可以满足各种交互式平台的需求。由于JavaBean是基于Java的，所以它可以很容易地得到交互式平台的支持。JavaBean组件在任意地方执行不仅是指组件可以在不同的操作平台上运行，还包括在分布式网络环境中运行。
3.JavaBean组件在任意地方的重用说的是它能够在包括应用程序、其他组件、文档、Web站点和应用程序构造器工具的多种方案中再利用。这也许是JavaBean组件的最为重要的任务了，因为它正是JavaBean组件区别于Java程序的特点之一。Java程序的任务就是JavaBean组件所具有的前两个任务，而这第3个任务却是JavaBean组件独有的。
设计目标
现在我们来看一实现JavaBean的一些具体的主要设计目标： 
1.紧凑而方便的创建和使用 
JavaBean紧凑性的需求是基于JavaBean组件常常用于分布式计算环境中，这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。显然，为了适应传送的效率和速度，JavaBean组件必须是越紧凑越好。另外，为了更好地创建和使用组件，就应该使其越简单越好。通常为了提高组件的简易性和紧凑性，设计过程需要投入相对较大的功夫。
现在已有的组件软件技术通常是使用复杂的API，这常常搞得开发者在创建组件时晕头转向。因此，JavaBean组件必须不仅容易使用，而且必须便于开发。这对于组件开发者而言是至关重要的，因为这可以使得开发者不必花大量功夫在使用API进行程序设计上，从而更好地对组件进行润饰，提高组件的可观赏性。
JavaBean组件大部分是基于已有的传统Java编程的类结构上的，这对于那些已经可以熟练地使用Java语言的开发者非常有利。而且这可以使得JavaBean组件更加紧凑，因为Java语言在编程上吸收了以前的编程语言中的大量优点，已经使开发出来的程序变得相当有效率。
2.完全的可移植性
JavaBean API与操作基础的独立于平台的Java系统相结合，提供了独立于平台的组件解决方案。因此，组件开发者就可以不必再为带有Java applet平台特有的类库而担心了。最终的结果都将是计算机界共享可重复使用的组件，并在任何支持Java的系统中无需修改地执行。
3.继承Java的强大功能
现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能，它可以使得对象在运行时彼此动态地交互作用，这样对象就可以从开发系统或其开发历史中独立出来。
对于JavaBean而言，由于它是基于Java语言的，所以它就自然地继承了这个对于组件技术而言非常重要的功能，而不再需要任何额外开销来支持它。
JavaBean继承在现有Java功能中还有一个重要的方面，就是持久性，它保存对象并获得对象的内部状态。通过Java提供的序列化(serialization)机制，持久性可以由JavaBean自动进行处理。当然，在需要的时候，开发者也可以自己建立定制的持久性方案。
4.应用程序构造器支持
JavaBean的另一个设计目标是设计环境的问题和开发者如何使用JavaBean创建应用程序。JavaBean体系结构支持指定设计环境属性和编辑机制以便于JavaBean组件的可视化编辑。这样开发者可以使用可视化应用程序构造器无缝地组装和修改JavaBean组件。就像Windows平台上的可视化开发工具VBX或OCX控件处理组件一样。通过这种方法，组件开发者可以指定在开发环境中使用和操作组件的方法。
5.分布式计算支持
支持分布式计算虽然不是JavaBean体系结构中的核心元素，但也是JavaBean中的一个主要问题。
JavaBean使得开发者可以在任何时候使用分布式计算机制，但不使用分布式计算的核心支持来给自己增加额外负担。这正是出于JavaBean组件的紧凑性考虑的，无疑分布式计算需要大量的额外开销。
界限
虽然JavaBean和Java之间已经有了明确的界限，但在某些方面JavaBean和Java之间仍然存在着非常明显的混淆。Java确实是能够为用户创建可重用的对象，但它却没有管理这些对象相互作用的规则或标准。JavaBean通过指定定义对象之间交互作用的机制，以及大部分对象需要支持的常用行为，如持久性和实际处理等，建立了自己需要的组件模型。
虽然当前的Java组件模型也可以运行得很好，但在传送真正的可重用性和交互操作性上仍然非常有限，Java用户需要做的最多的一件事就是创建applet并使得它们在Web 页面上相互通讯，这并非易事。JavaBean提供了一个框架包，使用这个包进行通讯就容易得多了。
JavaBean组件能够通过定义好的标准属性改进性能。总体而言，JavaBean充分发展了Java applet的功能，并结合了Java AWT组件的紧凑性和可重用性。
基本概念
JavaBean是可复用的平台独立的软件组件，开发者可以在软件构造器工具中其直接进行可视化操作。
软件构造器工具可以是Web页面构造器、可视化应用程序构造器、GUI设计构造器或服务器应用程序构造器。有时，构造器工具也可以是一个包含子一些bean的复合文档的文档编辑器。
JavaBean可以是简单的GUI要素，如按钮或滚动条；也可以是复杂的可视化软件组件，如数据库视图，有些JavaBean是没有GUI表现形式的，但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合。
一个JavaBean和一个Javaapplet相似，是一个非常简单的遵循某种严格协议的Java类。每个JavaBean的功能都可能不一样，但它们都必须支持以下特征。
一个bean没有必须继承的特定的基类或接口。可视化的bean必须继承的类是java.awt.Component，这样它们才能添加到可视化容器中去，非可视化bean则不需要继承这个类。有许多bean，无论是在应用程序构造器工具中，还是在最后创建好的应用程序中，都具有很强的可视化特征，但这并非每个bean必须的特征。
在使用Java编程时，并不是所有软件模块都需要转换成bean。Bean比较适合于那些具有可视化操作和定制特性的软件组件。
从基本上说，JavaBean可以看成是一个黑盒子，即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口，如按钮、窗口、颜色、形状、句柄等。
通过将系统看成使用黑盒子关联起来的通讯网络，我们可以忽略黑盒子内部的系统细节，从而有效地控制系统的整体性能。作为一个黑盒子的模型，JavaBean有3个接口面，可以独立进行开发。
1. JavaBean可以调用的方法。
2. JavaBean提供的可读写的属性。
3. JavaBean向外部发送的或从外部接收的事件。
开发环境
普通JavaBean组件是要分布在各自环境中，所以它们应该能够适应各种环境。虽然我们无法事先预知JavaBean要运行的确切环境，但以下两点是可以确定的：
1. bean必须能够在一个应用程序构造器工具中运行。
2. bean必须可以在产生的应用程序的运行环境中使用。
设计环境
第一点说明的是bean必须可以在设计环境(design environment)中运行。在设计环境中，bean应该提供设计信息给应用程序构造器工具并允许终端用户制定bean的外观和行为。
在传统的软件构造活动中，必须通过编译、链接之后才能看到应用程序的最终运行结果；而利用JavaBean设计的软件中，则没有这种明确的界限。使用JavaBean，就可以非常直观地设计应用程序软件，在设计过程中赋予软件生机。而且，这个过程更加容易重复开发，设计思想更加容易变成原型。
运行环境
第二点说明的是bean必须可以在运行环境(run-time environment)中使用。在这个环境中，对设计信息和定制的需求并不重要。一个组件的设计环境信息和设计环境中编写的代码通常可能是非常巨大的。
因此，我们可能需要在bean的设计环境方面和运行环境方面作一个明确的区分，这样，就可能需要在运行环境中不使用bean的任何设计环境代码来配置这个bean。所以，JavaBean就必须分别支持运行环境接口的类库和设计环境接口的类库。
入门
一般要求首先，您必须有一个不带有参数的公用构造器。此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值，例如： public Fireworks()
{
setAutoStart(true);
setBackground(Color.black);
setSpeed(10);
setRadius(40);
.
.
.
}
如果 bean 是一个从 java.awt.Component 类继承而来的可视 bean，您就应该为 bean 定义一个缺省的首选大小，例如：
public Dimension getPreferredSize()
{
return (new Dimension(radius*3, radius*3));
}
public Dimension getMinimumSize()
{
return getPreferredSize();
}特性对于您需要的每个特性，您应该有一个带有匹配公用 getter 和 setter 方法的专用实例变量，例如： private int speed;
.
.
.
public int getSpeed()
{
return speed;
}
public void setSpeed(int s)
{
speed = s;
}
此 get 和 set 方法必须有与实例变量相同的名称，但是第一个字母要大写并以 get 和 set 开头。
由于连接而在任何时候更改它们的特性时，确认 Bean 在运行时行为正确也是很重要的。如果特性的更改影响到 Bean 的可视外观，您应该以此特性设置的方法来调用
repaint();。
同样，如果特性的更改影响到 bean 的大小和位置，您需要确认获得验证的事物。我们建议编写您自己的 validateAll 方法，如下所示：
private void validateAll()
{
if (isValid())
{
Component self = this;
self.invalidate();
Component myParent = self.getParent();
if (myParent != null)
{
myParent.invalidate();
self = myParent;
}
self.validate();
}
}
然后以此特性设置的方法调用
validateAll();。
bean 类将无法进行关于调用特性设置方法命令的假设。您应该写 bean 以便可以初始构造它，然后在不引起错误的同时在任何命令中设置其特性。操作对于每个您需要的操作，您应该有一个公用方法，例如： public void start()
{
if(thread==null)
{
thread=new Thread(this);
thread.start();
}
}
您为操作写的方法应该在无须期待用户创建连接或设置很多特性的情况下独立操作。 例如，如果您写了一个音频 Bean，您希望通过播放操作处理打开声音的所有步骤、完成您需要的所有设置并播放声音。同样，即使声音未播放，停止操作也应起作用。事件对于您需要的每个事件或事件设置，您应该定义事件和侦听器类。对于此例，查看 FireworksEvent.java 源文件以及 Fireworks.java 文件。此事件类的源应该如同这样：
import java.awt.*;
import java.util.*;
public class FireworksEvent extends EventObject
{
public static final int EXPLODED = 1;
int id = 0;
public FireworksEvent(Component source, int id)
{
super(source);
= id;
}
public int getID()
{
return id;
}
}
您应该为此事件设置中的每个事件定义一个公用静态结束事件标识符，例如在此例子中的 EXPLODED。
对于侦听器类的源，查看 FireworksListener.java 源文件：
import java.util.*;
public interface FireworksListener extends EventListener
{
public abstract void exploded(FireworksEvent e);
}
您应该为此事件设置中的每个事件定义一个公用抽象方法，例如在此例子中的 exploded。 而且，侦听器类必须扩展 EventListener ，以使 JAR 向导能够找到它。
然后，如果由 bean 类播送事件，它必须跟踪侦听事件的对象。要这样做，您需要定义侦听器实例变量以及 addListener 和 removeListener 方法。返回 Fireworks.java 源，例如，您将查看到：
private Vector listeners = new Vector();
public void addFireworksListener(FireworksListener f)
{
listeners.addElement(f);
}
public void removeFireworksListener(FireworksListener f)
{
listeners.removeElement(f);
}
最后，bean 类需要以正确的次数将事件实际播送到所有的侦听器。要这样做，您需要定义 processEvent 方法并以适当的次数调用它，例如：
public void processFireworksEvent(FireworksEvent e)
{
for (Enumeration enum = listeners.elements(); enum.hasMoreElements(); )
((FireworksListener)enum.nextElement()).exploded(e);
}
public void run()
{
processFireworksEvent(new FireworksEvent(this, FireworksEvent.EXPLODED));
}
三大构件
Java bean：编程语言java中的术语，行业内通常称为java豆，带点美哩口味，飘零着咖啡的味道，在计算机编程中代表java构件（EJB的构件），通常有Session bean，Entity bean，MessageDrivenBean三大类。
Session bean：会话构件，是短暂的对象，运行在服务器上，并执行一些应用逻辑处理，它由客户端应用程序建立，其数据需要自己来管理。分为无状态和有状态两种。
Entity bean：实体构件，是持久对象，可以被其他对象调用。在建立时指定一个唯一标示的标识，并允许客户程序，根据实体bean标识来定位beans实例。多个实体可以并发访问实体bean，事物间的协调由容器来完成。
MessageDriven Bean：消息构件，是专门用来处理JMS（Java Message System）消息的规范（EIB2.0）。JMS是一种与厂商无关的API，用来访问消息收发系统，并提供了与厂商无关的访问方法，以此来访问消息收发服务。JMS客户机可以用来发送消息而不必等待回应。