JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。

用户可以使用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是java,属于某些特定的译码指导方针,并且扩展了适应性和范围,允许用户访问内部的属性和方法。通过这些,JavaBean类可以用于下列方法:

 
  1. 在
中,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 2 标准版的一部分。JavaBean 是一台机器上同一个地址空间中运行的组件。JavaBean 是进程内组件。Enterprise Bean 是使用 javax.ejb 包开发的,它是标准 
 的扩展,是 Java 2 Enterprise Edition 的一部分。Enterprise Bean 是在多台机器上跨几个地址空间运行的组件。因此 Enterprise Bean 是进程间组件。JavaBean 通常用作 GUI 窗口小部件,而 Enterprise Bean 则用作分布式商业对象。

实际应用中,在表现对象或者处理前扩展JavaBean的设计非常有用。通常认为如果提供信息,web开发者将在功能上满足用户对JavaBean的需求。例如: HTML中显示敏感的数据时,用户可以屏蔽的条目,如密码、电话号码等。

 
  良好规划设计的JavaBean是值得信赖的。
 
  Java 中的 null 不同于 
中的 null
 
  看这样一道测试程序:
 
  public 
 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(“Null test: String initialized 
null = “);
 
  sb.append(str);
 
  sb.append(“n 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 的范围:
 
  JavaBean 的范围。 Scope 是一个具有生命时间的变量。JavaBean的范围在
 
  标志中右边进行表示。将产生一个JavaBean的快捷参考。
 
  说明:jsp服务器引擎将剥离
 
  存在下面四种范围: 页面、 请求、 对话、 应用。
 
  对话范围:
 
  对话范围的JavaBean 主要应用与跨多个页面和时间段: 例如填充用户信息。 添加信息并且接受回馈,保存用户最近执行页面的轨迹。对话范围JavaBean保留一些和用户对话 ID 相关的信息。这些信息来自临时的对话cookie,并在当用户关闭浏览器时,这个cookie将从
和服务器删除。
 
  页面/请求范围:
 
  页面和请求范围的JavaBean有时类似表单 的bean , 这是因为他们大都用于处理表单。表单需要很长的时间来处理用户的输入??外页面和请求范围的bean可以用于减少大型站点服务器上的负载,如果使用对话bean,耽搁的处理就可能会消耗掉很多资源。
 
  应用:
 
  应用范围通常应用于服务器的部件,例如 
连接池、应用监视、用户计数和其他参与用户行为的类。
 
  在Bean中限制HTML的产生:
 
  理论上,JavaBean 将不会产生任何HTML,因为这是jsp层负责的工作;然而,为了动态
提供一些预先准备的格式是非常有用的。产生的HTML将被标注的 JavaBean方法返回。
 
  这里有一些非常重要的事情:
 
  1.不要试图在JavaBean返回的HTML中放置任何字体尺寸。
 
  并不是所有的浏览器都相同。很多浏览器无法处理完整的字体尺寸。
 
  2.不要试图在JavaBean返回的HTML中放置任何脚本或者DHTML。
 
  向页面直接输出脚本或者DHTML相当于自我毁灭,因为某些浏览器版本在处理不正确的脚本时会崩溃(非常少但是有)。如果用户的JavaBean在运行时是动态的推出复杂的HTML语言,用户将陷入调试的噩梦。另外,复杂的HTML将限制JavaBean的寿命和灵活性。
 
  3.不要提供任何的选择。
 
  如果用户使用不同的系统浏览页面,可以提供一种可以替换的方法。

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组件必须是越紧凑越好。另外,为了更好地创建和使用组件,就应该使其越简单越好。通常为了提高组件的简易性和紧凑性,设计过程需要投入相对较大的功夫。
 
  现在已有的组件软件技术通常是使用复杂的
,这常常搞得开发者在创建组件时晕头转向。因此,JavaBean组件必须不仅容易使用,而且必须便于开发。这对于组件开发者而言是至关重要的,因为这可以使得开发者不必花大量功夫在使用API进行
上,从而更好地对组件进行润饰,提高组件的可观赏性。
 
  JavaBean组件大部分是基于已有的传统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可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状、句柄等。

 
  通过将系统看成使用黑盒子关联起来的通讯网络,我们可以忽略黑盒子内部的系统细节,从而有效地控制系统的整体性能。作为一个黑盒子的模型,JavaBean有3个接口面,可以独立进行开发。
 
  1. JavaBean可以调用的方法。
 
  2. JavaBean提供的可读写的属性。
 
  3. 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 以便可以初始构造它,然后在不引起错误的同时在任何命令中设置其特性。