文章目录
前言
主要内容:编写和使用Javabean、获取和修改bean的属性、bean的辅助类、JSP与bean结合的简单例子。
一、编写和使用Javabean
1、编写JavaBean
编写Javabean就是编写一个Java的类,所以只要会写类就能编写一个JavaBean。这个类创建的一个对象称为一个JavaBean,简称bean,分配给bean的变量(成员变量),也称bean的属性。在类的命名上需遵守以下规则:
(1)如果类的成员变量(也称bean的属性)的名字是xxx,那么为了获取或更改bean的属性的值,类中必须提供两个方法:
getXxx(),用来获取属性xxx
setXxx(),用了修改属性xxx
也就是方法的名字用get或set为前缀,或后缀是将属性(成员变量)名字的首字母大写的字符序列。
(2)类中定义的方法的访问权限都必须是public的。
(3)类中必须有一个构造方法是public、无参数的。
2、保存bean的字节码
为了使JSP页面使用bean,Tomcat服务器必须使用相应的字节码文件创建一个对象,即创建一个bean。为了让Tomcat服务器能找到字节码文件,字节码文件必须保存在特定的目录中。
将创建bean的字节码文件,比如Circle.class,复制到
\WEB-INF\classes\tom\jiafei
为了调试程序方便,可以直接按照bean的包名将bean的源文件,比如Circle.java,保存在\WEB-INF\classes\tom\jiafei目录中,然后用命令行进入tom\jiafei的父目录classes(不要进入tom或jiafei目录)编译Circle.java
3、创建于使用bean
1.使用bean
<jsp:useBean id="bean的名字" class="创建bean的类" scope="bean有效范围"/>
或
<jsp:useBean id="bean的名字" class="创建bean的类" scope= "bean有效范围"> </jsp:useBean>
例如:
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
需要特别注意的是,其中的“创建bean的类”要带有包名,比如:
class="tom.jiafei.Circle"
2.bean的加载原理
当JSP页面使用JSP动作标记useBean加载一个bean时,Tomcat服务器首先根据JSP动作标记useBean中id给出的bean名字以及scope给出的使用范围(bean生命周期),Tomcat服务器首先在Tomcat服务器管理的pageContent内置对象中查找是否含有这样的bean。如果这样的bean存在,Tomcat服务器就分配这样的bean给用户,如果在pageContent中没有查找到JSP动作标记要求的bean,就根据class指定的类创建一个bean,并将所创建的bean添加到pageContent中。通过Tomcat服务器创建bean的过程可以看出,首次创建一个新的bean需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的bean时,Tomcat服务器直接将pageContent中已经有的bean分配给JSP页面,提高了JSP使用bean的效率。
如果修改了字节码文件,必须重新启动Tomcat服务器才能使用新的字节码文件。
3.bean的有效范围和生命周期
(1)page bean
scope取值为page的bean称为page bean.
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
page bean的有效范围是用户访问的当前页面,存活时间直到当前页面执行完毕。
不同用户(浏览器)的page bean是互不相同的。也就是说,当两个用户同时访问一个JSP页面时,一个用户对自己page bean的属性的改变,不会影响到另一个用户。
(2)session bean
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="session" />
session bean的有效范围是用户访问的Web服务目录下的各个页面,存活时间是用户的会话期(session)间。
如果用户访问Web服务目录多个页面,那么每个页面id相同的session bean是同一个bean。
不同用户(浏览器)的session bean是互不相同的.
(3)request bean
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="request" />
bean的有效范围是用户请求的当前页面,存活时间是从用户的请求到请求结束。request bean存活时间略长于page bean的存活时间,原因是Tomcat服务器认为页面执行完毕后,响应才算结束。
不同用户的request bean的也是互不相同的。也就是说,当两个用户同时请求一个JSP页面时,一个用户对自己request bean的属性的改变,不会影响到另一个用户。
(4)application bean
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="application" />
application bean的有效范围是当前Web服务目录下的各个页面,存活时间直到Tomcat服务器关闭。
Tomcat服务器为访问Web服务目录的所有用户分配一个共享的bean,即不同用户的application bean也都是相同的一个。也就是说,任何一个用户对自己application bean的属性的改变,都会影响到其他的用户(不同Web服务目录的application bean互不相同)。
二、获取和修改bean的属性
1、getProperty动作标记
使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。
<jsp:getProperty name="bean的id " property="bean的属性" />
或
<jsp:getProperty name="bean的id " property="bean的属性">
</jsp:getProperty>
当JSP页面使用getProperty标记获取属性xxx的值时,必须保证bean有相应的getXxx方法,即对方法的名字的命名有特殊的要求。
让request调用setCharacterEncoding方法设置编码为utf-8,以避免显示bean的属性值出现乱码现象
2、setProperty动作标记
(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="*" />
在setProperty标记的上述用法中不具体指定bean属性的值将对应form表单中哪个参数指定的值,系统会自动根据名字进行匹配对应,但要求bean属性的名字必须在form表单中有名称相同的参数名字相对应,Tomcat服务器会自动将参数的字符串值转换为bean相对应的属性的值
用form表单的某个参数的值设置bean的某个属性值的使用格式如下:
<jsp:setProperty name= "bean的名字" property="属性名" param= "参数名" />
setProperty标记的上述用法具体指定了bean属性的值将对应表单中哪个参数名(param)指定的值,这种设置bean的属性值的方法,不要求property给出的bean属性的名字和param给出的参数名一致,即不要求bean属性的名字必须和表单中某个参数。
注 :用form表单设置bean的属性值时,只有提交了表单,对应的setProperty标记才会被执行
三、bean的辅助类
写一个创建bean的类时,除了需要用import语句引入JDK提供的类,可能还需要自己编写一些其他的类,只要将这样类的包名和bean类的包名一致即可(也可以和创建bean的类写在一个Java源文件中)。
四、JSP与bean结合的简单例子
1、三角形bean
使用request bean(Triangle类负责创建)完成三角形的有关数据的处理。例子中的JSP页面提供一个form表单,用户可以通过form表单将三角形三边的长度提交给该页面。用户提交form表单后,JSP页面将计算三角形面积的任务交给一个request 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;
}
}
example5_6.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>
2、四则运算bean
使用session bean(CompuerBean类负责创建)完成四则运算。例子中的JSP页面提供一个form表单,用户可以通过form表单输入两个数,选择四则运算符号提交给该页面。用户提交form表单后,JSP页面将计算任务交给session bean去完成
ComputerBean.java(负责创建request bean)
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;
}
}
example5_7.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>
等。