目录
前言
JSP(Java Server Pages)是一种基于Java技术的动态网页开发技术,它允许开发人员将Java代码嵌入到HTML页面中,从而实现动态生成网页的功能。而Java bean则是一种Java类,它具有一些特殊的属性和方法,可以被JSP页面调用,从而实现更加灵活的动态网页开发。本文将详细介绍JSP和Java bean的相关知识。
5.1 编写Javabean和使用Javabean
JSP页面可以将数据的处理过程指派给一个或几个bean来完成,即JSP页面调用这些bean完成数据的处理,并将有关处理结果存放到bean中,然后JSP页面负责显示bean中的数据。
5.1.1编写Javabean
编写Javabean就是编写一个Java的类,所以只要会写类就能编写一个Javabean。这个类创建的一个对象称为一个Javabean,简称bean,分配给bean的变量(成员变量),也称bean的属性。为了能让使用bean的应用程序构建工具(比如Tomcat服务器)使用JSP动作标记知道bean的属性和方法,只须在类的方法命名上遵守以下规则:
(1)如果类的成员变量,也称bean的属性的名字是xxx,那么为了获取或更改bean的属性的值,类中必须提供两个方法:
getXxx(),用来获取属性xxx。
setXxx(),用来修改属性xxx.。
也就是方法的名字用get或set为前缀,后缀是将属性(成员变量)名字的首字母大写的字符序列。
(2)类中定义的方法的访问权限都必须是public的。
(3)类中定义的构造方法必须是public、无参数的。
5.1.2 保存bean的字节码
ch5 \WEB-INF\classes目录下,根据包名对应的路径,在classes下再建立相应的子目录。比如,包名tom.jiafei对应的路径是tom\jiafei,那么在classes下建立子目录结构:tom\jiafei。
将创建bean的字节码文件,比如Circle.class,复制到
\WEB-INF\classes\tom\jiafei
为了调试程序方便,可以直接按照bean的包名将bean的源文件,比如Circle.java,保存在\WEB-INF\classes\tom\jiafei目录中,然后用命令行进入tom\jiafei的父目录classes(不要进入tom或jiafei目录)编译Circle.java:
classes>javac tom\jiafei\Circle.java
5.1.3 创建与使用bean
1.使用bean
使用JSP动作标记useBean加载使用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的加载原理
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的效率。
3.bean的有效范围和生命周期
page bean
scope取值为page的bean称为page bean.
<jsp:useBean id="circle" class="tom.jiafei.Circle" scope="page" />
page bean的有效范围是用户访问的当前页面,存活时间直到当前页面执行完毕。
不同用户(浏览器)的page bean是互不相同的。也就是说,当两个用户同时访问一个JSP页面时,一个用户对自己page bean的属性的改变,不会影响到另一个用户。
例子5_1中负责创建page bean的类是Circle类,page bean的名字是circle
<%@ 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_1~5_3所示,这种情况下,不要求创建bean的类准守setXxx和getXxx等规则
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的一个属性的名字。
当JSP页面使用getProperty标记获取属性xxx的值时,必须保证bean有相应的getXxx方法,即对方法的名字的命名有特殊的要求。
5.2.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属性的名字必须和表单中某个参数。
5.3 bean的辅助类
写一个创建bean的类时,除了需要用import语句引入JDK提供的类,可能还需要自己编写一些其他的类,只要将这样类的包名和bean类的包名一致即可(也可以和创建bean的类写在一个Java源文件中)。
例子4_6中,使用一个bean列出Tomcat服务器驻留的计算机上某目录中特定扩展名的文件。创建bean的ListFile类,需要一个实现FilenameFilter接口的辅助类FileExtendName,该类可以帮助bean列出指定扩展名的文件。
<%@ 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应用。
在本节中,创建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\源文件名
5.4.1 三角形bean
例子5_6使用request bean(Triangle类负责创建)完成三角形的有关数据的处理。例子中的JSP页面提供一个form表单,用户可以通过form表单将三角形三边的长度提交给该页面。用户提交form表单后,JSP页面将计算三角形面积的任务交给一个request bean去完成。
<%@ 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>
5.4.2 四则运算bean
例子5_7使用session bean(CompuerBean类负责创建)完成四则运算。例子中的JSP页面提供一个form表单,用户可以通过form表单输入两个数,选择四则运算符号提交给该页面。用户提交form表单后,JSP页面将计算任务交给session bean去完成。
<%@ 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>
5.4.3 浏览图像 bean
例子5_8中的JSP页面通过单击超链接“下一张”或“上一张”浏览图像,JSP页面将获取图像名字的任务交给session bean去完成,JSP页面根据bean获得的图像名字显示图像。
<%@ 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="play" class="red.star.Play" scope="session" />
<%
String webDir = request.getContextPath();//获取当前Web服务目录的名称
webDir = webDir.substring(1); //去掉名称前面的目录符号:/
%>
<jsp:setProperty name="play" property="webDir" value="<%= webDir %>"/>
<jsp:setProperty name="play" property="index" param = "index" />
<HTML><body bgcolor = cyan><p id = textStyle>
<image src =
image/<jsp:getProperty name="play" property="showImage"/> width =300 height =200>
</image><br>
<a href ="?index=<%=play.getIndex()+1 %>">下一张</a>
<a href ="?index=<%=play.getIndex()-1 %>">上一张</a>
</p></body></HTML>
5.4.4 日历bean
例子5_9使用session bean(Calendar类负责创建)显示某月的日历。用户单击“下一月”,“上一月”超链接可以翻阅日历。也可以输入年份,选择月份,单击 form表单中的提交键查看日历。
<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<style>
#textStyle{
font-family:宋体;font-size:18;color:blue
}
</style>
<% request.setCharacterEncoding("utf-8");
%>
<HTML><body id = textStyle bgcolor = #ffccff>
<jsp:useBean id="calendar" class="red.star.Calendar" scope="session" />
<jsp:setProperty name="calendar" property="year" param = "year"/>
<jsp:setProperty name="calendar" property="month" param = "month" />
<jsp:getProperty name="calendar" property="year" /> 年
<jsp:getProperty name="calendar" property="month" />月的日历:<br>
<jsp:getProperty name="calendar" property="saveCalender" />
<br><a href ="?month=<%=calendar.getMonth()+1 %>">下一月</a>
<a href ="?month=<%=calendar.getMonth()-1 %>">上一月</a>
<form action="" method = get >
输入年份<input type=text name="year" id = textStyle size=6 />
选择月份 <select name="month" id = textStyle size =1>
<option value="1">1月</option>
<option value="2">2月</option>
<option value="3">3月</option>
<option value="4">4月</option>
<option value="5">5月</option>
<option value="6">6月</option>
<option value="7">7月</option>
<option value="8">8月</option>
<option value="9">9月</option>
<option value="10">10月</option>
<option value="11">11月</option>
<option value="12">12月</option>
</select><br>
<input type="submit" value="提交" id = textStyle "/>
</form>
</body></HTML>
5.4.5 计数器bean
例子5_10使用application bean(ComputerCount类负责创建)记录Web服务目录被访问的次数。只要用户第1次访问(用户的session被创建)Web服务目录,那么当前Web服务目录的访问计数就增加1。如果用户的session没有消失,用户再访问当前Web服务目录,访问的计数不再增1。
总结
JSP和Java bean是Java技术中非常重要的两个组成部分,它们可以结合使用,实现更加灵活和方便的动态网页开发。本文介绍了JSP和Java bean的基本原理和结合应用,希望对读者有所帮助。