11章 使用JavaBean

 

  本章将要介绍JavaBean技术,这个技术在java中使用的非常普遍,比如JSP技术中就有JavaBean的使用,那么什么是JavaBean呢,其实它就是一个普通的java类,但是这个类必须符合一些要求,我们下面将介绍到。

 

 

11.1 JavaBean简介

  JavaBean是一种可重复使用、且跨平台的软件组件。一般JavaBean可以分为二种:一种是用户界面(UI,User Interface)javaBean;还有一种是没有用户界面的,主要负责处理事务(如数据运算,操纵数据库)的javaBeanDQM容器中通常使用的是后一种javaBean

使用JavaBean3个好处:

1.       使得HTMLjava程序分离,这样便于维护代码。

2.       可以降低开发动态网页人员对java编程能力的要求。

3.       DQM脚本语言侧重于生成动态网页,事务处理由JavaBean来完成,这样可以充分利用JavaBean组件的可重用性特点,提高开发网站的效率。

 

JavaBean还必须具有以下2个特性:

1.       JavaBean是一个公共的(public)类。

2.       JavaBean必须有一个不带参数的构造方法。

 

  我们来举一个JavaBean例子,Calculate.java是用于计算数据的一个JavaBean,它是mybean包下面的,源程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

package mybean;

 

public class Calculate {

  public Calculate() {

  }

 

  //相加计算

  public double add() {

    return num1 + num2;

  }

 

  //相减计算

  public double minus() {

    return num1 - num2;

  }

 

  public void setNum1(double inum1) {

    num1 = inum1;

  }

 

  public void setNum2(double inum2) {

    num2 = inum2;

  }

 

  private double num1;

  private double num2;

}

 

  上面这个JavaBean可以通过setNum1setNum2二个方法设定需要计算的浮点数,addminus用于得到计算后的结果。将此类文件编译后放入/WEB-INF/classes目录下(注意包名,类文件完整路径是/WEB-INF/classes/mybean/Calculate.class)。

 

 

11.2 DQM使用JavaBean的语法

在动态文件中既可以通过java程序代码来使用(初始化)JavaBean,也可以通过特定的DQM标签来使用JavaBean。采用后一种方法可以减少DQM动态文件中的程序代码,使它更接近于HTML页面。下面介绍使用JavaBean的标签。

DQMJavaBean标签语法形式为:<%@bean id="对象名" class="类名" scope="范围"%>

  其中id用于指定JavaBean实例成对象的名字,class用于指定JavaBean的类名(如没有import类路径则必须写是全名),scope用于指定JavaBean对象存在的范围。关于scope我们会花点时间来了解一下,scope可以选择的值包括pagesessionapplication。如果scope这个属性不写则默认为page值。关于JavaBean范围我们将在下一节中介绍。

 

我们现在举个例子,useJavaBean.dqm动态文件中使用了上面的mybean.Calculate这个JavaBean,源程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

<%@bean id="myBean" class="mybean.Calculate" scope="page"%>

 

<%

//设置需要计算的数

myBean.setNum1(12.23);

myBean.setNum2(0.88);

%>

 

<pre>

加法计算的结果是:<%=myBean.add()%>

减法计算的结果是:<%=myBean.minus()%>

</pre>

 

程序第1行使用了DQMJavaBean标签语法使用了mybean.Calculate这个JavaBean,之后设置了二个需要计算的浮点数(源程序56行),最后对这二个浮点数进行加减计算后显示结果(源程序1011行)。结果如下:

加法计算的结果是:13.110000000000001

减法计算的结果是:11.35

 

  虽然这个JavaBean看起来几乎就是多此一举,如此简单的计算完全可以在动态文件中直接完成,何必再去使用JavaBean计算,当然我也有这样的想法,不过这里只是举个例子,如果你遇到很复杂或大量的计算你就可以使用JavaBean,这样做就像前面介绍过的可以使得HTMLjava程序分离,便于维护代码,如果计算过程需要改变那么基本上只要修改JavaBean中的代码,动态文件中的代码只需要很少的改变或者更本无需改变。

 

 

11.3 JavaBean的范围

在使用JavaBean的标签中可以设置JavaBeanscope属性,scope属性决定了JavaBean对象的生存期范围。scope的可选值包括pagesessionapplication,默认值为page。为了更好理解范围的含义,我们将举例说明,首先建立一个在mybean包中名为CounterBeanJavaBean,在这个类中定义了一个属性count及访问这个属性的方法。源程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package mybean;

 

public class CounterBean {

  public CounterBean() {

  }

 

  public int getCount() {

    return count;

  }

 

  public void setCount(int count) {

    this.count = count;

  }

 

  private int count = 0;

}

 

下面用一个使用CounterBeancounterBean.dqm动态文件来解释这三种scope,源程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<%@page import = "mybean.CounterBean"%>

<%@ bean id="myBean" scope="page" class="mybean.CounterBean"%>

 

<pre>

当前计数器的值是:<%=myBean.getCount()%>

 

<%//使JavaBean对象中的count值增加1

myBean.setCount(myBean.getCount() + 1);

 

//接下来判断myBean对象存在于哪个scope

CounterBean obj = null;

String scope = null;

 

//检查是否是session范围

obj = (CounterBean)session.getAttribute("myBean");

if (obj != null)

  scope = "session";

 

//检查是否是application范围

obj = (CounterBean)application.getAttribute("myBean");

if (obj != null)

  scope = "application";

 

//如果既不是session范围又不是application范围,那么必定是page范围

if (scope == null)

  scope = "page";

%>

 

scope=<%=scope%>

</pre>

 

scopepage时客户端每次请求访问时都会创建一个JavaBean对象。JavaBean对象的有效范围是客户请求访问的当前动态文件,当客户执行当前的动态文件完毕后JavaBean对象结束生命。在上面那个counterBean.dqm动态文件第2行中表示myBean对象存在的范围是page

<%@ bean id="myBean" scope="page" class="mybean.CounterBean"%>

通过浏览器执行这个动态文件将会看到count的值为0。输出的内容如下:

当前计数器的值是:0

scope=page

  多次刷新网页,count的值始终为0。这是因为在page范围内,每次访问counterBean.dqm都会生成新的CounterBean对象,原有的CounterBean对象已经结束生命期。

 

scopesessionJavaBean对象被创建后,它将存在于整个session的生命周期内(关于session请参见第8章),同一个session中的动态文件共享这个JavaBean对象。JavaBean对象作为属性保存在session对象中,属性名为JavaBeanid,属性值为JavaBean对象,除了可以通过JavaBeanid直接引用JavaBean对象外,也可以通过session.getAttribute()方法取得JavaBean对象。当客户对应的session生命期结束时JavaBean对象的生命也结束了。

修改counterBean.dqm动态文件第2行,将scope属性改为session

<%@ bean id="myBean" scope="session" class="mybean.CounterBean"%>

通过浏览器执行这个动态文件输出的内容如下:

当前计数器的值是:0

scope=session

多次刷新网页,count的值会不断递增。如果关闭后重新打开浏览器,count的值又从零开始增长。这是因为在“session”范围内,CounterBean对象存在于一个session中。关闭后重新打开浏览器,就会开始一个新的session。每个session中拥有各自的CounterBean对象。

 

scopeapplicationJavaBean对象被创建后,它将存在于整个主机或虚拟主机的生命周期内(关于application请参见第9章),同一个主机或虚拟主机中的动态文件共享这个JavaBean对象。JavaBean对象作为属性保存在application对象中,属性名为JavaBeanid,属性值为JavaBean对象,除了可以通过JavaBeanid直接引用JavaBean对象外,也可以通过application.getAttribute()方法取得JavaBean对象。当主机或虚拟主机停止后(即服务器关闭)则JavaBean对象的生命也结束了。

修改counterBean.dqm动态文件第2行,将scope属性改为啊application

<%@ bean id="myBean" scope="application" class="mybean.CounterBean"%>

通过浏览器执行这个动态文件输出的内容如下:

当前计数器的值是:0

scope=application

  多次刷新网页,会看到count的值不断递增。如果关闭后重新打开浏览器,count的值在原有的基础上还是会继续递增的。这是因为在“application”范围内,CounterBean对象存在于当前主机或虚拟主机的整个生命周期中。