目录
# JavaBean 介绍
JavaBean 是一种特殊的 Java 类,它遵循了一些规范,使得它可以被其他程序或组件复用和操作。JavaBean 的主要作用是封装数据,方便在不同层之间传递和处理。例如,在 JSP 中,我们可以使用 JavaBean 来存储用户的输入信息,或者从数据库中查询到的数据。
## 5.1 编写和使用 JavaBean
要编写一个 JavaBean,我们需要遵循以下几个规则:
- 提供一个无参的公有构造方法,以便其他程序可以通过反射技术创建 JavaBean 的实例。
- 实现 java.io.Serializable 接口,以便 JavaBean 可以被序列化和反序列化,从而实现数据的持久化和网络传输。
- 提供一系列的属性(property),每个属性都有对应的 getter 和 setter 方法,以便其他程序可以通过反射技术访问和修改 JavaBean 的属性值。属性的名称和类型可以是任意的,但是 getter 和 setter 方法必须遵循一定的命名规范,即 getPropertyName() 和 setPropertyName() 的形式。
### 5.1.1 编写 JavaBean
下面是一个简单的 JavaBean 的例子,它表示一个学生的信息:
```java
package com.example;
import java.io.Serializable;
public class Student implements Serializable {
private String name; // 姓名属性
private int age; // 年龄属性
private double score; // 成绩属性
public Student() {
// 无参构造方法
}
public String getName() {
// 姓名属性的 getter 方法
return name;
}
public void setName(String name) {
// 姓名属性的 setter 方法
this.name = name;
}
public int getAge() {
// 年龄属性的 getter 方法
return age;
}
public void setAge(int age) {
// 年龄属性的 setter 方法
this.age = age;
}
public double getScore() {
// 成绩属性的 getter 方法
return score;
}
public void setScore(double score) {
// 成绩属性的 setter 方法
this.score = score;
}
}
```
### 5.1.2 保存 bean 的字节码
编译上面的 JavaBean 类后,我们需要将生成的字节码文件(Student.class)保存到合适的位置,以便其他程序可以找到并加载它。通常,我们会将字节码文件保存到 WEB-INF/classes 目录下,并按照包名创建相应的子目录。
### 5.1.3 创建和使用 bean
创建了 JavaBean 之后,我们就可以在其他程序中使用它了。例如,在 JSP 中,我们可以使用以下标签来声明和操作 JavaBean:
- `<jsp:useBean>` 标签:用于在 JSP 页面中创建或获取一个 JavaBean 的实例,并指定其 id 和作用域(scope)。
- `<jsp:setProperty>` 标签:用于给 JavaBean 的某个属性赋值。
- `<jsp:getProperty>` 标签:用于获取 JavaBean 的某个属性的值。
下面是一个 JSP 页面的例子,它使用了上面定义的 Student 类作为 JavaBean,并显示了其属性值:
```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JavaBean 示例</title>
</head>
<body>
<jsp:useBean id="student" class="com.example.Student" scope="page"/>
<!-- 创建一个 Student 类型的 JavaBean,并指定其 id 为 student,作用域为 page -->
<jsp:setProperty name="student" property="name" value="张三"/>
<!-- 给 student 的 name 属性赋值为 张三 -->
<jsp:setProperty name="student" property="age" value="18"/>
<!-- 给 student 的 age 属性赋值为 18 -->
<jsp:setProperty name="student" property="score" value="90.5"/>
<!-- 给 student 的 score 属性赋值为 90.5 -->
<p>学生姓名:<jsp:getProperty name="student" property="name"/></p>
<!-- 获取 student 的 name 属性并显示 -->
<p>学生年龄:<jsp:getProperty name="student" property="age"/></p>
<!-- 获取 student 的 age 属性并显示 -->
<p>学生成绩:<jsp:getProperty name="student" property="score"/></p>
<!-- 获取 student 的 score 属性并显示 -->
</body>
</html>
## 5.3 bean 的辅助类
除了上面介绍的两个标签外,还有一些辅助类可以用来操作 JavaBean。这些辅助类都位于 javax.servlet.jsp.el 包中,主要有以下几个:
- ExpressionEvaluator:用于解析和计算表达式的值。
- VariableResolver:用于解析变量的名称和值。
- FunctionMapper:用于解析自定义函数的名称和方法。
- Expression:用于表示一个表达式的对象。
这些辅助类可以让我们在 JSP 页面中使用更复杂和灵活的表达式,例如:
```jsp
<%-- 使用 ExpressionEvaluator 解析表达式 --%>
<%
// 创建一个 ExpressionEvaluator 对象
ExpressionEvaluator evaluator = new ExpressionEvaluatorImpl();
// 创建一个 VariableResolver 对象
VariableResolver resolver = new ImplicitObjectELResolver(pageContext);
// 定义一个表达式
String expression = "${student.name + '的年龄是' + student.age}";
// 解析表达式的值
Object value = evaluator.evaluate(expression, String.class, resolver, null);
%>
<p>表达式的值为:<%= value %></p>
```
这样,我们就实现了使用 JavaBean 辅助类在 JSP 页面中解析和计算表达式的功能。