在Java程序或JSP程序中,其实有很多的代码段是可以重复使用的,比如对数据库的操作、用户的有效性检查及某些项特定功能的实现等。为了很好的解决这个问题,提高开发效率,Sun公司推出了JavaBean,简言之,JavaBean这是一个实现了某个功能且供重复使用的Java类。 在JSP中使用JavaBean后,可实现HTML与Java代码的分离,使JSP更易于开发和维护。因此JavaBean成了JSP程序员的必备利器之一。另外,javaBean与javaBeans是同一个概念。
JavaBean定义:是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。
JavaBean规范:
(a)有一个公有的无参构造器
(b)属性可以通过get、set、is(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问
(c)可序列化
JavaBean代码:
1 package player;
2
3 public class PersonBean implements java.io.Serializable {
4
5 /**
6 * name 属性(注意大小写)
7 */
8 private String name = null;
9
10 private boolean deceased = false;
11
12 /** 无参构造器(没有参数) */
13 public PersonBean() {
14 }
15
16 /**
17 * name 属性的Getter方法
18 */
19 public String getName() {
20 return name;
21 }
22
23 /**
24 * name 属性的Setter方法
25 * @param value
26 */
27 public void setName(final String value) {
28 name = value;
29 }
30
31 /**
32 * deceased 属性的Getter方法
33 * 布尔型属性的Getter方法的不同形式(这里使用了is而非get)
34 */
35 public boolean isDeceased() {
36 return deceased;
37 }
38
39 /**
40 * deceased 属性的Setter方法
41 * @param value
42 */
43 public void setDeceased(final boolean value) {
44 deceased = value;
45 }
46 }
在Java类中使用JavaBean的代码:
1 import player.PersonBean;
2
3 /**
4 * <code>TestPersonBean</code>类
5 */
6 public class TestPersonBean {
7 /**
8 * PersonBean 类测试方法的main函数
9 * @param ARGS
10 */
11 public static void main(String[] args) {
12 PersonBean person = new PersonBean();
13
14 person.setName("张三");
15 person.setDeceased(false);
16
17 // 输出: "张三[活着]"
18 System.out.print(person.getName());
19 System.out.println(person.isDeceased() ? " [已故]" : " [活着]");
20 }
21 }
在Jsp中使用JavaBean的两种使用方式:
(a) jsp 中嵌入 java 代码方式访问 javabean
<%@ page import="player.PersonBean" %>
<% TestPersonBean testBean=new TestPersonBean(); %>
<% String name=req.getParameter(“name”);%>
<% testBean.setName(name)%>
<%=testBean.getName()%>
(b) jsp 中使用 <jsp:useBean> 标记符访问 javabean
<jsp:useBean id="person" class="player.PersonBean" scope="page"/>
<jsp:setProperty name="person" property="*"/>
<html>
<body>
姓名:<jsp:getProperty name="person" property="name"/><br/>
已故与否?<jsp:getProperty name="person" property="deceased"/><br/>
<br/>
<form name="beanTest" method="POST" action="testPersonBean.jsp">
输入姓名:<input type="text" name="name" size="50"><br/>
选择选项:
<select name="deceased">
<option value="false">活着</option>
<option value="true">已故</option>
</select>
<input type="submit" value="测试这个JavaBean">
</form>
</body>
</html>
<jsp:useBean>标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean>标签的语法格式如下:
<jsp:useBean id="bean's name" scope="bean's scope" typeSpec/>
在<jsp:useBean>标签主体中使用<jsp:getProperty/>标签来调用getter方法,使用<jsp:setProperty/>标签来调用setter方法,语法格式如下:
<jsp:useBean id="id" class="bean's class" scope="bean's scope">
<jsp:setProperty name="bean's id" property="property name"
value="value"/>
<jsp:getProperty name="bean's id" property="property name"/>
...........
</jsp:useBean>
name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
Jsp程序中使用JavaBean的scope属性:
(a)当scope=application时,我们浏览date.jsp,这时显示出了系统时间。可是不管我们怎么刷新,重新打开一次浏览器,甚至换台机器,它显示的时间始终不变,都是当初的时间(即bean刚创建时得到的系统时间),因为scope=application,所以Bean的实例在内存中只有一份,此时只要不重新启动WEB服务,输出不会变化。
(b)当scope=session时,浏览date.jsp,刷新时显示也不会变化。可是当我们重新打开一浏览器,即一个新的session,系统便再次创建Bean的实例,取得当前系统时间,这时将得到正确的时间。同样,再次刷新新打开的页面(新的session),显示也不会变化。
(c)当scope=page/request(它们的区别只在于包含静态文件时,此处无区别)时,不断刷新页面将不断得到当前系统时间。