目 录
概述编写JavaBean保存bean的字节码创建与使用bean使用beanbean的加载原理bean的有效范围(生命周期)
获取和修改beans的属性getProperty动作标记setProperty动作标记
beans的辅助类
代码和PPT见github,感谢star
概述
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 语法格式:
...
...
例如:
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" %>
<%--通过上述JSP标记,用户获得了一个作用域是page,名字是circle的bean --%>
圆的初始半径是:<%=circle.getRadius()%>
<% double newRadius =100;
circle.setRadius(newRadius); //修改半径
%>
修改半径为<%= newRadius %>
目前圆的半径是:<%=circle.getRadius()%>
圆的周长是:<%=circle.circlLength()%>
圆的面积是:<%=circle.circleArea()%>
例子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" %>
<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
这里是example4_2_a.jsp页面
圆的半径是: <%=girl.getRadius()%>
********************************************************************************
example4_2_b.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%--通过JSP标记,用户获得一个作用域是session,id是girl的bean: --%>
这里是example4_2_b.jsp页面
当前圆的半径是: <%=girl.getRadius()%>
<% girl.setRadius(99);
//修改radius值
%>
修改后的圆的半径是:<%=girl.getRadius()%>
例子3中example4_3.jsp将bean的scope的值设为application。当第一个用户访问这个页面时,显示bean的radius的值,然后把radius的值修改为1000(图4.7)。当其他用户访问这个页面时,看到的radius的值都是1000(图4.8)。
<%@ page contentType="text/html;charset=gb2312" %>
圆的初始半径是:<%=boy.getRadius()%>
<% boy.setRadius(1000);
%>
修改后的圆的半径是:<%=boy.getRadius()%>
获取和修改beans的属性
JSP页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法,
即对方法的名字的命名有特殊的要求,
而在程序片中直接用bean调用方法就不需要方法命名遵守getXxx和setXxx规则
getProperty动作标记
使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。 使用getProperty动作标记之前,必须使用useBean动作标记获得相应的bean。
或
......
该指令相当于Java表达式: <%= bean.getXxx() %>
setProperty动作标记
使用setProperty动作标记可以设置bean的属性值。使用这个标记之前,必须使用useBean标记得到一个相应的bean。
将bean属性的值设置为一个表达式的值或字符串
将bean属性的值设置为一个表达式的值的语法格式
通过HTTP表单的参数的值来设置bean的相应属性的值
用HTTP表单的所有参数的值设置bean相对应的属性的值
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" %>
学生姓名:
学生身高:
<%-- a--%>
<%@ page contentType="text/html;charset=gb2312" %>
<%-- 指向到b页面--%>
<%-- 设置set的值,再get设置的值--%>
名称:
价格:
***************************************************************
<%-- b--%>
<%@ page contentType="text/html;charset=gb2312" %>
名称:
价格:
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" %>
目录
扩展名是
<% String [] fileName = file.getAllFileName();
if(fileName!=null) {
for(int i=0;i out.print(" } } %>
"+fileName[i]);