目录
前言
JSP与Java Bean在Web开发中是非常重要的组件,它们可以实现数据的封装、变量的传递以及数据的持久化等功能。在本章中,我们将会介绍JSP页面中如何使用Java Bean,并讲解Java Bean的概念和基本原理
5.1 编写Javabean和使用Javabean
5.1.1编写Javabean
编写Javabean就是编写一个Java的类。bean的变量(成员变量),也称bean的属性。为了能让使用bean的应用程序构建工具(比如Tomcat服务器)使用JSP动作标记知道bean的属性和方法,只须在类的方法命名上遵守以下规则:
如果类的成员变量,也称bean的属性的名字是xxx,那么为了获取或更改bean的属性的值,类中必须提供两个方法:
(1)getXxx(),用来获取属性xxx。 setXxx(),用来修改属性xxx.。 也就是方法的名字用get或set为前缀,后缀是将属性(成员变量)名字的首字母大写的字符序列。
(2)类中定义的方法的访问权限都必须是public的。
(3)类中定义的构造方法必须是public、无参数的。
5.1.2 保存bean的字节码
为了使JSP页面使用bean,tomcat服务器必须使用相应的字节码文件创建一个对象,及创建一个bean。为了让tomcat服务器能找到字节码文件,字节码文件必须保存在特定的目录中,"保存类型"选择为"所有文件",将"编码方式"选择为"ANSI"。
5.1.3 创建与使用bean
①使用bean
使用JSP动作标记useBean加载使用bean,语法格式是:
<jsp:useBean id="bean的名字" class="创建bean的类" scope="bean有效范围"/>
或
<jsp:useBean id="bean的名字" class="创建bean的类" scope= "bean有效范围">
需要特别注意的是,其中的“创建bean的类”要带有包名,比如
class="tom.jiafei.Circle"
②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服务器才能使用新的字节码文件。
③bean的有效范围和生命周期
scope的取值范围给出了bean的生命周期(存活时间),即scope取值决定了tomcat服务器分配给用户的bean的有效范围和生命周期。
(1)page bean scope取值为page的bean称为page bean. page bean的有效范围是用户访问的当前页面,存活时间直到当前页面执行完毕。不同用户(浏览器)的page bean是互不相同的。也就是说,当两个用户同时访问一个JSP页面时,一个用户对自己page bean的属性的改变,不会影响到另一个用户。
(2)session bean。session bean的有效范围是用户访问的Web服务目录下的各个页面,存活时间是用户的会话期(session)间。如果用户访问Web服务目录多个页面,那么每个页面id相同的session bean是同一个bean。不同用户(浏览器)的session bean是互不相同的.
(3) request bean bean的有效范围是用户请求的当前页面,存活时间是从用户的请求到请求结束。request bean存活时间略长于page bean的存活时间,原因是Tomcat服务器认为页面执行完毕后,响应才算结束。 不同用户的request bean的也是互不相同的。也就是说,当两个用户同时请求一个JSP页面时,一个用户对自己request bean的属性的改变,不会影响到另一个用户。
(4)application bean。 application bean的有效范围是当前Web服务目录下的各个页面,存活时间直到Tomcat服务器关闭。 Tomcat服务器为访问Web服务目录的所有用户分配一个共享的bean,即不同用户的application bean也都是相同的一个。也就是说,任何一个用户对自己application bean的属性的改变,都会影响到其他的用户(不同Web服务目录的application bean互不相同)。
下面是有效范围示意图:
注意:使用session bean时,要保证用户端支持Cookie。
下列例子中负责创建page bean的类是Circle类,page bean的名字是circle:
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>
Circle.java
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.2 获取和修改bean的属性
使用useBean动作标记获得一个bean后,在Java程序片或表达式中bean就可以调用方法产生行为,这种情况下,不要求创建bean的类准守setXxx和getXxx等规则。 获取和修改bean的属性还可以使用JSP动作标记getProperty、setProperty。当页面使用getProperty、setProperty标记获取或修改属性xxx时,必须保证bean 中有相应的getXxx和setXxx方法,即对方法名字的命名有特殊的要求。
5.2.1 getProperty动作标记
使用getProperty动作标记可以获得bean的属性值,并将这个值用串的形式发送给用户的浏览器。
<jsp:getProperty name="bean的id " property="bean的属性" />
或
<jsp:getProperty name="bean的id " property="bean的属性">
</jsp:getProperty>
其中,name取值是bean的id,用来指定要获取哪个bean的属性的值,property取值是该bean的一个属性的名字。
注意:让request调用setCharacterEncoding方法设置编码为utf-8,以避免显示bean的属性值出现乱码现象。
5.2.2 setProperty动作标记
使用 setProperty动作标记 可以设置bean的属性值。setProperty动作标记可以通过两种方式来设置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="*" />
在setProperty标记的上述用法中不具体指定bean属性的值将对应form表单中哪个参数指定的值,系统会自动根据名字进行匹配对应,但要求bean属性的名字必须在form表单中有名称相同的参数名字相对应。
用form表单的某个参数的值设置bean的某个属性值的使用格式如下:
<jsp:setProperty name= "bean的名字" property="属性名" param= "参数名" />
setProperty标记的上述用法具体指定了bean属性的值将对应表单中哪个参数名(param)指定的值,这种设置bean的属性值的方法,不要求property给出的bean属性的名字和param给出的参数名一致,即不要求bean属性的名字必须和表单中某个参数。
注 用form表单设置bean的属性值时,只有提交了表单,对应的setProperty标记才会被执行。
例子:使用Goods类创建request bean。example4_5_a.jsp通过form表单指定example4_5_a.jsp和example4_5_b.jsp中的request bean的name和price属性的值。example4_5_a.jsp和example4_5_b.jsp使用getProperty动作标记以及bean调用方法两种方式显示request bean的name和price属性的值。
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>
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;
}
}
结果:
5.3 bean的辅助类
写一个创建bean的类时,除了需要用import语句引入JDK提供的类,可能还需要自己编写一些其他的类,只要将这样类的包名和bean类的包名一致即可(也可以和创建bean的类写在一个Java源文件中)。
例子5_5中,使用一个bean列出Tomcat服务器驻留的计算机上某目录中特定扩展名的文件。创建bean的ListFile类,需要一个实现FilenameFilter接口的辅助类FileExtendName,该类可以帮助bean列出指定扩展名的文件。
Javabean:ListFile.java(负责创建bean)用命令行进入tom\jiafei的父目录classes,编译ListFile.java:
classes>javac tom\jiafei\ListFile.java
package tom.jiafei;
import java.io.*;
class FileExtendName implements FilenameFilter {
String str=null;
FileExtendName (String s) {
str="."+s;
}
public boolean accept(File dir,String name) {
return name.endsWith(str);
}
}
public class ListFile {
String extendsName=null;
String [] allFileName=null;
String dir=null;
public void setDir(String dir) {
this.dir =dir;
}
public String getDir() {
return dir;
}
public void setExtendsName(String s) {
extendsName=s;
}
public String getExtendsName() {
return extendsName;
}
public String [] getAllFileName() {
if(dir!=null) {
File mulu=new File(dir);
FileExtendName help=new FileExtendName(extendsName);
allFileName=mulu.list(help);
}
return allFileName;
}
}
JSP页面:example5_5.jsp
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<% request.setCharacterEncoding("utf-8");
%>
<style>
#textStyle{
font-family:宋体;font-size:36;color:blue
}
</style>
<jsp:useBean id="file" class="tom.jiafei.ListFile" scope="request"/>
<HTML><body id=textStyle bgcolor = #ffccff>
<form action="" Method="post">
输入目录名(例如D:/2000)<input type=text name="dir" id=textStyle size=15/><br>
输入文件的扩展名(例如java)<input type=text name="extendsName" id=textStyle size=6>
<input type=submit id=textStyle value="提交"/>
</form>
<jsp:setProperty name="file" property="dir" param="dir"/>
<jsp:setProperty name="file" property="extendsName" param="extendsName"/>
<br><b>目录 <jsp:getProperty name="file" property="dir"/>中
扩展名是 <jsp:getProperty name="file" property="extendsName"/> 的文件有:
<% String [] fileName = file.getAllFileName();
if(fileName!=null) {
for(int i=0;i<fileName.length;i++) {
out.print("<br>"+fileName[i]);
}
}
%>
</body></HTML>
结果:
5.4 JSP与bean结合的简单例子
JSP页面中调用bean可以将数据的处理从页面中分离出来,实现代码复用,以便更有效地维护一个Web应用。
由于本小节都是例子,就不在此过多赘述 。
总结:
通过本章的学习,能够掌握在JSP开发中如何使用Java Bean来对数据进行封装和操作,以及如何使用Java Bean来处理表单数据和自定义标签库等操作。
以上就是JSP 与Java bean的全部内容。