JavaBean 学习笔记
目录
JavaBean简介
将Java代码直接写入到Jsp页面中,虽然能将功能实现,但是页面却显得比较凌乱,给修改和维护带来很多的麻烦。纯Jsp开发方式流程如1所示。
图1 纯Jsp开发模式
如果使HTML代码与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类,然后在JSP页面中调用此类,则可以降低HTML代码与Java代码之间的耦合度,简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类,就是一个JavaBean组件,在Java Web开发中,可以使用JavaBean组件来完成业务逻辑的处理,应用JavaBean与JSP整合的开发模式如下图2所示。
图2 JavaBean与Jsp设计模式
从图2可以看出,JavaBean的应用简化了JSP页面,在JSP页面中只包含了HTML代码、CSS代码等,但JSP页面可以引用JavaBean组件来完成某一业务逻辑,如字符串处理、数据库操作等。
通过上面的分析,可以看出,JavaBean实质是通过Java代码封装的Java类,它在服务器应用过程中,充当一个可重用的Java软件组件模型,JSP页面可以引用一个或多个JavaBean组件对象,同样,一个JavaBean对象也可以被多个JSP页面所引用,达到了代码重用的效果,从而提高程序的灵活性。
javaBean 规范
JavaBean是一个可重用的Java软件组件模型,在编写时,需要遵循一定的Java一些编码约定,一个标准的JavaBean应该具备以下规范。
公共的无参的构造方法
一个JavaBean对象必须拥有一个公共类型、默认的无参构造方法,从而可以通过new关键字直接对其进行实例化。
类的声明是非final类型的
当一个类声明为final类型时,它是不可以更改的,所以,JavaBean对象的声明应该是非final类型的。
实现可序列接口
JavaBean应该直接或间接实现java.io.Serializable接口,以支持序列化机制。
为属性声明访问器
JavaBean中的属性应该设置为私有(private)类型,为了防止外部直接访问,但它需要对外提供公共(public)的访问方法,也就是说需要为属性提供getter/setter方法。
说明:
上面介绍的JavaBean规范,只是JavaBean应遵循的基本原则,更多的规范约定,请参照Sun公司对JavaBean规所发布pdf文档
下图是用editPlus 编写的带有个4个属性的JavaBean.
javabean 在jsp中的应用
jsp:useBean标签
标签用于jsp页面中创建一个JavaBean 实例,并通过属性的设置将此实例存放到JSP指定的范围内,其语法格式如下:
<jsp:useBean
id="变量名"
scope="page|request|session|application"
{
class="完整类名"|
type="数据类型"|
class="完整类名" type="数据类型"|
beanName="完整类名" type="数据类型"
}/>
语法中的“完整类名”包含一个类的包名称,如com.lyq.user。参数说明如表1所示。
语法设置值描述
id属性
用于定义一个变量名(可以理解为JavaBean的一个代号),程序中通过此变量名对
JavaBean进行引用
scope属性
设置JavaBean的作用域。它有4种范围,即page、request、session、
application,默认情况下为page
class属性
指定JavaBean的完整类名(包名与类名结合的方式)如
class=“com.lyq.User”。此属性与BeanName属性不能同时存在
type属性
指定id属性所定义的变量类型
beanName属性指定JavaBean的完整类名,此属性不能与class属性同时存在
案列1
(1)首先创建一个名为Bean的类(它是一个JavaBean),此类中有一个名为name的属性及相应的getXXX()与setXXX()方法。代码如下:
(2)创建了JavaBean之后,在index.jsp页面中通过标签实例化此对象,并调用此对象的方法。代码如下:
jsp:setProperty标签
标签用于对JavaBean中的属性赋值,但JavaBean的属性要提供相应的setXXX()方法。通常情况下该标签与标签配合使用。其语法格式如下:
<jsp:setProperty
name="实例名"
{
property="*" |
property="属性名" |
property="属性名" param="参数名" |
property="属性名" value="值"
}/>
语法
设置值描述
name属性
指定JavaBean的引用名称
property属性
指定JavaBean中的属性名,此属性是必需的,其取值有两种,分别为“*”、“JavaBean的属性名称”
param属性
指定JSP请求中的参数名,通过该参数可以将JSP请求参数的值赋给Java的属性
value属性
指定一个属性的值
技巧:
表单信息中的属性名称最好设置成为JavaBean中的属性名称,这样就可以通过“”的形式来接收所有参数,此种方式可以减少程序中的代码量。如:将用户年龄文本框的name属性设置为“age”,它对应Person类中的age。
(2)创建一个form表单,将其放置在index.jsp页面中。其关键代码如下:
(3)创建student.jsp页面,用于实例化Student对象,并输出相应的属性值。其关键代码如下:
jsp:getProperty
标签用于获取JavaBean中的属性值,但要求JavaBean的属性必须具有相对应的getXXX()方法。其语法格式如下:
name属性,指定存在某一范围的JavaBean实例的引用。property属性,指定JavaBean的属性名称。
案列
利用标签输出JavaBean中的属性。
首先创建一个名为Book的JavaBean对象,此类用于封装图书信息。其关键代码如下:
package com.cdd;
public class Book {
private String bookName; //图书名称
private String author; //作者
private String category; //类别
private double price; //价格
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
注意
要通过标签输出JavaBean中的属性值,要求在JavaBean中必须包含getXXX()方法,标签将通过此方法获取JavaBean的属性值。
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.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="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="CSS/style.css">
</head>
<body>
<body>
<!-- 实例化Book对象 -->
<jsp:useBean id="book" class="com.lyq.Book"></jsp:useBean>
<!-- 对Book对象赋值 -->
<jsp:setProperty name="book" property="bookName" value="《JAVA程序设计标准教程》"/>
<jsp:setProperty name="book" property="author" value="奕楊科技"/>
<jsp:setProperty name="book" property="category" value="Java图书"/>
<jsp:setProperty name="book" property="price" value="59.00"/>
<table align="center" border="1" cellpadding="1" width="350" height="100" bordercolor="green">
<tr>
<td align="right">图书名称:</td>
<td><jsp:getProperty name="book" property="bookName"/> </td>
</tr>
<tr>
<td align="right">作 者:</td>
<td><jsp:getProperty name="book" property="author"/> </td>
</tr>
<tr>
<td align="right">所属类别:</td>
<td><jsp:getProperty name="book" property="category"/> </td>
</tr>
<tr>
<td align="right">价 格:</td>
<td><jsp:getProperty name="book" property="price"/> </td>
</tr>
</table>
</body>
</body>
</html>
在此页面中,首先通过标签实例化Book对象,再使用标签对Book对象中的属性赋值,最后通过标签输出Book对象的属性值,
JavaBean 的作用域
JavaBean的生命周期存在于4种范围之中,分别为page、request、session、application,它们通过标签的scope属性进行设置。这4种范围虽然存在很大的区别,但它们与JSP页面中的page、request、session、application范围相对应。
page范围
与当前页面相对应,JavaBean的生命周期存在于一个页面之中,当页面关闭时JavaBean被销毁。
request范围
与JSP的request生命周期相对应,JavaBean的生命周期存在于request对象之中,当request对象销毁时JavaBean也被销毁。
l session范围:与JSP的session生命周期相对应,JavaBean的生命周期存在于session会话之中,当session超时或会话结束时JavaBean被销毁。
application范围
与JSP的application生命周期相对应,在各个用户与服务器之间共享,只有当服务器关闭时JavaBean才被销毁。
这4种作用范围与JavaBean的生命周期是息息相关的,当JavaBean被创建后,通过标签与标签调用时,将会按照page、request、session和application的顺序来查找这个JavaBean实例,直至找到一个实例对象为止,如果在这4个范围内都找不到JavaBean实例,则抛出异常。
JavaBean在session范围与application范围的比较
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.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="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
session.setMaxInactiveInterval(10);
%>
<!-- 创建一个session范围的Counter对象 -->
<jsp:useBean id="counter_session" class="com.lyq.Counter" scope="session"/>
<!-- 创建一个application范围的Counter对象 -->
<jsp:useBean id="counter_application" class="com.lyq.Counter" scope="application"/>
<table align="center" width="350" border="1">
<tr>
<td colspan="2" align="center"><br><h1>JavaBean的作用域</h1></td>
</tr>
<tr>
<td align="right" width="30%">session</td>
<td><jsp:getProperty name="counter_session" property="count" /></td>
</tr>
<tr>
<td align="right">application</td>
<td><jsp:getProperty name="counter_application" property="count" /></td>
</tr>
</table>
</body>
</html>
此页面分别输出了session范围与application范围的计数器的数值,刷新页面后其数值不断自增,说明Counter对象实例存在于此次会话之中。
当开启一个新的浏览器窗口时,session的生命周期结束,与之对应的Counter对象也将被销毁,但application范围中的Counter对象依然存在.
练习
- 定义获取当前年份的方法
JavaBean是用Java语言所写成的可重用组件,它可以是一个实体类对象,也可以一个业务逻辑的处理,但编写JavaBean要遵循JavaBean规范,下面通过实例在JSP页面中调用获取当前时间的JavaBean。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateBean {
private String dateTime; // 日期及时间
private String week; // 星期
private Calendar calendar = Calendar.getInstance(); // Calendar对象
public String getDateTime() {
Date currDate = Calendar.getInstance().getTime(); // 获取当前时间
// 实例化SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH点mm分ss秒");
dateTime = sdf.format(currDate); // 格式化日期时间
return dateTime; // 返回日期及时间的字符串
}
public String getWeek() {
String[] weeks = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; // 定义数组
int index = calendar.get(Calendar.DAY_OF_WEEK); // 获取一星期的某天
week = weeks[index - 1]; // 获取星期几
return week; // 返回星期字符串
}
}
DateBean类主要封装了日期时间(dateTime属性)、星期(week属性),并针对这两个属性提供了相应的getXXX()方法,其中getDateTime()方法用于获取当前的日期及时间,此方法通过SimpleDateFormat对象的format()方法返回对当前时间进行格式化,并返回格式化后的字符串。getWeek()方法用于获取星期几,此方法主要通过Calendar对象获取获取一星期的某天索引,及创建字符串数组来实现。
说明
由于DateBean类主要用于获取当前时间,并不涉及到对DateBean类中的属性赋值,所以实例中并没有提供ateTime属性、week属性的setXXX()方法。除这两个属性外还包含了一个calendar属性,此属性是一个Calendar对象,是获取日期时间及星期的辅助类,所以没有必要对此属性提供相应的setXXX()方法与getXXX()方法。
(2)创建名称为index.jsp的页面,它是程序中的主页。在index.jsp页面实例化DateBean对象,并获取当前日期时间及星期实现实现电子时钟效果,其关键代码如下:
技巧
因为获取当前日期时间的JavaBean对象DateBean并不涉及到更多的业务逻辑,所以实例中将它的作用域设置为application,这样做的好处是,在JSP页面的第一次调用此对象的时候它会实例化一个DateBean对象,以后再次调用的时候就不需要再次实例化DateBean,因为它在application范围内已经存在。
- 新建Web项目,在新建项目中新建名为StringUtil的JavaBean类,用于判断字符串是否以指定的子字符串开头,关键代码如下:
(2)在该项目的index.jsp页面中,设置页面表单布局,关键代码如下:
(3)在该项目的check.jsp页面中,处理index.jsp页面的请求,并就判断用户是否在index.jsp页面中输入了指定开头的字符串,关键代码如下:
JavaBean 练习3
在开发程序时,经常需要将数据库中的信息显示在网页中,以供用户浏览和选择,学习了JavaBean技术后,就可以将操作数据库的代码写入到JavaBean中.
(1)新建Web项目,在新建项目中创建JavaBean类DB,在该类中定义查询数据方法,具体代码如下:
public class DB {
private Connection con; //定义数据库连接对象
private Statement stm; //定义Statement对象
private ResultSet rs; //定义查询结果集ResultSet对象
private String classname="com.mysql.jdbc.Driver"; //加载数据库驱动代码
private String url="jdbc:mysql://localhost:3306/db_database07"; //连接数据库URL
public DB(){}
public Connection getCon(){ //定义获取数据库连接方法
try{
Class.forName(classname);
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
try{
con=DriverManager.getConnection(url,"root","111");
}
catch(Exception e){
e.printStackTrace(System.err);
con=null;
}
return con;
}
public Statement getStmed(){ //实例化Statement方法
try{
con=getCon(); //调用获取数据库连接方法
stm=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
}catch(Exception e){e.printStackTrace(System.err);}
return stm;
}
public ResultSet getAllRs(){ //定义获取查询结果集方法
String sql="select * from tb_use"; //定义查询语句
try{
stm=getStmed();
rs=stm.executeQuery(sql); //执行查询语句
}
catch(SQLException e){e.printStackTrace();rs=null;}
return rs;
}
}
(2)在新建项目的index.jsp页面中,实现定义显示查询结果的表格,提供了“查询全部数据”按钮,当用户单击该按钮时,
<%
ResultSet rs=(ResultSet)session.getAttribute("resultset");
if(rs==null){
%>
<tr align="center" valign="middle"><td colspan="4">没有记录显示!</td>
</tr>
<%
}
else{
while(rs.next()){
%>
<tr align="center" valign="middle" height="22">
<td><%=rs.getString("name") %></td>
<td><%=rs.getString("sex") %></td>
<td><%=rs.getInt("age") %></td>
<td><%=rs.getString("job") %></td>
</tr>
<%
} }
(3)建立接收Form表单的页面dosearchall.jsp,在该页面中进行数据查询操作。其关键代码如下:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.sql.*" %>
<jsp:useBean id="db" class="com.jb.db.DB" scope="page"/>
<%
ResultSet rs=db.getAllRs(); //获得查询的结果集
session.setAttribute("resultset",rs); //将得到的结果集存储在session会话中
response.sendRedirect("index.jsp"); //返回到index.jsp页面显示数据信息
%>