j2ee 引入java类_J2EE学而时习之——JavaBean

一、 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:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView 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:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

1

2

3

4

5

6

counter

7

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:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView Code

1

2

3

4

5

6

counter

7

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方法,主要用来进行中文数据的处理。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView 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文件将进行调用。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView 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"); %>语句是为了让页面能够自动刷新,这句话不要也没有太大影响。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.pngView 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值