第 4 章 JavaBean 我 们 所 开 发 出 来 的 软 件, 除 了 能 完 成 预 设 功 能 以 外, 还 要 考 虑 如 下 几 点 : 代 码 调 试 和 维 护 简 单 ; 软 件 系 统 功 能 容 易 扩 展 ; 所 写 代 码 易 于 重 用 在 正 式 讨 论 JavaBean 之 前, 有 必 要 就 JSP 技 术 给 大 家 一 个 全 貌 介 绍 JSP 页 面 就 是 含 有 JSP 元 素 的 web 页 面, 这 个 web 页 面 可 以 是 HTML 的 XML 的, 或 者 是 其 他 标 记 语 言 网 页 也 就 是 说 将 HTML 置 于 JSP 页 面 中, 并 增 加 一 些 JSP 元 素 以 生 成 页 面 中 的 动 态 部 分 请 求 处 理 仍 然 由 Servlet 负 责, 而 业 务 逻 辑 则 可 以 由 JavaBeans 或 EJB 组 件 处 理 引 入 JSP 的 目 的 就 是 将 请 求 处 理 业 务 逻 辑 表 示 三 个 部 分 分 离 如 果 仅 仅 是 开 发 简 单 的 JSP 页 面, 完 全 可 以 将 HTML 代 码 和 业 务 逻 辑 代 码 放 在 一 起 来 构 成 一 个 JSP 页 面, 虽 然 代 码 有 些 零 乱, 但 由 于 此 时 web 应 用 复 杂 度 不 高, 代 码 调 试 和 维 护 的 难 度 不 会 很 大 但 随 着 web 应 用 的 复 杂 度 的 不 断 提 高, 上 述 零 乱 的 代 码 编 写 方 式, 会 给 日 后 的 维 护 和 系 统 功 能 扩 展 带 来 不 小 的 麻 烦, 同 时 这 种 做 法, 也 不 利 于 软 件 代 码 的 重 用 MVC(Model View Controller) 是 20 世 纪 80 年 代 出 现 的 一 种 著 名 的 设 计 模 式, 其 核 心 思 想 是 分 层 设 计 的 理 念, 这 样 设 计 的 优 势 是 各 层 分 工 明 确, 层 与 层 之 间 相 对 独 立, 耦 合 性 低, 这 种 设 计 模 式 有 利 于 系 统 的 可 维 护 性 和 可 扩 展 性, 便 于 进 行 团 队 开 发 MVC 提 供 了 一 种 系 统 架 构 模 式, 具 体 到 不 同 的 应 用 场 合, 它 又 很 多 具 体 的 实 现 方 式, 比 如 JSP 应 用 中 的 JSP Servlet JavaBean 三 层 模 型, 就 是 MVC 在 web 应 用 开 发 中 的 一 种 具 体 体 现 通 常 JavaBean 作 数 据 的 载 体, 可 以 表 示 一 个 产 品 订 单, 或 者 一 个 人, 它 所 承 载 的 信 息 可 能 在 JSP 中 用 作 动 态 内 容, 也 可 能 在 一 个 分 布 式 系 统 的 各 个 部 分 之 间 传 递 数 据 和 信 息 尤 其 当 JSP 和 Servlet 配 合 使 用 时, 就 需 要 bean 存 在 于 它 们 两 者 之 间, 比 如 可 以 由 Servlet 基 于 数 据 创 建 bean, 再 传 递 给 一 个 JSP 页 面 以 生 成 动 态 内 容 JSP 中 对 JavaBean 的 另 一 个 重 要 应 用, 就 是 可 以 将 大 部 分 功 能 封 装 在 JavaBean 中, 使 得 JSP 页 面 中 的 HTML 代 码 和 业 务 逻 辑 代 码 分 离, 从 而 使 页 面 更 简 洁 利 于 维 护 使 用 JavaBean 不 仅 能 缩 短 开 发 时 间 ( 可 以 直 接 利 用 经 测 试 可 靠 的 已 有 组 件, 避 免 了 重 复 开 发 ), 也 为 今 后 对 Web 应 用 系 统 的 扩 展 带 来 更 多 的 可 伸 缩 性 正 如 前 面 已 经 提 到 的 那 样,JSP 主 要 用 于 生 成 页 面 中 的 动 态 部 分, 动 态 内 容 可 能 来 自 于 用 户 的 输 入 数 据 库 动 态 改 变 的 数 据 其 他 系 统 状 态 的 改 变 等,JavaBean 就 可 以 作 为 动 态 内 容 所 对 应 的 数 据 的 载 体 尽 管 本 章 主 要 讨 论 JavaBean, 但 要 把 数 据 作 为 动 态 内
容 嵌 入 到 网 页 的 合 适 位 置 上 同 时 又 要 保 持 代 码 的 清 晰 简 单, 则 不 可 避 免 的 涉 及 到 JSP 标 准 动 作 JSP 标 准 标 记 库 (JSTL) 表 达 式 语 言 (EL) 等 与 动 态 网 页 生 成 相 关 的 技 术 JSP 标 准 动 作 在 第 二 章 已 经 详 细 讨 论 过,JSTL 和 EL 表 达 式 本 章 将 会 用 到, 目 的 是 借 此 先 给 大 家 在 编 制 动 态 网 页 方 面 展 现 一 个 尽 可 能 实 用 和 完 整 的 技 术 全 貌, 关 于 JSTL 和 EL 的 详 细 讨 论 将 在 第 八 章 和 第 九 章 进 行 本 章 任 务 1 任 务 要 求 2 任 务 涉 及 知 识 点 分 解 3 任 务 演 示 4.1 JavaBean 的 概 念 4.1.1 什 么 是 JavaBean JavaBean 是 一 种 基 于 Java 的 软 件 组 件 模 型 JSP 对 于 在 Web 应 用 中 集 成 JavaBean 组 件 提 供 了 完 善 的 支 持 从 编 程 的 角 度 看,JavaBean 就 是 符 合 一 定 条 件 的 类 的 实 例,SUN 公 司 为 JavaBean 规 定 了 如 下 规 范 : 1. JavaBean 必 须 是 一 个 public 的 可 实 例 化 的 类, 以 保 证 能 被 引 用 如 public class Student{ 2. JavaBean 中 如 果 有 构 造 方 法, 那 么 该 方 法 是 public 的 无 参 方 法 3. JavaBean 中 的 实 例 变 量 原 则 上 都 是 private 的, 都 有 相 应 的 public 的 get 和 set 方 法, 用 于 更 改 或 获 取 该 成 员 的 值, 此 时 称 这 样 的 变 量 成 员 叫 属 性 4. JavaBean 属 性 的 命 名 一 般 采 用 驼 峰 命 名 法, 即 以 小 写 字 母 开 头, 如 name, 则 相 应 的 get 和 set 方 法 命 名 为 getname() 和 setname() 5. JavaBean 的 get 和 set 方 法 并 不 一 定 成 对 出 现, 如 果 只 有 set 方 法, 则 对 应 的 属 性 为 只 写 属 性, 如 果 只 有 get 方 法, 则 对 应 属 性 为 只 读 属 性 6. 对 于 boolean 类 型 的 属 性, 允 许 使 用 is 代 替 上 面 的 get 和 set 方 法 但 是 关 于 get/set 方 法 的 命 名 还 有 些 特 殊 情 况 : 1. 如 果 属 性 名 的 第 二 个 字 母 为 大 写, 则 直 接 作 为 get 或 set 的 后 缀 如 属 性 名 为 sname, 则 对 应 的 set/get 方 法 为 setsname/getsname 2. 如 果 属 性 名 的 前 二 个 字 母 均 为 大 写, 则 直 接 作 为 get 或 set 的 后 缀 如 属 性 名 为
URL, 则 对 应 的 set/get 方 法 为 seturl/geturl 3. 属 性 名 第 一 个 字 母 大 写 是 不 允 许 的 例 4.1 JavaBean 举 例 4.1.2 JavaBean 在 Web 编 程 中 的 应 用 分 类 在 数 据 持 久 页 面 请 求 会 话 业 务 逻 辑 处 理 等 方 面 JavaBean 有 着 广 泛 的 应 用 JavaBean 组 件 可 以 用 来 执 行 复 杂 的 计 算 任 务, 或 负 责 与 数 据 库 的 交 互 以 及 数 据 提 取 等 按 照 应 用 形 式, 一 般 分 为 两 大 类 : 1. 值 bean(value bean) 在 Web 应 用 开 发 中, 值 bean 主 要 用 于 封 装 数 据, 如 捕 获 表 单 的 输 入 并 保 存 或 者 封 装 数 据 库 尤 其 在 MVC 设 计 模 式 中,Servlet JSP 数 据 库 之 间 传 递 数 据 会 大 量 使 用 这 样 的 JavaBean, 此 时 的 值 Bean 可 以 充 当 数 据 库 与 应 用 程 序 之 间 的 桥 梁 2) 工 具 bean(utility bean) 这 种 Bean 是 封 装 了 用 于 进 行 业 务 逻 辑 处 理 的 代 码, 如 JDBC 连 接 池 数 据 库 操 作 数 据 计 算 处 理 等 当 然, 有 时 Bean 具 有 双 重 功 能, 既 有 业 务 逻 辑 的 处 理 功 能, 又 具 有 一 些 需 要 进 出 的 属 性 值, 此 时 即 可 以 看 作 是 value bean, 也 可 以 看 作 是 utility bean 4.2.3 JavaBean 的 属 性 分 类 4.2.4 利 用 监 听 器 实 现 多 个 JavaBean 之 间 的 信 息 通 信 4.2 JavaBean 的 定 义 4.2.1 JavaBean 的 编 写 JavaBean 分 为 可 视 化 组 件 和 非 可 视 化 组 件 在 Web 应 用 开 发 中 主 要 使 用 非 可 视 化 JavaBean
JavaBean 就 是 一 个 满 足 规 范 的 Java 类, 所 以 只 要 会 写 Java 类 就 能 编 写 一 个 JavaBean 类 在 Web 应 用 程 序 中,JavaBean 这 个 类 的 一 个 实 例 化 对 象 就 是 一 个 具 体 的 bean 为 了 能 够 让 使 用 这 个 bean 的 Web 应 用 程 序 引 擎 能 够 正 确 的 解 析 并 使 用 相 应 的 属 性 和 方 法, 只 需 要 遵 循 上 一 节 中 所 说 的 JavaBean 规 范 即 可 例 4.2 值 bean 举 例 package circle; public class Circle { private double radius;// 定 义 圆 的 半 径, 访 问 属 性 为 私 有 private double circlearea;// 定 义 圆 面 积 private double circlelength;// 定 义 圆 周 长 public Circle(){ radius=0; circlearea=0; circlelength=0; // 下 面 定 义 每 个 属 性 相 应 的 get/set 方 法 public double getradius() { return radius; public void setradius(double radius) { this.radius = radius; // 由 于 圆 的 面 积 由 半 径 计 算 而 得, 所 以 面 积 和 周 长 属 性 不 需 要 set 方 法 public double getcirclearea() { circlearea=math.pi*radius*radius; return circlearea; public double getcirclelength() { circlelength=2*math.pi*radius; return circlelength; 例 4.3 工 具 bean 举 例
4.2.2 保 存 JavaBean 为 了 让 JSP 页 面 使 用 bean, 必 须 保 证 能 够 让 Tomacat 服 务 器 准 确 的 找 到 JavaBean 的 字 节 码 文 件, 然 后 创 建 一 个 bean 对 象 为 此,JavaBean 相 应 的 字 节 码 文 件 必 须 保 存 在 特 定 的 目 录 中 本 书 使 用 Eclipse 作 为 开 发 工 具, 它 能 够 自 动 将 文 件 分 门 别 类 的 摆 放 到 合 适 的 路 径 下, 请 大 家 自 己 观 察, 这 里 不 再 赘 述 4.3 在 JSP 中 使 用 JavaBean 前 面 已 经 分 析 使 用 JavaBean 的 好 处 是 使 得 JSP 页 面 中 的 HTML 代 码 和 业 务 逻 辑 代 码 分 离, 从 而 使 页 面 更 简 洁 利 于 维 护, 而 JavaBean 本 身 就 具 有 很 强 的 代 码 复 用 性,JSP 页 面 可 以 很 方 便 的 通 过 使 用 JSP 的 动 作 标 记 使 用 JavaBean 下 面 通 过 一 个 例 子 来 说 明 JavaBean 的 使 用 4.3.1 加 载 bean 在 JSP 页 面 中 使 用 JSP 动 作 标 记 usebean 来 加 载 bean bean 本 质 上 是 对 象, 因 此 当 要 加 载 bean 时 必 须 首 先 定 义 好 相 应 的 类, 否 则 加 载 将 会 失 败 例 如 : <jsp:usebean id="c" class="circle.circle" scope="page"></jsp:usebean> 上 例 中 <jsp:usebean></jsp:usebean> 是 JSP 动 作, 该 动 作 的 作 用 是 实 例 化 一 个 bean 并 存 放 在 JSP 内 置 对 象 pagecontent 中 bean 一 旦 被 实 例 化,id 所 指 示 的 名 称 即 为 bean 的 名 称 class 所 指 示 的 是 bean 对 象 所 对 应 的 类, 而 scope 规 定 了 该 bean 的 作 用 范 围 关 于 bean 的 作 用 范 围, 将 在 后 面 的 内 容 详 细 讨 论 4.3.2 获 取 和 设 置 bean 的 属 性 值 当 在 JSP 页 面 中 使 用 usebean 动 作 标 记 实 例 化 一 个 bean 后, 就 可 以 使 用 setproperty 和 getproperty 动 作 设 置 和 修 改 bean 的 属 性 例 如 : <jsp:setproperty name="c" property="radius" /> <h1> 园 的 面 积 是 :<%=c.getcirclearea() %> </h1> <h1> 园 的 周 长 是 :<%=c.getcirclelength() %> </h1> 1.setProperty setproperty 动 作 标 记 的 作 用 是 使 用 bean 中 的 setxxx() 方 法 设 置 bean 的 属 性 值, 下 面 表 中 介 绍 的 是 <jsp:setproperty> 标 记 中 可 以 使 用 的 属 性 含 义 表 4 1 <jsp:setproperty> 动 作 各 属 性 含 义
Name Property Param Value Bean 实 例 的 名 字, 必 须 是 <jsp:usebean> 中 通 过 id 属 性 指 定 的 名 字 被 设 置 的 属 性 的 名 字 如 果 值 是 *, 标 签 就 会 在 request 对 象 中 查 找 所 有 的 请 求 参 数, 看 参 数 的 名 字 和 Bean 属 性 的 名 字 是 否 相 同, 如 果 找 到 匹 配 的 参 数 和 属 性, 就 会 按 照 正 确 的 类 型 ( 自 动 进 行 类 型 转 换 ) 将 参 数 的 值 设 置 为 属 性 的 值 指 定 请 求 对 象 中 参 数 的 名 字 在 设 置 Bean 的 属 性 时, 如 果 请 求 参 数 的 名 字 和 Bean 属 性 的 名 字 不 同, 可 以 用 param 来 指 定 参 数 的 名 字 如 果 没 有 使 用 param, 那 么 就 认 为 请 求 参 数 的 名 字 和 Bean 属 性 的 名 字 相 同 指 定 要 赋 给 Bean 属 性 的 值 在 <jsp:setproperty> 元 素 中, 不 能 同 时 出 现 param 和 value 属 性 setproperty 的 用 法 主 要 有 4 种 : 给 指 定 的 bean 属 性 设 置 值 例 如 : <jsp:setproperty name="c" property="radius" /> property="radius", 意 思 是 将 request 对 象 中 名 为 radius 的 参 数 值 对 应 赋 值 给 bean 的 radius 属 性 自 动 匹 配 设 置 bean 的 属 性 值 例 如 : <jsp:setproperty name="c" property="*" /> property= *, 意 思 是 将 request 对 象 中 所 有 的 请 求 参 数 名 与 bean 属 性 名 进 行 比 较, 如 果 相 同, 则 将 request 对 象 中 的 参 数 值 对 应 地 赋 值 给 bean 的 同 名 属 性 将 param 值 设 置 给 bean 的 属 性 例 如 : <jsp:setproperty name="c" property="radius" param= r /> 这 种 用 法 主 要 出 现 在 当 request 参 数 名 与 bean 的 属 性 名 不 同 的 情 况 下, 本 例 意 为 将 request 对 象 中 名 为 r 的 参 数 值 给 bean 中 名 为 radius 的 属 性 将 value 值 设 置 给 bean 的 属 性 例 如 : <jsp:setproperty name="c" property="radius" value="10" /> 此 种 用 法 意 图 在 使 用 value 的 值 来 设 置 bean 的 属 性 值, 而 不 在 需 要 request 对 象 中 的 参 数 值 了 2.getProperty getproperty 动 作 标 记 的 作 用 是 使 用 bean 中 的 getxxx() 方 法 获 取 bean 的 属 性 值 该 标 记 可 以 使 用 name property 等 属 性, 含 义 与 setproperty 中 的 name property 属 性 类 似 例 如 : <h1> 园 的 半 径 是 :<jsp:getproperty name="c" property="radius" /> </h1> 上 面 代 码 作 用 是 获 取 名 为 c 的 bean 的 radius 属 性 值 并 输 出 到 网 页 上 例 4.3 在 Eclipse 中 创 建 一 个 Dynamic web project, 在 项 目 中 定 义 一 个 bean 命 名 为 Circle.java( 代 码 参 见 例 4.2) 以 及 jsp 页 面 index.jsp calculate.jsp, 其 中 index.jsp 用 于 输 入 圆 半 径 并 提 交 给 calculate.jsp, 后 者 计 算 并 输 出 圆 的 面 积 周 长 等 其 中 Circle.java index.jsp calculate.jsp 在 项 目 中 的 存 放 位 置 见 下 图 所 示
源 代 码 如 下 : Circle.java:( 参 见 例 4.2) Index.jsp: <%@ page language="java" contenttype="text/html; charset=gbk" pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title>insert title here</title> </head> <body> <form method="post" action="calculate.jsp" name="form"> <p> </p> <table width="494" border="1" height="111"> <tbody> <tr> <td> 请 输 入 半 径 :</td> <td> <input type="text" name="radius"></td> </tr> <tr> <td> <input type="submit" value=" 提 交 " name="sub"></td> <td> </td> </tr> </tbody> </table> </form> </body> </html> Calculate.jsp: <%@ page language="java" contenttype="text/html; charset=gbk"
pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title>insert title here</title> </head> <body> <jsp:usebean id="c" class="circle.circle" scope="page"></jsp:usebean> <%--c.setradius(10); --%> <jsp:setproperty name="c" property="radius" /> <h1> 园 的 半 径 是 :<jsp:getproperty name="c" property="radius" /></h1> <h1> 园 的 面 积 是 :<jsp:getproperty name="c" property="circlearea"/></h1> <h1> 园 的 周 长 是 :<jsp:getproperty name="c" property="circlelength"/></h1> </body> </html> 4.4 JavaBean 在 四 种 作 用 范 围 中 的 使 用 JavaBean 的 本 质 是 对 象, 而 对 象 根 据 其 定 义 和 生 成 的 位 置 变 现 出 不 同 的 作 用 范 围 下 面 通 过 一 个 网 页 访 问 记 数 器 的 例 子 来 测 试 JavaBean 的 作 用 范 围 作 为 记 数 器 的 JavaBean 源 代 码 如 下 : Count.java: package count; public class Count { private int sum=0; public int getsum() { return ++sum; public void setsum(int sum) { this.sum = sum; 4.4.1 page 范 围 的 JavaBean Page 范 围 的 Bean 仅 在 创 建 它 们 的 网 页 中 才 有 效, 一 旦 当 请 求 指 向 其 他 资 源 时, 比 如 跳 转 到 另 一 个 网 页, 那 么 该 Bean 就 将 会 被 释 放 例 4.4 测 试 page 范 围 的 Bean First.jsp: <%@ page language="java" contenttype="text/html; charset=gbk"
pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title> 测 试 page 范 围 的 bean </title> </head> <body> <h1> 第 一 页 </h1> <jsp:usebean id="my" scope="page" class="count.count"></jsp:usebean> 访 问 第 <jsp:getproperty name="my" property="sum" /> 次!!!! <jsp:forward page="second.jsp"></jsp:forward> </body> </html> Second.jsp: <%@ page language="java" contenttype="text/html; charset=gbk" pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title> 测 试 page 范 围 的 bean</title> </head> <body> <h1> 第 2 页 </h1> <jsp:usebean id="my" class="count.count" scope="page"></jsp:usebean> 访 问 第 <jsp:getproperty name="my" property="sum" /> 次!!!! </body> </html> 先 运 行 First.jsp, 运 行 结 果 如 下 :
图 4-1 例 4.4 运 行 结 果 这 个 例 子 中, 先 运 行 First.jsp, 再 用 Forward 从 First.jsp 转 接 到 Second.jsp 在 First.jsp 中 创 建 一 个 记 数 器 Bean, 并 输 出 此 时 Bean 的 属 性 sum 的 值, 此 时 sum 的 值 为 1 然 后 用 <jsp:forward> 动 作 将 请 求 转 接 到 Second.jsp, 在 Second.jsp 中, 再 次 调 用 名 为 my 的 Bean, 并 输 出 这 个 Bean 的 属 性 sum 的 值, 结 果 仍 然 是 1 这 个 测 试 结 果 表 明, 在 First.jsp 中 创 建 的 Bean 并 未 传 递 到 Second.jsp, 也 就 是 说 Second.jsp 又 重 新 创 建 了 一 个 名 为 my 的 Bean, 而 原 先 在 First.jsp 中 创 建 的 Bean 则 随 着 网 页 的 切 换 释 放 了 这 个 测 试 例 子 告 诉 我 们,page 范 围 的 Bean 的 作 用 范 围 只 限 于 创 建 Bean 的 网 页, 一 旦 离 开 该 网 页, 这 个 Bean 就 释 放 了 4.4.2 request 范 围 的 JavaBean 在 HTTP 中, 浏 览 器 给 服 务 器 发 送 一 个 请 求 开 始 到 服 务 器 返 回 给 浏 览 器 一 个 响 应 结 束, 这 个 期 间 称 为 一 个 request 过 程 需 要 注 意 的 是, 在 一 个 请 求 过 程 中, 并 不 一 定 只 能 处 理 一 个 页 面, 可 以 使 用 forward 等 处 理 一 系 列 页 面 后 再 结 束 这 个 请 求 因 此, 只 要 Bean 是 request 范 围 的, 它 就 可 以 在 一 个 请 求 过 程 中 的 所 有 页 面 所 共 享, 这 点 是 区 别 于 page 范 围 的 Bean 的 例 4.5 测 试 request 范 围 的 Bean 本 例 与 例 4.5 唯 一 的 区 别 是 First.jsp Second.jsp 中 的 Bean 的 scope 被 规 定 为 request 范 围, 但 结 果 却 发 生 了 本 质 的 变 化
图 4-2 例 4.5 运 行 结 果 请 比 较 例 4.4 和 例 4.5 运 行 结 果 的 不 同 分 析 原 因 我 们 不 难 发 现, 本 例 Bean 的 Scope 是 request 范 围, 所 以 当 由 First.jsp 跳 转 到 Second.jsp 时,2 个 页 面 共 享 同 一 个 Bean, 也 即 是 在 First.jsp 中 创 建 的 Bean, 在 这 个 Bean 中 的 属 性 sum 的 值 经 过 2 次 累 计 结 果 为 2 4.4.3 session 范 围 的 JavaBean 该 Bean 的 有 效 作 用 范 围 是 用 户 的 会 话 期 间, 所 谓 的 一 个 会 话 期 间 是 指 从 登 陆 某 个 web 开 始 到 断 开 为 止, 这 期 间 只 要 用 户 不 离 开 这 个 网 站, 则 页 面 中 凡 是 scope 定 义 为 session 范 围 的 Bean 可 以 始 终 有 效 比 如 在 购 物 网 站 中, 但 某 个 客 户 登 陆 网 站 进 行 采 购 时, 有 可 能 在 网 站 内 的 多 个 购 物 页 面 中 进 行 购 物, 而 整 个 购 物 过 程 中 购 物 车 始 终 只 有 一 个, 通 常 这 个 购 物 车 的 scope 被 定 义 为 session 范 围 下 面 的 例 子 中 我 们 将 编 写 2 个 网 页, 其 中 名 为 First.jsp 的 页 面 中 有 链 接 可 以 链 接 到 Second.jsp 中, 运 行 后 我 们 会 发 现, 当 从 First.jsp 页 面 链 接 到 Second.jsp 页 面 时, session 范 围 的 Bean 始 终 有 效 你 也 可 以 将 scope 分 别 定 义 为 page 和 request 范 围 测 试 一 下 结 果 有 何 不 同, 你 能 解 释 为 何 不 同 吗? 例 4.6 测 试 session 范 围 的 JavaBean First.jsp: <%@ page language="java" contenttype="text/html; charset=gbk" pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title> 测 试 session 范 围 的 bean</title> </head> <body> <h1>session bean</h1>
<jsp:usebean id="my" scope="session" class="count.count"></jsp:usebean> <% session.setmaxinactiveinterval(10); %> 访 问 第 <jsp:getproperty name="my" property="sum" /> 次!!!! <a href="second.jsp"> 点 击 这 里 链 接 到 Second.jsp</a> </body> </html> Second.jsp: <%@ page language="java" contenttype="text/html; charset=gbk" pageencoding="gbk"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title> 测 试 session 范 围 的 bean</title> </head> <body> <jsp:usebean id="my"scope="session" class="count.count"></jsp:usebean> 访 问 第 <jsp:getproperty name="my" property="sum" /> 次!!!! </body> </html> 运 行 结 果 如 下
图 4-3 例 4.6 运 行 结 果 这 里 需 要 说 明 的 是, 在 First.jsp 中 增 加 了 如 下 代 码 : <% session.setmaxinactiveinterval(10); %> 其 作 用 是 是 设 置 session 的 有 效 时 间 为 10 秒 需 要 注 意 的 是, 如 果 JSP 页 面 中 的 Bean 的 scope 被 定 义 为 session, 那 么 当 不 同 用 户 同 时 访 问 这 个 JSP 页 面 时, 每 个 用 户 都 拥 有 自 己 的 session Bean 而 不 会 相 互 影 响 4.4.4 Application 范 围 的 JavaBean Application 范 围 的 Bean 一 旦 创 建, 这 个 Bean 会 被 访 问 这 个 Web 网 站 的 所 有 用 户 所 共 享, 也 就 是 说 这 样 的 Bean 创 建 后, 除 非 重 启 web 服 务 器, 或 调 用 代 码 将 Bean 撤 销, 否 则 此 Bean 会 始 终 驻 留 在 服 务 器 内 存 中, 不 同 客 户 访 问 该 网 站, 共 享 这 个 Bean 中 的 数 据 Application 范 围 的 Bean 的 使 用 例 子 很 多, 比 如 网 站 在 线 人 数 统 计 就 需 要 这 样 的 Bean 4.5 综 合 项 目 设 计 与 发 布 4.5.1 综 合 项 目 设 计 4.5.2 综 合 项 目 发 布 本 章 小 结 习 题 4