目 录
- 概述
- 编写JavaBean
- 保存bean的字节码
- 创建与使用bean
- 使用bean
- bean的加载原理
- bean的有效范围(生命周期)
- 获取和修改beans的属性
- getProperty动作标记
- setProperty动作标记
- beans的辅助类
概述
Javabean是一种Java类,
通过封装属性和方法成为具有某种功能或者处理某个业务的对象,简称bean。
具有以下特点:
- 可以实现代码的重复利用。
- 易编写、易维护、易使用。
- 可以在任何安装了Java运行环境的平台上的使用,而不需要重新编译。
JSP页面可以将数据的处理过程指派给一个或几个bean来完成,即JSP页面调用bean完成数据的处理,并将有关处理结果存放bean中.JSP页面可以使用Java程序片或某些JSP指令标记显示bean中的数据,
即JSP页面的主要工作是显示数据,不负责数据的逻辑业务处理
Javabean分为可视组件和非可视组件。
在JSP中主要使用非可视组件。对于非可视组件,我们不必去设计它的外观,主要关心它的属性和方法。
编写Javabean就是编写一个Java的类,所以只要会写类就能编写一个Javabean,这个类创建的一个对象称为一个Javabean,简称bean
编写JavaBean
为了能让使用这个bean的应用程序构建工具(比如JSP引擎)知道这个bean的属性和方法,只需在类的方法命名上遵守以下规则:
- 如果类的成员变量的名字是xxx,类中提供两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx.。
后缀是将成员变量名字的首字母大写的字符序列。 - 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用“is”代替上面的“get”和“set”。
- 类中声明的方法的访问属性都必须是public的。
- 类中需提供public、无参数的构造方法
package tom.jiafei;
public class Circle {
double radius;
public Circle() {
radius=1;
}
public double getRadius() {
return radius;
}
public void setRadius(double newRadius) {
radius=newRadius;
}
public double circleArea() {
return Math.PI*radius*radius;
}
public double circlLength() {
return 2.0*Math.PI*radius;
}
}
保存bean的字节码
在当前Web服务目录下建立子目录结构:\WEB-INF\classes,然后根据类的包名,在classes下再建立相应的子目录,比如类的包名为tom.jiafei,那么在classes下建立子目录结构:tom\jiafei
将创建bean的字节码文件,比如Circle.class,复制到“\WEB-INF\classes\tom\jiafei”中
创建与使用bean
使用bean
使用JSP动作标记:useBean
加载使用Bean
语法格式:<jsp:useBean id="bean的名字" class="创建beans的字节码" scope="bean有效范围"/>
或者
<jsp:useBean id= "bean的名字" class="创建beans的类" scope= "bean有效范围">
...
...
</jsp:useBean>
例如:<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
bean的加载原理
当JSP页面使用JSP需要使用一个bean时,JSP引擎将首先根据JSP动作标记给出的bean的id,以及scope,查找JSP引擎内置pageContent对象中是否含有这样的bean,如果这样的bean存在,JSP引擎就分配这样的bean给用户。
如果在pageContent中没有查找到JSP动作标记要求的bean,就根据class指定的字节码创建一个JSP动作标记要求的bean,并将所创建的bean添加到pageContent内置对象中。
bean的有效范围(生命周期)
scope取值范围给出了bean的存活时间(生命周期),即scope取值决定了JSP引擎分配给用户的bean的存活时间
- page
有效范围是当前页面.不同用户的scope取值是page的bean也是互不相同的. - request
bean的有效范围是request期间。不同用户的scope取值是request的bean也是互不相同的 - session
有效范围是用户的session(会话)期间。不同用户(即不同浏览器)的scope取值是session的bean是互不相同的(占有不同的内存空间) - application
bean的有效范围是application期间。JSP引擎为Web服务目录下所有的JSP页面分配一个共享的bean,不同用户的scope取值是application的bean也都是相同的一个.
举例
例子1中,负责创建bean的类是上述的Circle类,创建的bean的名字是circle, circle的scope取值是page。example4_1.jsp的效果如图4.3所示。
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body bgcolor=cyan><font size=3>
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
<%--通过上述JSP标记,用户获得了一个作用域是page,名字是circle的bean --%>
<P>圆的初始半径是:<%=circle.getRadius()%>
<% double newRadius =100;
circle.setRadius(newRadius); //修改半径
%>
<P>修改半径为<%= newRadius %>
<br><b>目前圆的半径是:<%=circle.getRadius()%>
<br><b>圆的周长是:<%=circle.circlLength()%>
<br><b>圆的面积是:<%=circle.circleArea()%>
</font></body></HTML>
例子2使用scope取值为session,id为girl的bean,创建该bean的类文件仍然是上述的Circle.class。
例子2的example4_2_a.jsp页面中,girl的半径radius的值是1(图4.4).
然后连接到example4_2_b.jsp页面,显示半径radius的值,然后将girl的半径radius的值更改为99(图4.5),那么以后再刷新example4_2_a.jsp或example4_2_b.jsp时看到的bean的radius的值就都是99了(图4.6)
example4_2_a.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body bgcolor=cyan><font size=3>
<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
<jsp:useBean id="girl" class="tom.jiafei.Circle" scope="session" />
<br>这里是example4_2_a.jsp页面
<br>圆的半径是: <%=girl.getRadius()%>
<a href="example4_2_b.jsp"><br>example4_2_b.jsp </a>
</font></body></HTML>
********************************************************************************
example4_2_b.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><body ><font size=3>
<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
<jsp:useBean id="girl" class="tom.jiafei.Circle" scope="session" />
<i><br>这里是example4_2_b.jsp页面
<br>当前圆的半径是: <%=girl.getRadius()%>
<% girl.setRadius(99);
//修改radius值
%>
<br>修改后的圆的半径是:<%=girl.getRadius()%></i>
<a href="example4_2_a.jsp"><BR>example4_2_a.jsp</a>
</font></body></HTML>
例子3中example4_3.jsp将bean的scope的值设为application。当第一个用户访问这个页面时,显示bean的radius的值,然后把radius的值修改为1000(图4.7)。当其他用户访问这个页面时,看到的radius的值都是1000(图4.8)。
<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=yellow>
<jsp:useBean id="boy" class="tom.jiafei.Circle" scope="application" />
圆的初始半径是:<%=boy.getRadius()%>
<% boy.setRadius(1000);
%>
<br><b>修改后的圆的半径是:<%=boy.getRadius()%>
</body></HTML>
获取和修改beans的属性
JSP页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法,
即对方法的名字的命名有特殊的要求,
而在程序片中直接用bean调用方法就不需要方法命名遵守getXxx和setXxx规则
getProperty动作标记
使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。
使用getProperty动作标记之前,必须使用useBean动作标记获得相应的bean。
<jsp:getProperty name="id" property="bean属性" />
或
<jsp:getProperty name=“id" property="bean属性"/>
......
</jsp:getProperty>
该指令相当于Java表达式:
<%= bean.getXxx() %>
setProperty动作标记
使用setProperty动作标记可以设置bean的属性值。使用这个标记之前,必须使用useBean标记得到一个相应的bean。
- 将bean属性的值设置为一个表达式的值或字符串
- 将bean属性的值设置为一个表达式的值的语法格式
<jsp:setProperty name=“id" property="bean的属性" value= "<%=expression%>"/>
- 将bean属性的值设置为一个字符串语法格式
<jsp:setProperty name="id" property="bean的属性" value=字符串/>
- 通过HTTP表单的参数的值来设置bean的相应属性的值
- 用HTTP表单的所有参数的值设置bean相对应的属性的值
<jsp:setProperty name= "id" property="*" />
- 用HTTP表单的某个参数的值设置bean的某个属性的值
<jsp:setProperty name= “bean的名字” property=“bean属性名” param= “表单中的参数名” />
Student.java
package tom.jiafei;
public class Student {
String name=null;
double height;
public String getName() {
return name;
}
public void setName(String newName){
name=newName;
}
public double getHeight() {
return height;
}
public void setHeight(double newHeight) {
height=newHeight;
}
}
举例1
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="zhang" class="tom.jiafei.Student" scope="request"/>
<HTML><body bgcolor=pink><font size=3>
<jsp:setProperty name="zhang" property="name" value="张三"/>
<b> 学生姓名:<jsp:getProperty name="zhang" property="name"/></b>
<jsp:setProperty name="zhang" property="height" value="<%=1.78%>"/>
<br><b> 学生身高:<jsp:getProperty name="zhang" property="height"/>米</b>
</font></body></HTML>
<%-- a--%>
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="iPhone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor=yellow><font size=3>
<form action="" Method="post" >
手机名称:<input type=text name="name">
<br>手机价格:<input type=text name="price">
<br><input type=submit value="提交给本页面">
</form>
<%-- 指向到b页面--%>
<form action="example4_5_b.jsp" Method="post" >
手机名称:<input type=text name="name">
<br>手机价格:<input type=text name="price">
<br><input type=submit value="提交给example4_5_b.jsp页面">
</form>
<%-- 设置set的值,再get设置的值--%>
<jsp:setProperty name="iPhone" property="name" param ="name" />
<jsp:setProperty name="iPhone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="iPhone" property="name"/>
<br><b>价格:<jsp:getProperty name="iPhone" property="price"/>
</font></body></HTML>
***************************************************************
<%-- b--%>
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="iPhone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor=cyan><font size=3>
<jsp:setProperty name="iPhone" property="name" param ="name" />
<jsp:setProperty name="iPhone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="iPhone" property="name"/>
<br><b>价格:<jsp:getProperty name="iPhone" property="price"/>
</font></body></HTML>
beans的辅助类
有时在写一个bean的时候,除了需要用import语句引入JDK平台提供的类,可能还需要其它自己编写的一些类。
那么只要将这些类和创建bean的类写在一个java源文件中即可,但必须将源文件编译后产生的全部字节码文件复制到相应的目录中
package tom.jiafei;
import java.io.*;
class FileExtendName implements FilenameFilter {
String str=null;
FileExtendName (String s) {
str="."+s;
}
public boolean accept(File dir,String name) {
return name.endsWith(str);
}
}
public class ListFile {
String extendsName=null;
String [] allFileName=null;
String dir=null;
public void setDir(String dir) {
this.dir =dir;
}
public String getDir() {
return dir;
}
public void setExtendsName(String s) {
extendsName=s;
}
public String getExtendsName() {
return extendsName;
}
public String [] getAllFileName() {
if(dir!=null) {
File mulu=new File(dir);
FileExtendName help=new FileExtendName(extendsName);
allFileName=mulu.list(help);
}
return allFileName;
}
}
<%@ page contentType="text/html;charset=gb2312" %>
<jsp:useBean id="file" class="tom.jiafei.ListFile" scope="request"/>
<HTML><body bgcolor=cyan><font size=2>
<form action="" Method="post">
输入目录名,例如:D:/2000<input type=text name="dir" size=15><br>
输入文件的扩展名,例如:java<input type=text name="extendsName" size=6>
<input type=submit value="提交">
</form>
<jsp:setProperty name="file" property="dir" param="dir"/>
<jsp:setProperty name="file" property="extendsName" param="extendsName"/>
<br><b>目录 <jsp:getProperty name="file" property="dir"/>中
扩展名是 <jsp:getProperty name="file" property="extendsName"/> 的文件有:
<% String [] fileName = file.getAllFileName();
if(fileName!=null) {
for(int i=0;i<fileName.length;i++) {
out.print("<br>"+fileName[i]);
}
}
%>
</font></body></HTML>