一、 javabean 是什么?
Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类,只有有默然构造方法,只有get,set的方法的java类的对象。
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 属性。
JavaBean可分为两种:一种是有用户界面(UI,User Interface)的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。
二、Javabean含义?
事实上有三层含义。首先,JavaBean是一种规范,一种在Java(包括JSP)中使用可重复使用的Java组件的技术规范。其次,JavaBean是一个Java的类,一般来说,这样的Java类将对应于一个独立的.java文件,在绝大多数情况下,这应该是一个public类型的类。最后,当JavaBean这样的一个Java类在我们的具体的Java程序中被实例之后,我们有时也会将这样的一个JavaBean的实例称之为JavaBean。
最初,JavaBean的目的是为了将可以重复使用的软件代码打包标准。特别是用于帮助厂家开发在综合开发环境(IDE)下使用的java软件部件。这些包括如Grid控件,用户可以将该部件拖放到开发环境中。从此,JavaBean就可以扩展为一个java web 应用的标准部件,并且JavaBean部件框架已经扩展为企业版的 Bean(EJB)。
三、javabean特性
易于维护、使用、编写。
可实现代码的重用性。
可移植性强,但仅限于Java工作平台。
便于传输,不限于本地还是网络。
可以以其他部件的模式进行工作。
对于有过其他语言编程经验的读者,可以将其看作类似微软的ActiveX的编程组件。但是区别在于JavaBean是跨平台的,而ActiveX组件则仅局限于Windows系统。总之,JavaBean比较适合于那些需要跨平台的、并具有可视化操作和定制特性的软件组件。
四、Javabean的应用原因
程序中往往有重复使用的段落,JavaBean就是为了能够重复使用而设计的程序段落,而且这些段落并不只服务于某一个程序,而且每个JavaBean都具有特定功能,当需要这个功能的时候就可以调用相应的JavaBean。从这个意义上来讲,JavaBean大大简化了程序的设计过程,也方便了其他程序的重复使用。
JavaBean传统应用于可视化领域,如AWT(窗口工具集)下的应用。而现在,JavaBean更多地应用于非可视化领域,同时,JavaBean在服务器端的应用也表现出强大的优势。非可视化的JavaBean可以很好地实现业务逻辑、控制逻辑和显示页面的分离,现在多用于后台处理,使得系统具有更好的健壮性和灵活性。JSP + JavaBean和JSP + JavaBean + Servlet成为当前开发Web应用的主流模式。
五、JSP中Javabean的实质
一个引入JavaBeans的语句,其结构应该是,在这当中,我们必须对三个方面的内容进行定义。首先是一个id,这将对应于一个类的实例,如果这个实例已经存在,将直接引用这个实例;如果这个实例尚未存在,将通过我们在class中的定义从这个class中进行示例。这也就是我们要定义的第二个内容。最后,我们还应该在scope中定义id这个实例存在的范围,事实上这定义了这个实例所绑定的区域及其有效范围。
JavaBean 的范围 Scope 是一个具有生命时间的变量。JavaBean的范围在标志中右边进行表示。将产生一个JavaBean的快捷参考。说明:jsp服务器引擎将剥离
存在下面四种范围: 页面page、 请求request、 对话session、 应用application。
对话范围的JavaBean :主要应用于跨多个页面和时间段: 例如填充 用户信息。 添加信息并且接受回馈,保存用户最近执行页面的轨迹。对话范围JavaBean保留一些和用户对话 ID 相关的信息。这些信息来自临时的对话cookie,并在当用户关闭浏览器时,这个cookie将从客户端和服务器删除。
页面和请求范围的JavaBean:有时类似表单的bean , 这是因为 他们大都用于处理表单。表单需要很长的时间来处理用户的输入,通常情况下用于页面接受HTTP/POST或者GET请求。另外页面和请求范围的bean可以用于减少大型站点服务器上的负载,如果使用对话bean,耽搁的处理就可能会消耗掉很多资源。
应用范围JavaBean:通常应用于服务器的部件,例如 JDBC 连接池、应用监视、用户计数和其他参与用户行为的类。
在JSP中调用JavaBean有三个标准的标签,那就是, ,以及。
a、标签 :可以定义一个具有一定生存范围以及一个唯一id的JavaBean的实例,这样JavaServer Pages通过id来识别JavaBean,也可以通过id.method类似的语句来操作JavaBean。 在执行过程中,首先会尝试寻找已经存在的具有相同id和scope值的JavaBean实例,如果没有就会自动创建一个新的实例。其具体语法如下
body
其中,typeSpec定义如下
typeSpec ::=class=“className”
| class=“className” type=“typeName”
| type=“typeName” class=“className”
| beanName=“beanName” type=“typeName”
| type=“typeName” beanName=“beanName”
| type=“typeName”
下面的表格是标签中相关属性的含义:
id
id属性是JavaBean对象的唯一标志,代表了一个JavaBean对象的实例。它具有特定的存在范围(page|request|session|application)。在JavaServer Pages中通过id来识别JavaBean。
Scope
Scope属性代表了Javabean对象的生存时间,可以是page, request, session, 和 application中的一种。
Class
代表了JavaBean对象的class名字,特别注意大小写要完全一致。
Type
Type属性指定了脚本变量定义的类型,默认为脚本变量定义和class中的属性一致,一般我们都采用默认值
b、标签:它主要用于设置bean的属性值。JavaServer Pages中调用的语法如下:
其中,name属性代表了已经存在的并且具有一定生存范围(scope)的JavaBean实例。last_syntax代表的语法如下:
property=“*” |
property=“propertyName” |
property=“propertyName” param=“parameterName” |
property=“propertyName” value=“propertyValue”
下面是标签的基本属性以及含义 :
Name
Name代表通过 标签定义的JavaBean对象实例。
Property
代表了你想设置值的属性property名字。如果使用property=”*”,程序就会反复的查找当前的ServletRequest所有参数,并且匹配JavaBean中相同名字的属性property,并通过JavaBean中属性的set方法赋值value给这个属性。如果value属性为空,则不会修改Javabean中的属性值。
Param
Param属性代表了页面请求的参数名字,标签不能同时使用param和value。
Value
Value属性代表了赋给Bean的属性property的具体值。
c、标签 :它可以得到JavaBean实例的属性值,并将他们转换为 java.lang.String, 最后放置在隐含的Out对象中. JavaBean的实例必须在前面定义. 标签的语法如下:
下面是标签的基本属性以及含义
Name
Name属性代表了想要获得属性值的Bean的实例,Bean实例必须在前面用标签定义.
Property
Property属性代表了想要获得值的那个property的名字。
六、Javabean的三大构件
Java bean:编程语言java中的术语,行业内通常称为java豆,带点美哩口味,飘零着咖啡的味道,在计算机编程中代表java构件(EJB的构件),通常有Session bean,Entity bean,MessageDrivenBean三大类。
Session bean:会话构件,是短暂的对象,运行在服务器上,并执行一些应用逻辑处理,它由客户端应用程序建立,其数据需要自己来管理。分为无状态和有状态两种。
Entity bean:实体构件,是持久对象,可以被其他对象调用。在建立时指定一个唯一标示的标识,并允许客户程序,根据实体bean标识来定位beans实例。多个实体可以并发访问实体bean,事物间的协调由容器来完成。
MessageDriven Bean:消息构件,是专门用来处理JMS(Java Message System)消息的规范(EIB2.0)。JMS是一种与厂商无关的API,用来访问消息收发系统,并提供了与厂商无关的访问方法,以此来访问消息收发服务。JMS客户机可以用来发送消息而不必等待回应。
七、Javabean编程开发
在程序设计的过程中,JavaBean不是独立的。为了能够更好地封装事务逻辑、数据库操作而便于实现业务逻辑和前台程序的分离,操作的过程往往是先开发需要的JavaBean,再在适当的时候进行调用。但一个完整有效的JavaBean必然会包含一个属性,伴随若干个get/set(只读/只写)函数的变量来设计和运行的。JavaBean作为一个特殊的类,具有自己独有的特性。应该注意以下4个方面。
1. 如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx.。
2. 对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用"is"代替上面的"get"和"set"。
3. 类中方法的访问属性都必须是public的。
4. 类中如果有构造方法,那么这个构造方法也是public的并且是无参数的。
八、一个简单的Javabean与JSP结合
JavaBean--counter.java文件,counter.jsp文件, counter1.jsp文件其中,counter.java主要用来进行计数器的计数操作,counter.jsp和counter1.jsp文件主要用来显示网页的计数。
counter.java:
View Code
1 packagecount;2 /*** Title: test * Description: counter Bean *@version1.0*/
3 public classcounter {4 //初始化JavaBean的成员变量
5 int count = 0;6 //Class构造器
7 publiccounter() { }8 //属性Count的Get方法
9 public intgetCount(){10 //计数操作,每一次请求都进行计数器加一
11 count++;12 return this.count;13 }14 //属性Count的Set方法
15 public void setCount(intcount)16 {17 this.count =count;18 }19 }
counter.jsp:
View Code
1
2
3
4
5
6
counter7
8
9
10 JBuilder Generated JSP11
12
13
14
15 //显示当前的属性count的值,也就是计数器的值,这里我们使用out.println方法,下面的counter1.jsp将使用另一种方法16 out.println("The Counter is :" +bean0.getCount()+ "
");17 %>
18
19
counter1.jsp:
View Code
1
2
3
4
5
6
counter7
8
9
10 JBuilder Generated JSP11
12
13
14
15 The Counter is :16
17
18
首先在Jsp页面中要声明并初始化JavaBean,这个JavaBean有一个唯一的id标志,还有一个生存范围scope(设置为application是为了实现多个用户共享一个计数器的功能,如果要实现单个用户的计数功能,可以修改scope为session),最后还要制定JavaBean的class来源count.counter:
接着我们就可以使用JavaBean提供的public方法或者直接使用标签来得到JavaBean中属性的值: out.println("The Counter is : " + bean0.getCount() + "
");
或者
OK,现在运行一下程序看看,然后多刷新几次,注意看计数器的变化。
八、一个用户注册的javabean实例
建立一个数据库demodb,其字段如下面所示:
username VARCHAR2(20) 用户名
password VARCHAR2(20) 密码
email VARCHAR2(30) Email地址
homepage VARCHAR2(50) 主页
signs VARCHAR2(200) 签名
regtime DATE 注册时间
接着建立几个JavaBeans和JavaServer Pages文件:
db.java文件(封装数据库连接及一些底层操作)
adduser.java文件(进行用户数据的读取以及添加操作)
newuser.jsp文件(用户新增页面,用于输入用户注册信息)
donewuser.jsp文件(进行用户注册信息添加)
listuser.jsp文件(所有的注册用户信息列表)
1.db.java文件:这个JavaBean封装数据库连接及一些底层操作,派生出的类可以直接调用这些方法,另外提供了一个toChinese方法,主要用来进行中文数据的处理。
View Code
1 //声明类库文件
2 packagelyf;3
4 import oracle.jdbc.driver.*;5 import java.net.*;6 import java.sql.*;7 import java.lang.*;8 import java.io.*;9 import java.util.*;10
11 public classdb {12 //成员变量初始化
13 Connection conn = null; //数据库连接
14 ResultSet rs = null; //记录集
15 String Username = ""; //用户名
16 String Password = ""; //密码
17 String Email = ""; //email
18 String Homepage = ""; //主页
19 String Signs = ""; //签名20
21 //db的构建器
22 publicdb() {23 try{24 //注册数据库驱动程序为Oracle驱动
25 Class.forName("oracle.jdbc.driver.OracleDriver");26 } catch(java.lang.ClassNotFoundException e) {27 //这样写是为了方便调试程序,出错打印mydb()就知道在什么地方出错了
28 System.err.println("mydb(): " +e.getMessage());29 }30 }31
32 //executeQuery方法用于进行记录的查询操作33 //入口参数为sql语句,返回ResultSet对象
34
35 publicResultSet executeQuery(String sql) {36 rs = null;37 try{38 //建立数据库连接,使用Oracle的一种thin连接方式,localhost为主机名字,demodb为数据库,后面的两个39 //demo为用户名和密码
40 conn =DriverManager.getConnection(41 "jdbc:oracle:thin:@localhost:1521:orcl", "SYS as SYSDBA", "admin");42 Statement stmt =conn.createStatement();43 //执行数据库查询操作
44 rs =stmt.executeQuery(sql);45 } catch(SQLException ex) {46 System.err.println("db.executeQuery: " +ex.getMessage());47 //ex.printStackTrace();
48 }49 returnrs;50 }51
52 //executeUpdate方法用于进行add或者update记录的操作53
54 //入口参数为sql语句,成功返回true,否则为false
55 public booleanexecuteUpdate(String sql) {56 boolean bupdate = false;57 rs = null;58 try{59 //建立数据库连接,其它参数说明同上面的一样
60 conn =DriverManager.getConnection(61 "jdbc:oracle:thin:@localhost:1521:orcl", "SYS as SYSDBA", "admin");62 Statement stmt =conn.createStatement();63 int rowCount =stmt.executeUpdate(sql);64 //如果不成功,bupdate就会返回0
65 if (rowCount != 0)66 bupdate = true;67 } catch(SQLException ex) {68 //打印出错信息
69 System.err.println("db.executeUpdate: " +ex.getMessage());70 //ex.printStackTrace();
71 }72 returnbupdate;73 }74
75 //toChinese方法用于将一个字符串进行中文处理76 //否则将会是???这样的字符串
77
78 public staticString toChinese(String strvalue) {79 try{80 if (strvalue == null) {81 return null;82 } else{83 strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK");84 returnstrvalue;85 }86 } catch(Exception e) {87 return null;88 }89 }90
91
92 //testing
93 public static voidmain(String[] args){94 db a = newdb();95 a.executeQuery("");96 }97
98 }
2.adduser.java文件:主要进行用户数据的读取以及添加操作,从db派生出来,addNewUser方法用来进行用户数据的添加,checkUser()方法用来检查用户名是否重复,另外还有一些set/get方法用来对属性进行处理,dousernew.jsp文件将进行调用。
View Code
1 packagelyf;2
3 //导入java类库
4 import java.sql.*;5 import java.lang.*;6 import oracle.jdbc.driver.*;7
8 //adduser由db派生出来,拥有db的成员变量和方法
9 public class adduser extendsdb {10 //构建器
11 public booleanaddNewUser() {12 boolean boadduser = false;13 try{14 //进行用户注册的记录添加操作,生成sql语句
15 String sSql = newString(16 "insert into demodb(regtime,username,password,email,homepage,signs)");17 sSql=sSql+ " values(SYSDATE,'"+Username+"','"+Password+"','"+Email+"','"+Homepage+"','"+Signs+"')";18 //一种调试的方法,可以打印出sql语句,以便于查看错误
19 System.out.println(sSql);20 //调用父类的executeUpdate方法,并根据成功以否来设置返回值
21 if (super.executeUpdate(sSql))22 boadduser = true;23 } catch(Exception ex) {24 //出错处理
25 System.err.println("adduser.addNewUser: " +ex.getMessage());26 } finally{27 //无论是否出错,都要返回值
28 returnboadduser;29 }30 }31
32 publicString showParamer(){33 return this.Username+this.Password + this.Homepage;34 }35
36 //checkUser()方法用来检查用户名是否重复37 //如果重复返回一个false
38 public booleancheckUser() {39 boolean boadduser = false;40 try{41 //构建sql查询语句
42 String sSql = "select * from demodb where username='" +Username43 + "'";44 //调用父类的executeQuery方法
45 if ((super.executeQuery(sSql)).next()) {46 //查询出来的记录集为空
47 boadduser = false;48 } else{49 boadduser = true;50 }51 } catch(Exception ex) {52 //出错处理
53 System.err.println("adduser.addNewUser: " +ex.getMessage());54 } finally{55 //返回值
56 returnboadduser;57 }58 }59
60 //属性的set/get方法,同请求的参数一致61 //属性用户名Username的get/set方法
62 publicString getUsername() {63 returnUsername;64 }65
66 public voidsetUsername(String newUsername) {67 //用户名有可能是中文,需要进行转换
68 Username =db.toChinese(newUsername);69 }70
71 //属性密码Password的get/set方法
72 publicString getPassword() {73 returnPassword;74 }75
76 public voidsetPassword(String newPassword) {77 Password =newPassword;78 }79
80 //属性Email的get/set方法
81 publicString getEmail() {82 returnEmail;83 }84
85 public voidsetEmail(String newEmail) {86 Email =newEmail;87 }88
89 //属性主页Homepage的get/set方法
90 publicString getHomepage() {91 returnHomepage;92 }93
94 public voidsetHomepage(String newHomepage) {95 Homepage =newHomepage;96 }97
98 //属性主页Signs的get/set方法
99 publicString getSigns() {100 returnSigns;101 }102
103 public voidsetSigns(String newSigns) {104 //签名有可能是中文,需要进行转换
105 Signs =db.toChinese(newSigns);106 }107
108 }
3.newuser.jsp文件:用户注册页面,有用户名、密码、主页、Email、个人签名等信息,主要用于提供用户输入注册信息,提交Action后的处理页面为donewuse.jsp文件,所有参数将会传递到donewuser.jsp文件进行处理。文件开头< %@ page contentType="text/html;charset=gb2312"%>语句表明这个页面使用gb2312中文字符集,如果不声明的的话在中文显示上就出现乱码。< % response.setHeader("Expires","0"); %>语句是为了让页面能够自动刷新,这句话不要也没有太大影响。
View Code
1
2
3
4
5
6
7
8
新用户注册9
10
11
12 新个人用户注册
13
14
15
16
17 borderColorLight="#000000"cellspacing="0">
18
19
20 用户名:21
22
23 tabindex="2">*24
25
26
27 输入密码:28
29
30 *31
32
33
34
35 校验密码:36
37
38 *
39
40
41
42
43
44 E-mail45
46
47 *
48
49
50
51
52 主页地址:53
54
55
56
57
58
59
60 介绍自己: (介绍自己,不能超过120字)
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 tabindex="10">
76
77
78
79
80
81
82