1.什么是JavaBean
JavaBean是基于Java的组件模型,由属性、方法和事件3部分组成。在该模型中,JavaBean可以修改或与其他组件结合以生成新组件或完整的程序。它又是一种Java类,通过封装成为具有某种功能或者处理某个业务的对象。因此,可以通过嵌在JSP页面内的Java代码访问Bean及其属性。
为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。在业内众所周知,属性名称符合的这种模式,其他Java类可以通过自身机制发现和操作这些JavaBean属性。
2.JavaBean的特点
按照Sun公司的定义,JavaBean是一个可以重复使用的软件组件。实际上JavaBean是一种Java类,通过封装属性和方法成为一种具有某种功能或者处理某个业务的对象,简称bean。由于JavaBean是基于Java语言的,因此JavaBean不依赖平台,且具有以下特点。
可以实现代码的重复利用
易编写、易维护、易使用
可以在任何安装了Java运行环境的平台上使用,而不需要重新编译。
编写JavaBean就是编写一个Java类,所以您只要会写类就能编写一个bean,这个类创建的一个对象称作一个bean。为了能让这个bean的应用构建工具(比如JSP引擎)知道这个bean的属性和方法,需要在类的方法命名上遵循以下规则。
如果类的成员变量的名字是person,那么为了更改或获取成员变量的值,即更改或获取属性,在类中可以使用两种方法:getPerson(),用来获取属性person;setPerson(),用来修改属性person。
对于boolean类型的成员变量,即布尔逻辑类型的属性,允许使用is代替上面的get和set。
类中方法的访问属性都必须是public的。
类中如果有构造方法的话,那么这个构造方法必须是public的并且是无参数的。
3.JavaB的属性
JavaBean的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性的概念是一个概念,在程序中的具体体现就是类中的变量。属性分为四类:即单值、索引、关联和约束属性。
1.单值属性
单值属性是最普通的属性类型,该类属性只有一个单一的数据值,该数据值的数据类型可以是Java中的任意数据类型,包括类的和接口等类型。
定义了属性,还需要定义对应的访问方法,一般每个单值属性都伴随一对get/set方法。属性名与该属性相关的get/set方法名对应。例如有一个dog的属性,则会有setDog和getDog方法。
另外,布尔属性是一种特殊的单值属性,它只有两个允许值:true和false,如果有一个名为dog的布尔属性,则可以通过isDog方法访问。
2.索引属性
索引属性是指JavaBean中数组的成员变量。使用与该属性对应的set/get方法可以得到数组的值。索引属性通过对应的访问方法设置或取得该属性中某个元素的值,也可以一次设置或取得整个属性的值。如果需要定义一批同类型的属性,使用单值属性就会显得非常烦琐,为解决此问题,JavaBean中提供了索引属性。
3.关联属性
关联属性是指当该种属性的值发生变化时,要通知其他的对象。每次属性值改变时,这种属性就触发一个PropertyChange事件。事件中封装了属性名、属性的原值和属性变化后的新值。这种事件传递到其他的Beans,至于接收事件的Beans应做什么动作,由其自己定义。
4.约束属性
JavaBean的属性如果改变时,相关的外部类对象首先要检查这个属性改变的合理性再决定是否接受这种改变,这样的Bean属性叫约束属性。当约束属性的改变被拒绝时,改变约束属性的方法产生一个约束属性改变异常,通过这个异常处理,JavaBean约束属性还原回来原来的值,并为这个还原操作发送一个新的属性修改通知。
约束属性的改变可能会被拒绝,因此它的set方法(例如setDog( ))与一般其他JavaBean属性的setDog( )有所不同。约束属性方法如下:
public void setDog(dogType newDog) throws PropertyVetoException
4.构造方法
在JavaBean中的函数和过程统称为方法,通过方法来改变和获取上面介绍的各种属性值。方法可以分为构造方法、访问方法和普通方法等。
1.构造方法
JavaBean的构造方法就是对JavaBean的属性及方法进行初始化,即对所定义的属性及方法设一个初始值,构造方法名要和JavaBean的类名相同。比如:
public class TimeShow {
//定义属性
private int hour;
private int minute;
//构造方法,对属性进行初始化操作,其名字应与bean的名字相同
public TimeShow () {
Date now = new Date ();
hour = now.getHours ();
minutes = now.getMinutes ();
}
}
2.访问方法
访问方法就是对组件中定义的属性的访问,包括读和写两种访问方式。在定义了Bean的属性,并通过构造的方法将其初始化后,要让其他程序访问Bean的这些属性,就必须为其创建访问方法。
读就是一种用于取出属性的取值函数,即getter;而写则是一种用于设置Bean属性的赋值函数,即setter。比如:
public void setPropertyName(PropertyType value); //给属性赋值,即写方法
publiv PropertyTypep getPropertyName (); //读取属性,即读方法
3.普通方法
除了对属性的访问方法外,还可以在Bean创建一般方法来实现对函数的调用,只要将Bean中的一般方法定义成公有的方法,就可以供其他程序调用。比如:
package jsp..example.mybean;
public class Multiple {
public int Multi (int j) {
int x = 1;
for (int i = 1; i <= j; ++i)
{x = x * i;}
return x;
}
}
下面介绍一下如何在JSP中使用JavaBean
编写一个JavaBean类来计算圆的周长和面积:
1.新建一个CircleBean类来计算圆的周长和半径。代码如下:
package com.ch4;
public class CircleBean {
private int radius =1;
public CircleBean() {
}
public int getRadius() {
return radius;
}
public void setRadius(int rRadius) {
radius = rRadius;
}
public double circleLength() {
return Math.PI*radius*2.0;
}
public double circleArea() {
return Math.PI*radius*radius;
}
}
2.新建一个r_input.jsp文件,用来输入半径,并将半径提交到area_output.jsp。代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.
getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'r_input.jsp' 计算圆的面积</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is My Page!">
</head>
<body>
<center>
<form id="forml" name="forml" method="post" action="area_output.jsp">
请输入圆的半径:
<input name="radius" type="text" id="radius" /><br>
<input type="submit" name="submit" value="开始计算" />
</form>
</center>
</body>
</html>
3.新建一个输出半径、周长和面积的area_output.jsp,利用JavaBean把得到的r赋值给半径,从而得到周长和面积。代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath %>">
<title>My JSP 'area_output.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keywords1, keywords2, keywords3">
<meta http-equiv="pragma" content="no-cache">
<!-- link rel="stylesheet" type="text/css" href="styles.css" -->
</head>
<body>
<jsp:useBean id="circleBean" scope="session" class="com.ch4.CircleBean" />
<center>
<%
int radius=Integer.parseInt(request.getParameter("radius"));
out.println("圆的半径是:" + circleBean.getRadius( ) );
out.println("圆的周长是:" + circleBean.circleLength( ) );
out.println("圆的面积是:" + circleBean.circleArea( ) );
%>
</center>
</body>
</html>
项目的目录是这样的:
最后我们把项目用tomcat跑起来,在浏览器中输入http://localhost:8081/HelloWorld/r_input.jsp。默认的端口号为8080,这里我把8080改为了8081。
输入半径为1,显示结果就从r_input.jsp跳转到area_output.jsp中。