ITEEDU

JSP/Servlet:简介 JavaBean

对于动态网页来说,如果它又要负责网页内容的生成,又要负责数据的处理与保存,最后常导致的结果就是页面呈现的部份与程序的逻辑处理,以及数据对象的处理 等混合在一起,对于必须相互合作的网页设计人员与程序设计人员来说都是一种困扰,JavaBean的作用之一,就是希望将程序的逻辑处理与呈现部份分开, 是实现 Model 1 架构的一种技术。

JavaBean的撰写就如一般的Java程序,我们先撰写一个简单的Java类,其作用为寻找两个数的最大公因子:

GCDBean.java
package onlyfun.caterpillar;
public class GCDBean {
private int num1;
private int num2;
public int getGCD() { 
int r = 0; 
while(num2 != 0) { 
r = num1 % num2; 
num1 = num2; 
num2 = r; 
} 
return num1; 
}
public int getNum1() {
return num1;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
} 

注意在JSP 2.0之后,JavaBean的类别一定要有package加以管理; 上面这个类别所拥有的方法都是公开的,而且使用setXXX()与getXXX() 的方式来命名,将这个类别编译完成后,您将类别*.class放置于Web应用程的WEB-INF/classes/数据夹中,注意由于我们设定 package为onlyfun.caterpillar,所以最后您的*.class应该路径应该是WEB- INF/classes/onlyfun/caterpillar/GCDBean.class,接下来在JSP网页中将这个类别当作 JavaBean来使用,撰写以下这个JSP网页程序:

beanTest.jsp
<%@page contentType="text/html; charset=Big5"%> 
<html> 
<body>
<jsp:useBean 
id="gcdBean" 
class="onlyfun.caterpillar.GCDBean" /> 
<jsp:setProperty
name="gcdBean" property="*" /> 
最大公因子:<jsp:getProperty 
name="gcdBean" property="GCD" />
</body> 
</html> 

<jsp:useBean>标签是用来呼叫JavaBean的方法,id用于指定JavaBean实例的参考名称,它实际将转换为 Servlet中的一个对象参考名称,class用以指定您的JavaBean将实例化哪一个类别,在执行JSP网页时,它会检查 JavaBean的实例是否已经存在,如果不存在,则实例化一个JavaBean。

<jsp:setProperty>卷标用于给JavaBean设定属性值,name用于指定您要使用哪一个参考名称所参考至的 JavaBean实例;在属性设定时我们使用了introspection机制,在property设定"*",表示将自动寻找request中符合 JavaBean中setter名称的参数值,即如果request的参数名称若符合setXXX()中XXX名称,则将request中对应的值设定给 setXXX()。

<jsp:getProperty>则用来取得JavaBean所携带的属性值,name用于指定您要使用哪一个参考名称所参考至的JavaBean实例,在property中指定的是要哪一个属性值,即如果指定为XXX,则使用getXXX()方法取得值。

可以实作一个窗体来发送参数资料给上面这个JSP网页:

form.php
<html> 
<body> 
<form name="login" method="get" action="beanTest.jsp"> 
Number 1: <input type="text" name="num1"> <br>
Number 2: <input type="text" name="num2"> <br>
<input type="submit" value="送出"> 
<input type="reset" value="清除"> 
</form> 
</body> 
</html> 

连接上这个窗体,并输入适当的数字,在送出数据后,您就可以看到所计算完毕的GCD值。

如上所示的,使用JavaBean,您可以将部份的程序逻辑移至JavaBean中,而不用在JSP网页中直接撰写程序逻辑,只要在 JSP网页中使用<jsp:useBean>、<jsp:setProperty>与<jsp: getProperty>等卷标,卷标的使用在HTML网页中对网页设计人员来说会比较友善,不会带有太多的程序逻辑部份,可以实现「部份的」视图 与逻辑分离的目的(毕竟,仅靠JavaBean要达到完全的分离仍有其限制)。

要注意的是,每当您的JavaBean程序内容改变并重新编译后,容器不一定会知道JavaBean的内容已经改变,也就不会重新加载改变后新的类别,这 是使用JavaBean的缺点之一,解决的方法就是重新启动容器,让容器重新加载改变后的JavaBean,如果是在测试阶段,您可以设定容器自动侦测类 别是否已经改变,并让容器自动加载改变后的类别,您可以参考 href="http://www.javaworld.com.tw/jute/post/view?bid=9&id=48247&sty=1&tpg=1&age=-1">关于让Tomcat 5.0自动Reload Servlet

对于JavaBean,您必须知道几个规则:

  • 必须提供一个public,无参数的预设建构式。
  • Setter或Getter必须是public的,具分别以set及get开头。
  • Setter的接受型态与Getter传回型态必须相同。
这边先简单的介绍如何撰写一个简单的JavaBean,JavaBean的摆放,以及如何在JSP网页中使用它们,至于<jsp: useBean>、<jsp:setProperty>与<jsp:getProperty>等标签的更多用法,以及 JavaBean的更多应用与作用范围,将在之后的主题中作更多的介绍。