Aims:
掌握Javabean动作标签和生命周期。
Introduction:
Javabean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 Javabean API 规范。
接下来给出的是 Javabean 与其它 Java 类相比而言独一无二的特征:
提供一个默认的无参构造器。
需要被序列化并且实现了 Serializable 接口。
可能有一系列可读写属性。
可能有一系列的 getter 或 setter 方法。
Part 1:
Javabean 的属性和动作标签
1. Javabean 的属性:
1、 Javabean的属性可以是任意类型,并且一个Javabean可以有多个属性。每个属性通常都需要具有相应的setter、getter方法,setter方法称为属性改造器,getter方法称为属性访问器。
2、 属性改造器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如:name属性的改造器名称为setName,password属性的改造器名称为setPassword。
3、 属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如:name属性的访问器名称为getName,password属性的访问器名称为getPassword。
4、一个Javabean的某个属性也可以只有set方法或get方法,这样的属性通常也称为只写、只读属性。
2. JSP技术提供了三个关于Javabean 组件的动作标签,即JSP标签,它们分别为:
< jsp:useBean >标签: 用于在JSP页面中查找或实例化一个Javabean组件
< jsp:setProperty >标签: 用于在JSP页面中设置一个Javabean组件的属性
< jsp:getProperty >标签: 用于在JSP页面中获取一个Javabean组件的属性
< jsp:useBean >标签:
< jsp:useBean >标签用于在指定的域范围(page、request、session、application)内查找指定名称的Javabean对象:翻译到servlet中。
注意:
如果存在则直接返回该Javabean对象的引用。
如果不存在则实例化一个新的Javabean对象并将它以指定的名称存储到指定的域范围中。
< jsp:sertProperty >标签
< jsp:setProperty >标签用于设置和访问Javabean对象的属性。
< jsp:getProperty >标签
< jsp:getProperty >标签用于读取Javabean对象的属性,也就是调用Javabean对象的getter方法,然后将读取的属性值转换为字符串后插入进输出的响应正文中。
Part 2:
Javabean 的作用域
Javabean 的生命周期存在于 4 种范围中,分别为 page、request、session 和 application,它们通过 < jsp:useBean > 标签的 scope 属性进行设置。
这四种范围虽然存在很大区别,但它们与 JSP 页面中的 page、request、session 和 application 范围相对应。
1. page 范围:与 JSP 的 request 生命周期相对应,Javabean的生命周期存在于request对象之中,当 request 对象销毁时 Javabean 也被销毁。
2. request 范围:与 JSP 的 request 生命周期相对应,Javabean 的生命周期存在于 request 对象之中,当 request 对象销毁时 Javabean 也被销毁。
3. session 范围:与 JSP 的 session 生命周期相对应,Javabean 的生命周期存在于 session会话之中,当session超时或会话结束时 Javabean 被销毁。
4. application 范围:与 JSP 的 application 生命周期相对应,在各个用户与服务器之间共享,只有当服务器关闭时 Javabean 才被销毁。
这四种作用范围与 Javabean 的生命周期是息息相关的,当 Javabean 被创建后,通过 < jsp:setProperty > 标签与 < jsp:getProperty > 标签调用时,将会按照 page、request、session 和 application 的顺序来查找这个 Javabean 实例,直至找到一个实例对象为止,如果在这四个范围内都找不到 Javabean 实例,则抛出异常。
实例:通过一个简单的计数器 Javabean 对 session 与 application 范围进行比较,其中计数器的 Javabean 对象为 Counter 类。
Counter.java 代码如下:
package com.Lee;
public class Counter {
private int count;//访问数量
public int getCount() {
return ++count;
}
}
创建计数器对象后,在 index.jsp 页面分别创建 session 与 application 范围内的实例对象。
index.jsp 代码如下:
pageEncoding="UTF-8"%>
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
计数器
Javabean的作用域 | |
session | |
application |
此页面分别输出了 session 范围与 application 范围的计数器的数值,刷新页面后其数值不断自增,如下图:
这说明了 Counter 对象实例存在于此次会话之中。
当开启一个新的浏览器窗口时,session 的生命周期结束,与之对应的 Counter 对象也将被销毁,但 application 范围中的 Counter 对象依然存在,如下图:
Conclusions:
Model1 (JSP+Javabean) 与 Model(JSP+Servlet+Javabean) 是JSP开发Web应用程序的两种架构模式。Model1 开发模式比较适合小型项目的开发,但由于其自身缺陷,不能达到一种理想的设计状态,通常采用 Model2 模式遵循 MVC 设计理念进行实际开发。在这两种开发构架模式中,都离不开 Javabean 组件的使用!