JavaWeb复习——task04:JavaBean 动作标签和作用域

Aims:

掌握Javabean动作标签和生命周期。

Introduction:

Javabean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 Javabean API 规范。

接下来给出的是 Javabean 与其它 Java 类相比而言独一无二的特征:

  1. 提供一个默认的无参构造器。
  2. 需要被序列化并且实现了 Serializable 接口。
  3. 可能有一系列可读写属性。
  4. 可能有一系列的 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 代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>计数器</title>
</head>
<body>
	<!-- 创建一个session范围的 Counter 对象 -->
	<jsp:useBean id="counter_session" class="com.Lee.Counter" scope="session"/>
	<!-- 创建一个application范围的 Counter 对象 -->
	<jsp:useBean id="counter_application" class="com.Lee.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 property="count" name="counter_session"/></td>
		</tr>
		<tr>
			<td align="right">application</td>
			<td><jsp:getProperty property="count" name="counter_application"/></td>
		</tr>
	</table>
</body>
</html>

此页面分别输出了 session 范围与 application 范围的计数器的数值,刷新页面后其数值不断自增,如下图:

JavaWeb复习——task04:JavaBean 动作标签和作用域

这说明了 Counter 对象实例存在于此次会话之中。

当开启一个新的浏览器窗口时,session 的生命周期结束,与之对应的 Counter 对象也将被销毁,但 application 范围中的 Counter 对象依然存在,如下图:
JavaWeb复习——task04:JavaBean 动作标签和作用域


Conclusions:

Model1 (JSP+Javabean) 与 Model(JSP+Servlet+Javabean) 是JSP开发Web应用程序的两种架构模式。Model1 开发模式比较适合小型项目的开发,但由于其自身缺陷,不能达到一种理想的设计状态,通常采用 Model2 模式遵循 MVC 设计理念进行实际开发。在这两种开发构架模式中,都离不开 Javabean 组件的使用!

上一篇:JQuery日记_5.13 Sizzle选择器(六)选择器的效率


下一篇:JavaBean技术