JSP 最强有力的一个方面就是能够使用 JavaBean 组件。 按照 Sun 公司的定义, JavaBean是一个可重复使用的软件组件。实际上 JavaBean 是一种 Java 类,通过封装属性和方法成为具有某种功能或者处理某些业务的对象,简称 Bean。
一个基本的 JSP 页面由静态的 HTML 标签和 Java 脚本组成,如果 Java脚本和 HTML 标签大量掺杂在一起,就显得页面混杂,不易维护。 JSP 页面应当将数据的处理过程指派给一个或者几个 Bean 来完成,而在 JSP 页面中调用 JavaBean。不提倡大量的数据处理都用 Java 脚本来完成。 JSP 页面中调用 JavaBean,可有效地分离静态工作部分和动态工作部分,实现业务逻辑和表现形式的分离。 JavaBean 负责业务逻辑的处理, JSP 负责页面的展示,如图 5–1 所示。
JavaBean 简介
JavaBean 的特点
可以实现代码的重复利用。
易编写、 易维护、易使用。
可以在任何支持 Java 的平台上工作,而不需要重新编译。
可以通过网络传输。
可以与其他 Java 类同时使用。
JavaBean 的应用范围
JavaBean 传统的应用在于可视化领域,如 AWT(抽象窗口工具集)和 Swing 下的应用。现在, JavaBean 更多的应用在于非可视化领域,它在服务器端应用方面表现出了越来越强的生命力。非可视化的 JavaBean 和可视化的 JavaBean 同样使用属性和事件。非可视化的JavaBean 在 JSP 程序中常用来封装业务逻辑、数据库操作等,可以很好地实现业务逻辑和前台页面的分离,使得系统具有更好的健壮性和灵活性。注意: JavaBean 和 EJB( Enterprise JavaBean)的概念是完全不同的。
编写 JavaBean 遵循的原则
编写 JavaBean 就是编写一个 Java 的类,所以只要学会写类就能编写一个 JavaBean,这个类创建的一个对象称之为 JavaBean。为了让使用 JavaBean 的应用程序构建工具(比如 JSP引擎)知道这个 Bean 的属性和方法, JavaBean 的类需要遵守以下规则:
1、必须具备一个零参数的构造方法,显式地定义这样一个构造方法或者省略所有的构造方法都能满足这项要求。
2、成员变量也称为属性, JavaBean 不应该有公开的成员变量,使用存取方法读取和修改属性, 而不允许对字段直接访问。 属性的名字建议以小写英文字母开头。
3、属性的值通过 getXxx()和 setXxx()方法来访问。如果类有 String 类型的属性 title,读取 title 的方法是返回 String 的 getTitle(), 修改 title 的方法是 setTitle(String title)。
4、布尔型的属性的读取方法可以使用 getXxx(),也可以使用 isXxx()。
5、JavaBean 需要声明在包里面, package 保留字给类起一个包名。
举个例子:
package com.wuyudong; public class User {
private String userName;
private String password; public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
诀窍: Eclipse 可以帮助我们生成 getter 和 setter 方法,右键 Source→ Generate Getters and Setters
<jsp:useBean>
JSP 页面中可以<jsp:useBean>动作元素在 JSP 页面中使用 JavaBean 对象,这样就可以将大部分业务处理逻辑封装在 JavaBean
<jsp:useBean>动作元素用来在 JSP 页面中获取或者创建一个 JavaBean 对象,并指定它的名字和作用范围。 JSP 容器确保 JavaBean 对象在指定的范围内可以使用。 <jsp:useBean>的语法格式如下:
<jsp:useBean id="beanName" class="package.BeanClassName" scope="page | request | session | application"/>
当服务器上某个含有<jsp:useBean>动作元素的 JSP 页面被加载执行时, JSP 引擎首先根据 ID 给出的 JavaBean 的名字( beanName),在 scope 范围对应的 JSP 内部对象上查找是否有这个名字的属性( Attribute)。如果在指定范围内找到了与 beanName 同名的属性, JSP 引擎返回属性对应的对象的引用。如果没有在指定的范围内找到与 beanName 同名的属性, JSP引擎根据 class 属性给出的包名和类名,创建一个该类的对象, 并将该对象作为属性名为beanName 的一个属性的值,绑定到 scope 范围对应的 JSP 内部对象上。由于 pageContext对象可以操作各个范围的属性,实际上 JavaBean 的查找和绑定都是通过 pageContext 对象来完成的。 如果没有指定 JavaBean 的范围,默认范围是 page。
实战一下:
JavaBean
package com.wuyudong; public class Bean {
private String name; public String getName() {
return name + " 的JavaBean程序!";
} public void setName(String name) {
this.name = name;
}
}
index.jsp
<jsp:useBean id="bean" class="com.wuyudong.Bean"></jsp:useBean>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
bean.setName("wuyudong");
%>
<h1 align="center"><%=bean.getName()%></h1>
</body>
</html>
<jsp:setProperty>
<jsp:setProperty>动作元素用来设置 JavaBean 的简单属性和索引属性。 <jsp:setProperty>使用 JavaBean 的 setter 方法设置一个或多个属性的值。
<jsp:setProperty>可以使用 value 给出属性的取值, 取值可以是一个字符串,也可以是一个 JSP 表达式( <%= %>)。
<jsp:setProperty name="beanName" property="propertyName" value="propertyValue"/>
实战:
创建javabean对象
package com.wuyudong; public class Student {
private int id;
private int age;
private String classes;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
}
创建form表单放在index.jsp中
<form action="student.jsp" method="post">
<p>
学号: <input type="text" name="id">
</p>
<p>
年龄: <input type="text" name="age">
</p>
<p>
<input type="submit" value="提交">
<input type="reset" value="重 置">
</p>
</form>
<jsp:getProperty>
<jsp:getProperty>动作元素用来访问一个 JavaBean 的属性。访问的属性值将被转化成字符串,然后发送到输出流中。如果属性是一个对象,将调用该对象的 toString()方法。<jsp:getProperty>动作元素是通过调用 JavaBean 的 getter 方法获取属性的。
<jsp:getProperty name="beanName" property="propertyName"/>
注意: <jsp:getProperty>使用 name 属性给出 JavaBean 的名字,而<jsp:useBean>使用 id 属性给出 JavaBean 的名字,实际上它们是一致的,都是指绑定在特定范围对象的一个属性( Attribute)的名字。
实战一下:
创建JavaBean对象
package com.wuyudong; 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;
}
}
在index.jsp页面中对其操作
<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>