java bean

JavaBean 是一种JAVA语言写成的可重用组件。

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

用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包，并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能，而不用关心任何改变。

JavaBean是可复用的平台独立的软件组件，开发者可以在软件构造器工具中其直接进行可视化操作。 软件构造器工具可以是Web页面构造器、可视化应用程序构造器、CUI设计构造器或服务器应用程序构造器。有时，构造器工具也可以是一个包含子一些bean的复合文档的文档编辑器。

JavaBean可以是简单的CUI要素，如按钮或滚动条；也可以是复杂的可视化软件组件，如数据库视图，有些JavaBean是没有GUI表现形式的，但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合。

一个JavaBean和一个Javaapplet相似，是一个非常简单的遵循某种严格协议的Java类。每个JavaBean的功能都可能不一样，但它们都必须支持以下特征。

Java Bean 是一种特殊的 Java类，它严格遵循 JavaBean 命名规范，定义存取类状态信息方法的命名规则。

Java Bean 的属性由它的方法定义(而不是由字段定义)。以“set”为名称开始的方法是可写的属性，而以“get”为名称开始的方法是可读的属性。

对于“boolean”类型的字段，可读的方法名称也可以用“is”开始。“Set”方法不应拥有返回类型（即必须为 void），并且只能有一个参数，参数的数据类型必须和属性的数据类型一致。“Get”方法应返回合适的类型并且不允许有参数。

虽然通常并不强制，但“Set”方法参数的数据类型和“Get”方法的返回类型应一致。Java Bean 还应实现Serializable接口。

我们可以通过setXxx（）和getXxx（）来设置属性Xxx的只读、只写或者读写属性：只有setXxx（）方法的属性具有只写属性；只有getXxx（）方法的属性具有只读属性；同时有setXxx（）和getXxx（）方法的属性具有读写属性。

## JSP中有关JavaBean的动作标签

在JSP中和JavaBean有关的动作标签有<jsp:useBean>、<jsp:setProperty>和<jsp:getProperty>三种。下面分别对这三种动作标签进行讲解。

### 1.<jsp:useBean>标签

<jsp:useBean>定义该JavaBean组件，并在页面中实例化出该JavaBean组件。其语法为：

<jsp:useBean id=“BeanInstanceName” scope=“page | request | session | application” class=“package.class” />

useBean动作中的属性：

(1)id：确定Bean实体的名称，在后面的程序中可以使用这个名称来分辨不同的Bean，并使用这个Bean对象调用Bean中的方法，这个名称是大小写敏感的，跟Java中的规范一致。

(2)scope：Bean存在的范围以及点id变量名的有效范围。

(3)page：在当前JSP文件以及此文件中的所有静态包含文件中使用Bean，直到页面执行完毕向客户端发回响应或转到另一个文件为止。

(4)request：在任何执行相同请求的JSP文件中使用该Bean，用户可以使用request对象访问Bean。

(5)session：从创建Bean开始，在任何使用相同session的JSP文件中使用Bean，该Bean存在于整个session生存周期内。

(6)application：从创建Bean开始，用户就能在任何使用相同application的JSP文件中使用Bean。该Bean存在于整个application生存周期。

(7)class：Bean所在的类，类中定义了可操作的属性和方法。

### 2.<jsp:setProperty>标签

<jsp:setProperty>设置该JavaBean组件的属性。其语法为：

<jsp:setProperty name="…" property="…" value="…"/>

setProperty动作中的属性：

(1)name：Bean的名字，由useBean指令的id属性指定。

(2)property：可以是Bean中的某个属性名，还可以是*，后者表示存储用户在JSP输入的所有值，用于匹配Bean中的属性，要求Bean中属性的名字必须和request对象中的参数名保持一致，类型的转换会自动完成。

(3)value：赋给Bean中某个属性的值，以字符串方式赋值。

### 3.<jsp:getProperty>标签

<jsp:getProperty>获得JavaBean组件的某一个属性的值。其语法为：

<jsp:getProperty name="…" property="…"/>

getProperty动作中的属性：

(1)name：Bean的名字，由useBean指令的id属性指定。

(2)property：所指定的Bean的属性，如果该动作所检索的属性值为空，会产生NullPointerException异常。

### 在JSP中使用JavaBean的基本步骤

在JSP中使用JavaBean主要以下五个步骤。

(1)创建JavaBean的Java源程序，实现该JavaBean的功能；

(2)编译JavaBean，使其产生*.class文件；

(3)将该*.class文件放到某一个路径下；

在Tomcat中应该将该JavaBean组件的*.class文件放在Web应用程序所在的\Web-INF\classes\Bean的包名称目录下；而且要求该JavaBean的Java程序要声明有包的定义，此时则应该放在包名所在的目录下。

(4)创建使用该JavaBean的JSP程序；

(5)测试。

JavaBean实例：

1. package animal;

2. public class Cat{

3.

1. //属性声明

2. private String strName;

3. private String strColor;

4. private int intAge;

5. //方法声明

6. public void setName(String name) {

7. this.strName = name;

8. }

9.

10. public void setColor(String color) {

11. this.strColor = color;

12.

13. }

14.

15. public void setAge(int age) {

16. this.intAge = age;

17. }

18.

19. public String getName() {

20. return strName;

21. }

22.

23. public String getColor() {

24. return strColor;

25.

26. }

27.

28. public int getAge() {

29. return intAge;

30.

31. }

32.

33. }

### 部署JavaBean

首先编译JavaBean，然后将编译好的class文件复制到%CATALINA_HOME%\webapps\ROOT\WEB-INF\classes目录下即可。以上面的JavaBean为例：将编译好的Cat.class文件复制到%CATALINA_HOME%\webapps\ROOT\WEB-INF\classes\ animal\目录下即可。

注意：如果是自己定义的虚拟目录，而不是 tomcat 默认的目录，则同样是复制到对应的子目录 WEB-INF\classes 下。

### 使用JavaBean的例子

1. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

2. <jsp:useBean id="cat" scope="page" class="animal.Cat"/>

3. <html>

4. <head>

5. <title>使用JavaBean</title>

6. </head>

7. <body>

8. <%

9. cat.setName("Tom");

10. cat.setColor("white");

11. cat.setAge(3);

12. out.println("Cat Name="+cat.getName());

13. out.println("<br>");

14. out.println("Cat Color="+cat.getColor());

15. out.println("<br>");

16. out.println("Cat Age="+cat.getAge());

17. %>

18. </body>

19. </html>

还有下面的使用方法：

1. <jsp:getProperty>

2. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

3. <jsp:useBean id="cat" scope="page" class="animal.Cat"/>

4. <html>

5. <head>

6. <title>使用JavaBean</title>

7. </head>

8. <body>

9. <jsp:getProperty name="cat" property="Name"/>

10. .....

11. </body>

12. </html>

### JavaBean设计注意事项

1.不要试图在JavaBean返回的HTML中放置任何字体尺寸。并不是所有的浏览器都相同。很多浏览器无法处理完整的字体尺寸。

2.不要试图在JavaBean返回的HTML中放置任何脚本或者DHTML。向页面直接输出脚本或者DHTML相当于自我毁灭，因为某些浏览器版本在处理不正确的脚本时会崩溃（非常少但是有）。如果用户的JavaBean在运行时是动态的推出复杂的HTML语言，用户将陷入调试的噩梦。另外，复杂的HTML将限制JavaBean的寿命和灵活性。

3.不要提供任何的选择。

### 在JSP中使用JavaBean的更多练习

结合前面讲解的知识，下面利用一个简单的Hello示例具体讲解在JSP中使用JavaBean。本例中所用的文件如表所示：

文件名 | 功能
testA.jsp | 用于提交请求
testB.jsp | 使用JavaBean，并显示相应结果
TestBean.java | 用于处理提交的信息

下面分别列出这三个文件的具体内容。

testA.jsp代码

1. <%@ page contentType="text/html;charset=GBK"%>

2. <html>

3. <head>

4. <title>示例</title>

5. </head>

6. <body scroll=no>

7. <form name="frma" method="post" action="testB.jsp" >

8. <p>

9. 你的姓名：

10. <input type="text" size="15" name="yourName" value="" id=yourName>

11. <input type="button" align="center" name="subBtn" value="[提交]" onClick="f_check()" id=subBtn>

12. </p>

13. </form>

14. </body>

15. </html>

16. <script language="JavaScript" type="text/javascript">

17. <!--

18. function f_check(){

19. if(document.forms(0).yourName.value=="")

20. {

21. alert("请输入姓名");

22. }

23. else

24. {

25. document.forms(0).submit();

26. }

27. }

28. -->

29. </SCRIPT>

如上代码所示，testA.jsp文件主要是用于提交用户请求的。testA.jsp把用户请求交由testB.jsp文件进行处理。在testA.jsp文件中还使用了JavaScript，用于简单的判断输入是否为空。

testB.jsp代码

1. <%@ page contentType="text/html;charset=GBK"%>

2. <html>

3. <head>

4. <title>示例</title>

5. </head>

6. <JSP:useBean id="tBean" scope="page" class="bean.TestBean" >

7. <JSP:setProperty name="tBean" property="*" />

8. </JSP:useBean>

9. <body scroll=no>

10. <form name="frmb" method="post" action="" >

11. <p>

12. <%=tBean.hello()%>

13. </p>

14. </form>

15. </body>

16. </html>

如上代码所示，testB.jsp文件利用<jsp:useBean>和<jsp:setProperty>两个动作标签对JavaBean进行操作。其中<jsp:useBean>标签用于实例化JavaBean（bean.TestBean），并指定其生命周期。而<jsp:setProperty>标签用于设置JavaBean中的属性（tBean）。最后调用JavaBean的hello()方法，并输出相关信息。

TestBean.java代码

1. package bean;

2. public class TestBean

3. {

4. private String yourName = "";

5. public void setYourName(String yourName)

6. {

7. this.yourName = ConvertGBK(yourName);

8. }

9. public String hello()

10. {

11. String strHello = "Hello："+yourName;

12. return strHello;

13. }

14. //汉字转换方法

15. public String ConvertGBK(String str)

16. {

17. String strReturn="";

18. try

19. {

20. strReturn=new String(str.getBytes("ISO-8859-1"), "GBK");

21. }

22. catch(Exception ex)

23. {

24. System.out.println("TestBean.ConvertGBK():ex="+ex.toString());

25. }

26. finally

27. {

28. return strReturn;

29. }

30. }

31. }

如上代码所示，TestBean.java中定义了三个方法和一个字符串变量。下面分别对这些变量和方法进行讲解。

yourName：这是一个字符串变量。这个变量用于保存提交来的信息。

setYourName()：这个方法与testB.jsp文件中的<jsp:setProperty>对应。通过此方法为字符串变量进行赋值。

hello()：这个方法返回一个字符串。在返回的字符串中包含提交来的信息。

ConvertGBK()：这个方法用于转换编码。

编写完毕后，编译这个JavaBean，然后启动服务器运行。运行结果如图所示：