前言
本章导读
主要内容
编写和使用JavaBean
获取和修改bean的属性
bean的辅助类
JSP和bean结合的简单例子
难点
示例
5.1 编写和使用JavaBean
5.1.1 编写JavaBean
编写JavaBean就是编写一个Java的类。
在类的命名上需要遵守以下规则:
①:类中必须提供两个方法:
getXxx():用来获取属性xxx
setXxx():用来修改属性xxx
②类中定义方法的权限都必须是public
③类中必须有一个构造方法是public,无参数的。
以下为创造Bean的Java源文件。
CIrcle.java(负责创建bean)
保存类型为所有文件,编码选择为ANSI。
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 circleLength() {
return 2.0*Math.PI*radius;
}
}
5.1.2 保存bean的字节码
为了使JSP页面使用bean,Tomcat服务器必须使用相应的字节码文件创建一个对象。即创建一个bean、为了让Tomcat服务器能找到字节码文件,字节码文件必须保存在特定的目录中。
本章为ch5\WEB-INF\classes目录下 包名另外加,例如上面Circle的包名为tom\jiafei 则要创建到jiafei这个文件夹lim。
5.1.3 创建和使用bean
①使用bean
使用JSP动作标记useBean加载使用bean,语法格式是:
<jsp:useBean idd = "bean的名字"class="创建bean的类" scope = "bean有效范围"/>
或
<jsp:useBean idd = "bean的名字"class="创建bean的类" scope = "bean有效范围">
</jsp:useBean>
例如:
<jsp:useBean id = "circle" class = "tom.jiafei.Circle"scope="page">
②bean的加载原理
当JSP页面使用JSP动作标记useBean加载一个bean时,Tomcat服务器首先根据JSP动作标记useBean中id给出的bean名字以及scope给出的使用范围(bean生命周期),在Tomcat 服务器管理的pageContent内置对象中查找是否含有这样的bean(对象)。如果这样的bean(对象)存在,Tomcat服务器就复制这个bean(对象)给JSP页面,就是常说的Tomcat服务器分配这样的bean给JSP页面。如果在pageContent 中没有查找到JSP动作标记要求的bean,就根据class指定的类创建一个bean,并将所创建的bean添加到pageContent中。通过Tomcat服务器创建bean的过程可以看出,首次创建一个新的bean 需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的bean时,Tomcat 服务器直接将pageContent中已经有的bean分配给JSP页面,从而提高JSP页面bean的使用效率。
注:字节码文件修改后,需要重启Tomcat服务器才能使用新的字节码文件。
③bean的有效范围和生命周期
scope的取值范围给出了bean的生命周期(存活时间),即scope取值决定了Tomcat服务器分配给用户的bean的有效范围和生命周期。
page bean:
有效范围是用户当前访问的页面,存活时间直到当前页面执行完毕。
session bean:
有效范围是用户访问的Web服务目录下的各个页面,存活时间是用户的会话期间,直到用户的会话消失对象达到了最大生存时间或者用户关闭了自己的浏览器以及服务器。
request bean:
有效范围是用户请求的当前页面,存活时间是从用户的请求产生到请求结束。
application bean:
有效范围是当前Web服务目录下的各个页面,存活时间直到Tomcat服务器关闭。
以下举一例子
example5_1.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<HTML><body bgcolor = #ffccff>
<p id = "textStyle">
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
<%--通过useBean标记,获得有效期限是page,名字是circle的bean --%>
圆的初始半径是:<%=circle.getRadius()%>
<% double newRadius =100;
circle.setRadius(newRadius); //修改半径。
%>
<br>修改半径为<%= newRadius %>
<br><b>圆的半径是:<%=circle.getRadius()%>
<br><b>圆的周长是:<%=circle.circleLength()%>
<br><b>圆的面积是:<%=circle.circleArea()%>
</p></body></HTML>
5.2 获取和修改bean的属性
使用useBean 动作标记获得一个bean后,在Java 程序片或表达式中bean就可以调用方法产生行为,如前面的例5_4所示,这种情况下,不要求创建bean的类遵守setXxx和getXxx等规则(见5.1.1节)。获取或修改bean的属性还可以使用JSP动作标记getProperty、setProperty,这种情况下,要求创建bean的类遵守setXxx和 getXxx等规则,当JSP 页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean有相应的getXxx和setXxx方法,即对方法名字的命名有特殊的要求。下面讲述怎样使用JSP的动作标记 getProperty、setProperty去获取和修改 bean的属性
5.2.1 getProperty动作标记
使用getproperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。使用getProperty动作标记之前,必须使用useBean动作标记获得相应的bean。
<jsp:getProperty name = "bean 的id" property="bean的属性"/>
5.2.2 setProperty动作标记
setPropertyd动作标记可以设置bean的属性值。使用这个标记之前,必须使用useBean标记得到一个相应的bean。
(1):将bean属性值设置为一个表达式的值或字符系列。
<jsp:setProperty name ="bean 的id" property=“bean的属性”
value = "<% = expression%>"/>
<jsp:setProperty name ="bean 的id" property=“bean的属性”
value = "字符系列"/>
value给出的值的类型要和bean的属性达到类型一致
(2):通过HTTP表单的参数值来设置bean的相应属性值。
①用form表单的所有参数值设置bean相应属性值。
<jsp:setProperty name = "bean 的id的名字"property=" * "/>
②用form表单的某个参数的值设置bean的某个属性值
<jsp:setProperty name = "bean 的名字"property=" 属性名 " param="参数名" />
以下举一个例子
Goods.java
package tom.jiafei;
public class Goods {
String name="无名";
double price=0;
public String getName() {
return name;
}
public void setName(String newName){
name = newName;
}
public double getPrice() {
return price;
}
public void setPrice(double newPrice) {
price = newPrice;
}
}
example5_4_a.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="phone" class="tom.jiafei.Goods" scope="request"/>
<HTML><body bgcolor = #ffccff>
<style>
#textStyle{
font-family:宋体;font-size:20;color:blue
}
</style>
<p id = "textStyle">
<form action="" Method="post" >
手机名称:<input type=text id=textStyle name="name">
<br>手机价格:<input type=text id=textStyle name="price"/>
<br><input type=submit id=textStyle value="提交给本页面"/>
</form>
<form action="example5_4_b.jsp" Method="post" >
手机名称:<input type= text name="name" id=textStyle>
<br>手机价格:<input type=text name="price" id=textStyle>
<br><input type=submit id=textStyle value="提交给example5_4_b.jsp页面">
</form>
<jsp:setProperty name="phone" property="name" param ="name" />
<jsp:setProperty name="phone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="phone" property="name"/>
<br><b>名称:<%= phone.getName()%><br>
<br><b>价格:<jsp:getProperty name="phone" property="price"/>
<br><b>价格:<%=phone.getPrice()%>
</p></body></HTML>
example5_4_b.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="phone" class="tom.jiafei.Goods" scope="page"/>
<HTML><body bgcolor= cyan>
<p style="font-family:黑体;font-size:20;color:red">
<jsp:setProperty name="phone" property="name" param ="name" />
<jsp:setProperty name="phone" property="price" param ="price"/>
<br><b>名称:<jsp:getProperty name="phone" property="name"/>
<br><b>名称:<%= phone.getName()%><br>
<br><b>价格:<jsp:getProperty name="phone" property="price"/>
<br><b>价格:<%=phone.getPrice()%>
</p></body></HTML>
5.3 bean的辅助类
在写一个创建bean的类时,除了需要用import语句引入JDK提供的类,可能还需要自己编写一些其他的类。只要将这些类的包名和bean类的包名一致即可(也可以和创建bean的类写在一个Java源文件中)。
5.4 JSP与bean结合的简单例子
JSP页面中调用bean可以将数据的处理从页面中分离出来,实现代码复用,以便更有效地维护一个Web应用。本节将结合一些实际问题,进一步熟悉掌握bean的使用方法。在本节中,创建bean类的包名都是red.star,使用的Web服务目录仍然是ch5,因此,需要在ch5目录下建立目录结构:ch5\WEB-INF\classes\red\star,将创建bean的字节码文件都保存在该目录中。为了调试程序方便,可以直接按照创建bean类的包名将相应的Java源文件保存在Web服务目录的相应目录中,例如将Java 源文件保存在Web服务目录ch5 的WEB-INF\classes\red\star 目录中,然后使用MS-DOS命令行进人\red\star 的父目录classes,按如下格式编译Java源文件:
classes> javac red\star\源文件名
以下写两个bean
分别为三角形bean和四则运算bean
首先是三角形bean
Triangle,java(负责创建 request bean)
package red.star;
public class Triangle {
double sideA=-1,sideB=-1,sideC=-1;
String area;
boolean isTriangle;
public void setSideA(double a) {
sideA=a;
}
public double getSideA() {
return sideA;
}
public void setSideB(double b) {
sideB=b;
}
public double getSideB() {
return sideB;
}
public void setSideC(double c) {
sideC=c;
}
public double getSideC() {
return sideC;
}
public String getArea() {
double p=(sideA+sideB+sideC)/2.0;
if(isTriangle){
double result= Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));
area = String.format("%.2f",result);//保留2位小数。
}
return area;
}
public boolean getIsTriangle(){
if(sideA<sideB+sideC&&sideB<sideA+sideC&&sideC<sideA+sideB)
isTriangle=true;
else
isTriangle=false;
return isTriangle;
}
}
JSP页面
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="triangle" class="red.star.Triangle" scope="request"/>
<HTML><body id = textStyle bgcolor=#ffccff>
<form action="" method="post" >
输入三角形三边:
边A:<input type=text name="sideA" id = textStyle value=0 size=5/>
边B:<input type=text name="sideB" id = textStyle value=0 size=5/>
边C:<input type=text name="sideC" id = textStyle value=0 size=5/>
<br><input type=submit id = textStyle value="提交"/>
</form>
<jsp:setProperty name="triangle" property="*"/>
三角形的三边是:
<jsp:getProperty name="triangle" property="sideA"/>,
<jsp:getProperty name="triangle" property="sideB"/>,
<jsp:getProperty name="triangle" property="sideC"/>.
<br><b>这三个边能构成一个三角形吗?<jsp:getProperty name="triangle" property="isTriangle"/>
<br>面积是:<jsp:getProperty name="triangle" property="area"/></b>
</body></HTML>
运行结果
四则运算bean
ComputerBean.java
package red.star;
public class ComputerBean {
double numberOne,numberTwo,result;
String operator="+";
public void setNumberOne(double n) {
numberOne=n;
}
public double getNumberOne() {
return numberOne;
}
public void setNumberTwo(double n) {
numberTwo=n;
}
public double getNumberTwo() {
return numberTwo;
}
public void setOperator(String s) {
operator=s.trim();
}
public String getOperator() {
return operator;
}
public double getResult() {
if(operator.equals("+"))
result=numberOne+numberTwo;
else if(operator.equals("-"))
result=numberOne-numberTwo;
else if(operator.equals("*"))
result=numberOne*numberTwo;
else if(operator.equals("/"))
result=numberOne/numberTwo;
return result;
}
}
JSP页面
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<% request.setCharacterEncoding("utf-8");
%>
<jsp:useBean id="computer" class="red.star.ComputerBean" scope="session"/>
<HTML><body id = textStyle bgcolor=#ffccff>
<jsp:setProperty name="computer" property="*"/>
<form action="" method=post >
<input type=text name="numberOne" id = textStyle size=6/>
<select name="operator" id = textStyle >
<option value="+" id = textStyle>+
<option value="-" id = textStyle>-
<option value="*" id = textStyle>*
<option value="/" id = textStyle>/
</select>
<input type=text name="numberTwo" id = textStyle size=6/>
<br> <input type="submit" value="提交" id = textStyle "/>
</form>
<b>
<jsp:getProperty name="computer" property="numberOne"/>
<jsp:getProperty name="computer" property="operator"/>
<jsp:getProperty name="computer" property="numberTwo"/> =
<jsp:getProperty name="computer" property="result"/></b>
</body></HTML>
运行结果
总结
JavaBean是一个可重复使用的软件组件,实际上JavaBean就是一种Java类,通过封装属性和方法称为具有某种功能或者处理某个业务的对象,简称为bean。
JSP页面可以将数据的处理过程指派给一个或者几个bean来完成,即JSP页面调用这些bean完成数据的处理,并将有关处理结果存放到bean中,然后JSP页面负责显示bean中的数据。
总得来说bean是一个应用非常广泛的软件组织。