本章将要介绍JavaBean技术,这个技术在java中使用的非常普遍,比如JSP技术中就有JavaBean的使用,那么什么是JavaBean呢,其实它就是一个普通的java类,但是这个类必须符合一些要求,我们下面将介绍到。
JavaBean是一种可重复使用、且跨平台的软件组件。一般JavaBean可以分为二种:一种是用户界面(UI,User Interface)的javaBean;还有一种是没有用户界面的,主要负责处理事务(如数据运算,操纵数据库)的javaBean。DQM容器中通常使用的是后一种javaBean。
使用JavaBean有3个好处:
1. 使得HTML与java程序分离,这样便于维护代码。
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可以通过setNum1和setNum2二个方法设定需要计算的浮点数,add和minus用于得到计算后的结果。将此类文件编译后放入/WEB-INF/classes目录下(注意包名,类文件完整路径是/WEB-INF/classes/mybean/Calculate.class)。
在动态文件中既可以通过java程序代码来使用(初始化)JavaBean,也可以通过特定的DQM标签来使用JavaBean。采用后一种方法可以减少DQM动态文件中的程序代码,使它更接近于HTML页面。下面介绍使用JavaBean的标签。
DQM的JavaBean标签语法形式为:<%@bean id="对象名" class="类名" scope="范围"%>
其中id用于指定JavaBean实例成对象的名字,class用于指定JavaBean的类名(如没有import类路径则必须写是全名),scope用于指定JavaBean对象存在的范围。关于scope我们会花点时间来了解一下,scope可以选择的值包括page、session和application。如果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行使用了DQM的JavaBean标签语法使用了mybean.Calculate这个JavaBean,之后设置了二个需要计算的浮点数(源程序5、6行),最后对这二个浮点数进行加减计算后显示结果(源程序10、11行)。结果如下:
加法计算的结果是:13.110000000000001 减法计算的结果是:11.35 |
虽然这个JavaBean看起来几乎就是多此一举,如此简单的计算完全可以在动态文件中直接完成,何必再去使用JavaBean计算,当然我也有这样的想法,不过这里只是举个例子,如果你遇到很复杂或大量的计算你就可以使用JavaBean,这样做就像前面介绍过的可以使得HTML与java程序分离,便于维护代码,如果计算过程需要改变那么基本上只要修改JavaBean中的代码,动态文件中的代码只需要很少的改变或者更本无需改变。
在使用JavaBean的标签中可以设置JavaBean的scope属性,scope属性决定了JavaBean对象的生存期范围。scope的可选值包括page、session和application,默认值为page。为了更好理解范围的含义,我们将举例说明,首先建立一个在mybean包中名为CounterBean的JavaBean,在这个类中定义了一个属性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; } |
下面用一个使用CounterBean的counterBean.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> |
当scope为page时客户端每次请求访问时都会创建一个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对象已经结束生命期。
当scope为session时JavaBean对象被创建后,它将存在于整个session的生命周期内(关于session请参见第8章),同一个session中的动态文件共享这个JavaBean对象。JavaBean对象作为属性保存在session对象中,属性名为JavaBean的id,属性值为JavaBean对象,除了可以通过JavaBean的id直接引用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对象。
当scope为application时JavaBean对象被创建后,它将存在于整个主机或虚拟主机的生命周期内(关于application请参见第9章),同一个主机或虚拟主机中的动态文件共享这个JavaBean对象。JavaBean对象作为属性保存在application对象中,属性名为JavaBean的id,属性值为JavaBean对象,除了可以通过JavaBean的id直接引用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对象存在于当前主机或虚拟主机的整个生命周期中。