Servlet技术

Similar documents
I

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

修改版-操作手册.doc

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

《C语言基础入门》课程教学大纲

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

登录、注册功能的测试用例设计.doc

第2章 数据类型、常量与变量

Cybozu Garoon 3 管理员手册

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

国债回购交易业务指引


全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

上海证券交易所会议纪要

深圳市新亚电子制程股份有限公司

2 熟 悉 Visual Basic 的 集 成 开 发 环 境 3 了 解 可 视 化 面 向 对 象 编 程 事 件 驱 动 交 互 式 开 发 等 基 本 概 念 4 了 解 Visual Basic 的 特 点 环 境 要 求 与 安 装 方 法 1 Visual Basic 开 发 应 用

Template BR_Rec_2005.dot

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

微软用户

云信Linux SSH认证代理用户手册

世华财讯模拟操作手册

通用短信平台HTTP接口使用说明V1.0.4

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

第 一 部 分 MagiCAD for Revit 安 装 流 程

全国教师资格认定管理信息系统

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

·岗位设置管理流程

工 程 造 价 咨 询 企 业 管 理 系 统 操 作 手 册 目 录 1 造 价 企 业 登 录 企 业 基 本 信 息 查 看 企 业 人 员 信 息 查 看 企 业 基 本 信 息 操 作 企 业 简 介 企 业 章

目 录 第 一 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 硬 件 使 用 介 绍... 3 第 二 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 管 理 员 端 功 能 使 用 介 绍 系 统 管 理 员 登 陆 班

4 进 入 交 互 区 设 置 的 组 件 管 理, 在 组 件 管 理 中, 教 师 可 以 选 择 课 程 空 间 中 的 所 有 组 件, 并 通 过 点 击 启 用 或 不 启 用 选 定 组 件 在 课 程 空 间 中 的 显 示 5 进 入 工 作 室 管 理 的 工 作 室 首 页,

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

操作手册

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

徐天宏:《基因天堂》.doc

全国艺术科学规划项目

标题

øÕªß∂À≤Ÿ◊˜ ÷≤·

目 录 页 1. 欢 迎 使 用 网 上 预 约 面 谈 访 问 系 统 新 用 户 新 用 户 登 入 帐 户 程 序 启 动 网 上 预 约 面 谈 访 问 帐 户 核 对 帐 户 的 地 址 资 料

Microsoft Word - 第3章.doc

GB

<4D F736F F D20B3D6B2D6CFDEB6EEB1EDB8F1D7EED6D52E646F63>

Microsoft Word - 文件汇编.doc

电信系教学大纲的基本规范

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

2006年顺德区高中阶段学校招生录取分数线

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审

四川省农村义务教育学生

教师上报成绩流程图

乐视云视频发行平台 操作手册 V1.1

生产支援功能 使用说明书(IP-110 篇)

一、资质申请

珠江钢琴股东大会

上证指数

 编号:

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

合 并 计 算 配 售 对 象 持 有 多 个 证 券 账 户 的, 多 个 证 券 账 户 市 值 合 并 计 算 确 认 多 个 证 券 账 户 为 同 一 配 售 对 象 持 有 的 原 则 为 证 券 账 户 注 册 资 料 中 的 账 户 持 有 人 名 称 有 效 身 份 证 明 文 件

证券代码: 证券简称:长城电脑 公告编号:

三门峡市质量技术监督局清单公示

注 意 : 如 上 图 所 示, 网 上 缴 费 (12 月 3 日 至 10 日 ) 与 春 季 高 考 现 场 确 认 工 作 (12 月 3 日 至 6 日 ) 同 时 进 行, 没 有 经 过 现 场 确 认 和 确 认 信 息 没 有 上 传 到 服 务 器 的 考 生 不 能 网 上 缴

中 国 软 科 学 年 第 期!!!

系统设计文档_样稿管理模块 V1.1_.doc

第3章 创建数据库

B-002 行 政 处 罚 在 气 象 探 测 环 境 保 护 范 围 内 从 事 危 害 气 象 探 测 环 境 活 动 的 处 罚 中 华 人 民 共 和 国 气 象 法 第 三 十 五 条 第 一 款 第 二 项 B-003 行 政 处 罚 在

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

<443A5C6D B5C30312EB9A4D7F7CEC4B5B55C30322EBACFCDACCEC4B5B55C C30342EC8CBC9E7CCFC5C31332ECFEEC4BFC5E0D1B55C E30385C322EB2D9D7F7CAD6B2E12E646F63>

物 流 从 业 人 员 职 业 能 力 等 级 证 书 分 为 四 个 级 别, 分 别 为 初 级 助 理 级 中 级 和 高 级 ; 采 购 从 业 人 员 职 业 能 力 等 级 证 书 分 为 三 个 级 别, 分 别 为 中 级 高 级 和 注 册 级 请 各 有 关 单 位 按 照 通


中国石化油品销售企业CRM调研报告

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

中国银行股份有限公司首次公开发行A股发行安排及初步询价公告

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

业务方案篇

ETF、分级基金规模、份额变化统计

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

目 录 版 本 更 新 说 明 导 读 读 者 对 象 手 册 内 容 简 介 软 件 简 介 基 本 术 语 技 术 支 持 基 本 流 程 操 作 步 骤... 8

新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

上海证券交易所会议纪要

火车浏览器脚本制作教程

Microsoft Word - 第7章 图表反转形态.doc

证监会行政审批事项目录

<4D F736F F D20D0A3B7A2A1B A1B BAC5B9D8D3DAD7E9D6AFBFAAD5B9C8ABD0A3BDCCD6B0B9A4B8DACEBBC6B8D3C3B1E4B6AFB9A4D7F7B5C4CDA8D6AA2E646F63>

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

四川省卫生厅关于开展医疗美容主诊医师资格考试及换证工作的通知

关于修订《沪市股票上网发行资金申购

目 录 一 插 入 您 的 保 密 杀 毒 U 盘 3 二 控 制 面 板 USB SECURE ANTIVIRUS 实 时 监 控 USB SECURE ANTIVIRUS 手 动 扫 描 USB SECURE ANTIVIRUS 开 放 空 间 存 取 12

ICS 35

Transcription:

Servlet 技 术 1

复 习 几 个 要 点 2

请 求 (request) 用 户 何 时 发 起 一 个 请 求 点 击 一 个 链 接 提 交 一 个 表 单 在 地 址 栏 键 入 一 个 Web 地 址! 请 求 通 过 URL 来 指 定 http://www.neusoft.edu.cn:80/cs/news.html URL 的 构 成 : http:// 代 表 超 文 本 传 输 协 议, 通 知 服 务 器 显 示 Web 页 面 WWW Web 服 务 器 的 主 机 名 neusoft.edu.cn,web 服 务 器 所 在 的 域 名 :80, 端 口 号, 默 认 为 80 CS 服 务 器 上 的 子 目 录 news.html 文 件 夹 中 的 一 个 html 文 件! 请 求 可 以 包 含 参 数 http://localhost:8080/search.jsp?name=java+servlet&status=1 参 数 以 问 号 (?) 开 头 可 以 包 含 多 个 名 / 值 对, 之 间 用 与 号 (&) 分 隔 特 殊 字 符 必 须 进 行 编 码 ( 本 例 中 Java 和 Servlet 间 的 + 代 表 空 格 ) 3

HTTP Request 提 交 方 法 POST 在 请 求 体 中 发 送 应 用 数 据 GET 在 URL 中 发 送 应 用 数 据 HEAD 客 户 端 仅 能 获 取 响 应 的 头 部 信 息 PUT - 直 接 向 服 务 器 上 放 置 文 档 DELETE 与 PUT 执 行 相 反 的 操 作 TRACE 调 试 的 辅 助 方 法 OPTIONS 列 出 通 信 的 各 个 选 项 常 用 的 方 法 是 : GET 和 POST 4

HTTP 协 议 的 工 作 过 程 四 个 过 程 : 建 立 连 接 发 送 请 求 发 送 响 应 关 闭 连 接 建 立 连 接 : 通 过 申 请 套 接 字 (Scoket), 客 户 打 开 一 个 套 接 字, 并 将 自 己 绑 定 到 该 端 口 上 发 送 请 求 : 打 开 一 个 连 接 后, 客 户 机 将 请 求 发 送 到 服 务 器 指 定 的 端 口, 并 完 成 提 出 请 求 动 作 发 送 响 应 : 服 务 器 在 处 理 完 用 户 的 请 求 以 后, 要 想 客 户 机 发 送 相 应 信 息 关 闭 连 接 : 通 信 双 方 通 过 关 闭 套 接 字 的 办 法 关 闭 连 接 5

Servlet 简 介 Servlet 是 基 于 Servlet 框 架 ( 接 口 ) 的 java 对 象, 对 Web 服 务 器 的 功 能 进 行 扩 展, 用 来 生 成 动 态 的 内 容 简 单 地 说 Servlet 是 容 器 负 责 管 理 的 服 务 器 端 Java 程 序, 用 来 处 理 客 户 端 请 求, 并 对 客 户 端 请 求 进 行 响 应 是 SUN 公 司 提 供 的 服 务 器 端 动 态 服 务 技 术 之 一 request response Servlet EJB Web 容 器 Web 浏 览 器 6

Servlet 在 JavaEE 中 的 位 置 7

B/S 请 求 响 应 模 型 8

Servlet Architecture 客 户 端 Web 服 务 器 服 务 器 JVM 客 户 端 浏 览 器 Servlet Request Handler Servlet Engine Logs MyServlet 1. 浏 览 器 发 送 HTTP 请 求 2. Servlet 请 求 处 理 器 拦 截 请 求, 并 将 其 发 送 给 运 行 在 JVM 中 的 Servlet 引 擎 3. Servlet 引 擎 根 据 请 求 创 建 请 求 响 应 对 象 并 将 其 传 递 给 Servlet 的 services 方 法 4. Servlet 对 请 求 进 行 处 理, 并 将 输 出 输 出 给 Servlet 引 擎 5. Servlet 引 擎 将 输 出 回 送 给 Web 服 务 器 6. Web 服 务 将 请 求 回 传 给 客 户 端 浏 览 器 9

Servlet Work Flow 10

jsp 与 servlet 的 关 系 -jsp 就 是 servlet» 例 题 分 析 11

Servlet 框 架 的 对 象 模 型 <<Interface>> javax.servlet.servlet init( ) getservletconfig( ) service( ) getservletinfo( ) destroy( ) <<Interface>> javax.io.serializable javax.servlet.genericservlet init( ) getservletconfig( ) service( ) getservletinfo( ) destroy( ) getinitparameter( ) getservletcontext( ) getinitparameternames( ) getservletname( ) log( ) <<Interface>> javax.servlet.servletconfig getinitparameter( ) getservletcontext( ) getinitparameternames( ) getservletname( ) javax.servlet.http.httpservlet dodelete( ) doget( ) dooptions( ) dopost( ) doput( ) dotrace( ) getlastmodified( ) service( ) Basic Servlet 12

小 结 : Servlet 是 一 种 运 行 服 务 器 端 的 Java 应 用 程 序, 具 有 独 立 于 平 台 和 协 议 的 特 性, 并 且 可 以 动 态 地 生 成 Web 页 面, 它 工 作 在 客 户 端 请 求 与 服 务 器 响 应 的 中 间 层 Servlet 运 行 在 服 务 器 端, 与 传 统 的 以 命 令 行 方 式 启 动 的 Java 应 用 程 序 (Java Application) 不 同, Servlet 由 包 含 Java 虚 拟 机 的 Web 服 务 器 ( 如 Tomcat) 进 行 加 载 并 运 行 13

小 结 Servlet 使 用Java Servlet API 及 相 关 类 和 方 法 编 写 的 Java 应 用 程 序 除 了 Servlet API,Servlet 还 提 供 了 用 以 扩 展 基 于 HTTP 协 议 的 Java 类 软 件 包, 从 而 使 Servlet 具 有 在 Java Web 服 务 器 上 或 应 用 服 务 器 上 运 行 并 扩 展 该 服 务 器 的 能 力 Servlet API 包 括 : javax.servlet.*: 包 含 了 所 有 Servlet 类 实 现 的 基 本 接 口 和 继 承 的 基 本 类 javax.servlet.http.*: 包 含 了 编 写 基 于 HTTP 协 议 的 Servlet 所 需 的 基 类 14

创 建 第 一 个 Servlet 15

使 用 GenericServlet 处 理 请 求 Server GenericServlet subclass request response service( ) 覆 盖 service() 方 法 即 可 16

使 用 HTTPServlet 处 理 请 求 Server HttpServlet subclass Get request response doget( ) Post request service( ) response dopost( ) 覆 盖 service() 或 doxxx() 方 法 即 可, 使 用 doxxx() 方 法 时, 关 键 看 对 客 户 何 种 提 交 方 式 进 行 处 理 17

HttpServlet 类 HttpServlet 处 理 使 用 HTTP 协 议 发 送 的 请 求 和 响 应 HttpServlet 的 service() 检 查 请 求 提 交 的 方 法 并 调 用 HTTPServlet 响 应 的 方 法 : doget, dopost, doput, dodelete, dotrace, dooptions or dohead 该 类 是 一 个 抽 象 类 18

创 建 一 个 Servlet 继 承 HTTPServlet 实 现 doget 或 dopost 方 法 ( 或 两 者 都 实 现 ) 这 两 个 方 法 的 方 法 参 数 均 为 : HttpServletRequest: 用 于 获 取 Form 表 单 的 数 据 HTTP 请 求 头 部 信 息 等 等 HttpServletResponse: 用 于 设 置 HTTP 状 态 代 码 HTTP 响 应 头 部 信 息 获 取 用 于 向 客 户 端 发 送 数 据 的 输 出 流 对 象 多 数 情 况 下, 我 们 在 dopost 方 法 中 调 用 doget, 或 相 反 19

输 出 HTML 默 认 情 况 下, 响 应 中 并 没 有 设 定 内 容 的 类 型 为 了 生 成 HTML 类 型 的 文 档 : 通 过 设 置 Content-Type 头 部 信 息, 告 诉 浏 览 器 发 送 的 是 HTML 文 档 对 输 出 的 文 本 进 行 修 改 以 创 建 合 法 的 HTML 页 面 应 当 在 输 出 文 档 之 前 设 置 所 有 的 头 部 信 息 20

public class HelloWorld extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException {! PrintWriter out = response.getwriter(); HelloWorld.java out.println("<html><head><title>hello World</title></head>\n"); out.println("<body>"); out.println("<h2>" + new java.util.date() + "</h2>\n"); out.println("<h1>hello World</h1>\n</body></html>"); } } 21

配 置 Servlet 器 <web-app> web.xml <servlet> <servlet-name>hello</servlet-name> <servlet-class>helloworld</servlet-class> </servlet> <servlet-mapping> myapp/web-inf/classes/helloworld.class <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping></web-app> </web-app> 22

Servlet 的 生 命 周 期 23

Servlet 生 命 周 期 24

Servlet 生 命 周 期 第 一 次 请 求 Servlet 1 2 3 init() 5 4 service() 再 次 请 求 Servlet 1 2 3 service() 4 25

Servlet 生 命 周 期 调 用 Init 方 法 进 行 初 始 化 设 置 创 建 Servlet 实 例 调 用 service 方 法 处 理 客 户 端 请 求 ServletConfig 调 用 destroy 方 法 销 毁 Servlet 实 例 并 释 放 占 用 资 源 加 载 Servlet 类 垃 圾 回 收 26

从 请 求 中 获 取 信 息 27

获 取 HTTP 协 议 相 关 的 数 据 可 以 通 过 HttpServletRequest 对 象 获 取 HTTP 请 求 的 值 获 取 头 信 息 hdr 可 以 使 用 请 求 参 数 的 getheader( hdr ) 方 法 进 行 获 取 获 取 所 有 的 头 部 信 息 名 可 以 使 用 方 法 : getheadernames() 获 取 特 定 请 求 信 息 的 方 法 有 : getcookies, getcontentlength, getcontenttype, getmethod, getprotocol, 等 28

通 用 HTTP 头 部 信 息 29

请 求 头 部 信 息 30

获 取 Form 表 单 中 的 数 据 使 用 HTML 表 单, 我 们 可 以 向 Web 应 用 发 送 参 数 <form action= method= > </form> 组 成 了 一 个 简 单 的 Form 表 单 : action: 表 单 数 据 要 发 送 到 的 Web 应 用 的 地 址 method: 发 送 数 据 是 所 使 用 HTTP 协 议 的 提 交 方 法 ( 也 就 是 get 或 post) 31

<input> <select> <textarea> 标 记 在 表 单 内 部, INPUT Textera Select 定 义 了 用 于 输 入 数 据 的 各 种 输 入 框 标 准 的 输 入 类 型 包 括 : 按 钮 (button), 复 选 框 (checkboxe), 密 码 框 (password ), 单 选 按 钮 (radio ), 单 行 文 本 (text), 图 片 (image ), 多 行 文 本 编 辑 器 (text area), 隐 藏 字 段 (hidden), 等 等. 它 们 都 是 以 String 类 型 的 值 同 指 定 的 参 数 相 关 联 32

GET 示 例 <form method="get" action="http://www.google.com/search"> <p><input name="q" type="text" /> <input type="submit" /> <input type="reset" /> </p> </form>! http://www.google.com/search?q=servlets 33

POST 示 例 <form method="post" action="http://www.google.com/search"> <p><input name="q" type="text" /> <input type="submit" /> <input type="reset" /> </p> </form> Google 并 不 支 持 Post 方 法! 34

获 取 Parameter 值 设 置 请 求 编 码 格 式 setcharacterencoding( code ) 要 获 取 名 为 x 的 参 数 值 : req.getparameter("x") 这 里 req 是 Servlet 的 请 求 参 数 如 果 该 参 数 的 值 可 能 有 多 个 则 使 用 : req.getparametervalues("x") 要 想 获 取 所 有 参 数 名 : req.getparameternames() 35

<html><head><title>sending Parameters</title> <style type="text/css"> p{display:table-row} span{display:table-cell; padding:0.2em} </style></head><body>! <h1>please enter the parameters</h1> <form action="setcolors" method="get"> <p>background color: <span><input type="text" name="bgcolor"/></span></p> <p>font color: <span><input type="text" name="fgcolor"/> </span> </p> <p>font size: <span><input type="text" name="size"/></span></p> <h2> <input type="submit" value="submit Parameters"/></h2> </form>! </body></html> 36 parameters.html

示 例 (cont) public class SetColors extends HttpServlet { public void doget(httpservletrequest request,httpservletresponse response) throws ServletException, IOException {! response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); String bg = request.getparameter("bgcolor"); String fg = request.getparameter("fgcolor"); String size = request.getparameter("size"); SetColors.java 37

示 例 (cont)!! } out.println("<html><head><title>set Colors Example" +"</title></head>"); out.println("<body style=\"color:" + fg + ";background-color:" + bg + ";font-size:"+ size + "px\">"); out.println("<h1>set Colors Example</h1>"); out.println("<p>you requested a background color " + bg + "</p>"); out.println("<p>you requested a font color " + fg + "</p>"); out.println("<p>you requested a font size " + size + "</p>"); out.println("</body></html>"); SetColors.java 38

处 理 Post 提 交 的 数 据 获 取 POST 方 法 提 交 的 数 据 的 方 式 与 GET 方 法 相 同!! 因 此 可 以 直 接 在 dopost 方 法 中 调 用 doget 方 法 <form action="http://www.edu.neusoft.cn/ HelloWorldExample" method="post"> public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException {! doget(request, response); } 39

Servlet 的 会 话 管 理 40

为 什 么 要 进 行 会 话 管 理 HTTP 是 一 个 无 状 态 的 通 信 协 议 (Stateless protocol) 造 成 的 结 果 是 为 了 解 决 这 个 问 题 提 供 了 : Cookie Session 41

会 话 的 建 立 过 程 id 1 Web 浏 览 器 1 request 设 置 cookie id 1 response id 1 Web 服 务 器 request response 创 建 session! Servlet 42

会 话 的 建 立 过 程 id 2 Web 浏 览 器 2 request 设 置 cookie id 2 id 2 response id 1 Web 服 务 器 request response 创 建 Session! Servlet 43

会 话 的 建 立 过 程 id 1 Web 浏 览 器 1 request Cookie: id 1 id 2 response id 1 Web 服 务 器 request response Session 读 / 写! Servlet 44

会 话 的 建 立 过 程 id 2 Web 浏 览 器 2 request Cookie: id 2 id 2 response id 1 Web 服 务 器 request response Session 读 / 写 Servlet Servlet 45

访 问 Session 数 据 HttpSession 表 示session 对 象 在 doxxx 方 法 中 调 用 请 求 对 象 的 getsesssion() or getsession(true) 获 取 或 创 建 session 对 象 ( 如 果 session 对 象 不 存 在 ) Session 创 建 时 服 务 器 会 自 动 向 响 应 对 象 中 添 加 一 个 用 于 建 立 会 话 目 的 的 cookie 若 session 不 存 在, 且 不 想 创 建 新 的 session 时 调 用 getsession(false) 46

HttpSession 的 方 法 Session 中 的 数 据 是 通 过 哈 希 表 的 方 式 进 行 存 取 的 : - setattribute(string name,object value) - Object getattribute(string name) 更 多 的 方 法 : - removeattribute, getattributenames - isnew, invalidate, getid - getcreationtime, getlastaccessedtime - getmaxinactiveinterval, setmaxinactiveinterval 47

页 面 间 数 据 共 享 方 式 重 写 URL 在 HTTP 协 议 中,Get 方 式 可 以 实 现 数 据 由 客 户 端 到 服 务 器 端 的 传 送 而 重 写 URL 正 是 利 用Get 的 函 数, 可 以 URL 的 后 面 附 加 参 数, 和 服 务 器 的 请 求 一 起 发 送, 这 些 参 数 称 为 查 询 字 符 串 查 询 字 符 串 为 一 对 名 称 / 值 对,URL 中 多 个 查 询 字 符 串 之 间 使 用 & 符 号 连 接! 示 例 : http://localhost:8080/ch7/pages/newsdetail.jsp? id=10&action=delete! String id = request.getparameter("id"); String action = request.getparameter("action"); 48

页 面 间 数 据 共 享 方 式 重 写 URL 的 缺 点 :! 重 写 URL 的 页 面 必 须 动 态 生 成 ; 用 户 数 据 暴 露 在 URL 上, 造 成 安 全 上 的 隐 患 ; URL 的 长 度 有 限 制, 如 使 用URL 传 递 大 量 数 据, 会 造 成 性 能 下 降 ; 必 须 对 所 有 指 向 本 Web 站 点 的 URL 进 行 编 码 ; 不 能 预 先 记 录 下 页 面 的 URL, 或 者 从 其 他 的 Web 站 点 链 接 访 问 49

页 面 间 数 据 共 享 方 式 共 享 会 话 使 用 重 写 URL 共 享 用 户 数 据 时, 还 有 一 个 限 制 就 是 两 个 页 面 间 必 须 通 过 链 接 关 联 起 来 如 果 两 个 链 接 这 种 关 联 关 系, 将 无 法 使 用 重 写 URL 共 享 数 据 那 么 可 以 使 用 内 置 对 象 session, 即 共 享 会 话 的 形 式 共 享 用 户 数 据 session 对 象 的 setattribute(string name, Object obj) 方 法 可 以 设 置 在 会 话 期 内 共 享 的 数 据 属 性 名 称 及 值 在 同 一 个 用 户 的 同 一 个 会 话 期 内, 不 同 的 数 据 属 性 名 称 要 区 别, 若 重 名 时 原 有 的 属 性 值 将 被 替 换 使 用getAttribute(String name) 可 以 从 会 话 中 检 索 对 应 属 性 名 称 的 值, 需 要 注 意 的 是 该 方 法 的 返 回 值 为 Object 类 型, 因 此 常 常 需 要 数 据 类 型 转 换 50

页 面 间 数 据 共 享 方 式 共 享 会 话 示 例 : HttpSession session = request.getsession(true); // 设 置 会 话 有 效 期 为 20 分 钟 session.setmaxinactiveinterval(1200); // 向 会 话 中 添 加 一 个 属 性 名 称 为 users, 值 为 regusers 的 对 象 session.setattribute("users", regusers); // 获 取 属 性 名 称 为 users 的 对 象 值, 进 行 强 制 类 型 转 换 users u = (users)session.getattribute("users"); // 从 会 话 中 删 除 属 性 名 称 为 users 的 对 象 session.removeattribute("users"); 51

页 面 间 数 据 共 享 方 式 在 web.xml 配 置 会 话 有 效 期 为 30 分 钟 <session-config> <session-timeout> 30 </session-timeout> </session-config> 52

页 面 间 数 据 共 享 方 式 Cookie 用 于 存 储 Web 服 务 器 发 送 给 客 户 端 的 信 息 ( 通 常 以 文 本 文 件 的 形 式 保 存 在 客 户 机 的 硬 盘 上 ) 当 客 户 端 第 一 次 访 问 服 务 器 时, 服 务 器 会 为 客 户 创 建 一 个 Cookie 对 象, 在 响 应 客 户 端 的 同 时 把 Cookie 对 象 发 送 到 客 户 端, 在 以 后 的 访 问 中, 客 户 端 会 在 请 求 的 同 时 将 Cookie 对 象 同 时 发 送 到 服 务 器 因 此, 在 实 际 应 用 中 可 以 把 需 要 共 享 的 数 据 保 存 至 Cookie 中, 需 要 这 些 数 据 时 再 从 客 户 端 的 Cookie 中 读 出, 从 而 实 现 共 享 数 据 53

页 面 间 数 据 共 享 方 式 Cookie 也 是 以 属 性 名 / 值 对 的 形 式 保 存 数 据 的, 这 些 信 息 可 被 封 装 在 Cookie 对 象 中! 当 客 户 端 第 一 次 访 问 Web 服 务 器 时, 首 先 要 生 成 一 组 Cookie 信 息 并 保 存 在 客 户 端 中 在 Java Web 应 用 开 发 中, 是 通 过 内 置 对 象 response 的 addcookie() 方 法 来 实 现 的 第 一 步 : 通 过 Cookie 构 造 方 法 创 建 Cookie 对 象 Cookie cookie = new Cookie(String key,object value);! 第 二 步 : 设 置 Cookie 的 最 大 保 留 时 间 cookie.setmaxage(int value);// 单 位 为 秒! 第 三 步 : 将 Cookie 对 象 添 加 到 响 应 对 象 中 responsee.addcookie(cookie obj);! 第 四 步 : 得 到 客 户 端 发 送 过 来 的 Cookie 对 象 Cookie [] cookies = request.getcookies();// 此 方 法 将 返 回 一 个 Cookie 数 组! 第 五 步 :Cookie 中 的 方 法 cookie.getname();// 得 到 Cookie 中 的 属 性 名 称, cookie.getvalue();// 得 到 Cookie 中 的 值 54

Cookie HTTP 协 议 是 一 种 无 连 接 的 协 议 ( 主 要 说 明 为 什 么 需 要 Cookie 和 session) Cookie 是 Web 服 务 器 保 存 在 用 户 硬 盘 上 的 一 段 文 本 Cookie 允 许 一 个 Web 站 点 在 用 户 的 电 脑 上 保 存 信 息 并 且 随 后 再 取 回 它 信 息 的 片 断 以 名 / 值 对 (name-value pairs) 的 形 式 储 存 在 某 种 程 度 上,cookie 和 session 内 置 对 象 有 些 相 似, 但 二 者 存 在 本 质 的 差 别 : Cookie 存 在 与 客 户 端,session 存 在 与 服 务 器 Cookie 主 要 用 户 保 存 脱 机 数 据, 而 session 内 置 对 象 主 要 用 于 跟 踪 用 户 会 话 但 他 们 也 存 在 一 些 共 同 点, 那 就 是 不 论 是 cookie 还 是 session 内 置 对 象 都 需 要 浏 览 器 支 持 cookie 并 且 没 有 禁 用 cookie 55

Cookie 作 用 :Cookie 对 象 通 常 用 于 在 浏 览 器 端 保 存 会 话 过 程 中 的 一 些 参 数 当 浏 览 器 请 求 服 务 器 的 页 面 时 自 动 发 送 到 服 务 器 上 Cookie 是 文 本 文 件, 保 存 路 径 C:\Documents and Settings\ 登 录 用 户 名 \Cookies Cookie 的 常 用 用 途 : Cookie 是 站 点 跟 踪 特 定 访 问 者 访 问 的 次 数, 最 后 访 问 的 时 间 以 及 访 问 者 进 入 站 点 的 路 径 ; Cookie 能 够 帮 助 站 点 统 计 用 户 个 人 资 料 以 实 现 各 种 各 样 的 个 性 化 服 务 cookie 实 现 自 动 登 录 功 能, 使 得 用 户 不 需 要 输 入 用 户 名 和 密 码 就 可 以 进 入 曾 经 浏 览 的 站 点 56

Cookie 使 用 的 限 制 每 个 客 户 端 最 多 存 放 300 个 Cookie 每 个 Cookie 的 数 据 最 大 为 4KB 每 个 服 务 器 或 域 最 多 向 同 一 客 户 端 写 20 个 cookie 57

Servlets 与 Cookies Servlet API 提 供 了 处 理 cookie 的 机 制 类 javax.servlet.http.cookie 表 示 cookie 获 取 方 法 : getname(), getvalue(), getpath(), getdomain(), getmaxage(), getsecure() 设 置 方 法 : setvalue(), setpath(), setdomain(), setmaxage() 58

Servlets 与 Cookies ( 续 ) 从 请 求 中 获 取 Cookie: Cookie[] HttpServletRequest.getCookies() 向 响 应 中 添 加 cookie: HttpServletResponse.addCookie(Cookie cookie) 59

向 客 户 端 写 入 Cookie 的 步 骤 创 建 Cookie Cookie c=new Cookie( name, value ); 设 置 Cookie 的 属 性 c.setmaxage(60*60*24); c.setdomain( *.neusoft.edu.cn ) c.setpath( / ) 调 用 response 的 addcookie 方 法 将 其 写 入 到 客 户 端 response.addcookie(c) 60

读 取 Cookie 的 步 骤 从 客 户 端 读 取 所 有 能 够 被 本 服 务 器 读 取 的 Cookie Cookie[] cookies=request.getcookies(); 从 中 找 出 需 要 的 Cookie for(int i=0;i<cookies.length;i++){ If(cookies[i].getName().equals( wanted )){ Do something useful } } 61

示 例 <html> getname.html <head><title>insert your Name</title></head> <body> <h1>what is your name?</h1> <form action="welcomeback" method="get"> <p> <input type="text" name="username" /> <input type="submit" /> </p> </form> </body> </html> 62

! 示 例 : WelcomeBack.java public class WelcomeBack extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { String user = req.getparameter("username"); if (user == null) { // Find the "username" cookie Cookie[] cookies = req.getcookies(); for (int i = 0; cookies!= null && i < cookies.length; ++i) { if (cookies[i].getname().equals("username")) user = cookies[i].getvalue(); } } else res.addcookie(new Cookie("username", user)); 63

示 例 (cont)!! if (user == null) // No parameter and no cookie res.sendredirect("getname.html"); res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html><body><h1>welcome Back " + user + "</h1></body></html>"); } } WelcomeBack.java 64

请 求 转 发 与 重 定 向 Internet 的 一 个 主 要 特 征 就 是 通 过 超 级 链 接 聚 合 了 大 量 的 信 息 资 源,Web 应 用 中 各 个 资 源 ( 包 括 HTML/ JSP 页 面 Servlet 对 象 等 ) 也 可 以 实 现 资 源 的 相 互 关 联 与 整 合, 在 Java Web 应 用 中 可 使 用 以 下 几 种 方 式 达 到 Web 资 源 的 关 联 与 整 合 : 请 求 转 发 ; 重 定 向 ; 包 含 65

请 求 转 发 与 重 定 向 请 求 转 发 RequestDispatcher Servlet 66

请 求 转 发 与 重 定 向 // 转 发 至ForwardPage.jsp 页 面 RequestDispatcher dispatcher = request.getrequestdispatcher("forwardpage.jsp"; dispatcher.forward(request, response);! RequestDispatcher 对 象 可 以 把 用 户 对 当 前 Web 资 源 的 请 求 转 发 给 其 他 Web 资 源, 如 上 述 代 码 中 转 发 给 ForwardPage.jsp 页 面, 而 且 将 用 户 对 当 前 Servlet 的 请 求 和 响 应 (HttpServletRequest 对 象 实 例 request 和 HttpServletResponse 对 象 实 例 response) 传 递 给 ForwardPage.jsp 67

请 求 转 发 与 重 定 向 注 意 : 请 求 转 发 方 式 通 常 用 于 Servlet 中, 而 在 JSP 页 面 中 可 以 使 用<jsp:forward> 动 作 标 记 达 到 相 同 的 效 果 另 外, 请 求 转 发 方 式 只 能 把 请 求 转 发 给 同 一 个 Web 应 用 中 的 资 源, 并 不 能 转 发 给 其 他 Web 应 用 中 的 资 源 ; 并 且 使 用 请 求 转 发 的 Web 资 源 与 目 标 Web 资 源 之 间 共 享 request 范 围 内 的 数 据 68

请 求 转 发 与 重 定 向 重 定 向 是 将 来 自 客 户 端 的 请 求 传 递 给 其 他 的 Web 资 源, 与 请 求 转 发 不 同 的 是, 目 标 资 源 可 以 是 不 在 同 一 个 Web 应 用 中 在 Servlet 中, 使 用HttpServletResponse 对 象 的 sendredirect() 方 法 重 定 向 response.sendredirect("pages/confirmregister.jsp"); 与 请 求 转 发 相 比, 重 定 向 与 请 求 转 发 的 区 别 在 于 : Web 资 源 可 以 重 定 向 任 何 一 个 URL, 而 不 仅 仅 局 限 于 同 一 个 Web 应 用 中 重 定 向 是 返 回 一 个 应 答 给 客 户 端, 然 后 再 重 新 发 送 一 个 请 求 给 目 标 URL, 所 以 浏 览 器 地 址 栏 会 更 新 为 目 标 Web 资 源 的 URL; 而 使 用RequestDispatcher 对 象 请 求 转 向 时, 浏 览 器 地 址 栏 不 会 更 新, 仍 为 原 有 Web 资 源 的 URL 使 用 重 定 向 时,Web 资 源 之 间 不 会 共 享 使 用 用 户 请 求 对 象, 而 RequestDispatcher 则 共 享 69

请 求 转 发 器 RequestDispatcher 对 象 用 来 将 客 户 发 送 的 请 求 发 送 给 服 务 器 的 其 他 资 源 该 资 源 可 以 是 静 态 资 源 ( 如 HTML 文 件 ) 也 可 以 动 态 资 源 ( 如 Servlet 或 JSP 文 件 ) 要 将 请 求 发 送 给 资 源 x, 使 用 : getservletcontext().getrequestdispatcher( /x") request.getrequestdispatcher("x") 70

RequestDispatcher 提 供 的 方 法 void forward(servletrequest request, ServletResponse response) 将 请 求 从 当 前 的 Servlet 转 发 到 其 他 资 源 void include(servletrequest request, ServletResponse response) 在 响 应 对 象 中 包 含 资 源 的 内 容 71

数 据 的 传 递 属 性 传 递 在 对 Servlet 或 JSP 进 行 转 发 时 有 三 种 不 同 的 传 递 参 数 的 方 式 仅 在 请 求 范 围 内 使 用 该 数 据 : request.setattribute("key", value); 客 户 在 会 话 过 程 中 使 用 的 数 据 : session.setattribute("key", value); 任 何 用 户 都 可 以 访 问 的 数 据 context.setattribute("key", value); 参 数 传 递 通 过 在 地 址 栏 后 面 追 加 参 数 url?parameter1=value1&parameter2=value2 72

示 例 在 JokesAndImages Servlet, 用 户 可 以 随 机 选 择 一 个 随 机 的 笑 话 或 图 片 在 服 务 器 的 images/ 目 录 下 有 五 个 图 片, 在 jokes/ 下 有 五 个 笑 话 (txt 文 件 ) 空 请 求 会 被 转 发 给 HTML 文 件, 使 得 用 户 可 以 选 择 笑 话 或 图 片 选 择 笑 话, 请 求 就 会 转 发 给 JokesServlet 选 择 图 片, 请 求 就 会 随 机 转 发 给 images/ 目 录 下 的 某 个 图 片 73

Jokes and Images <html> <head><title>images and Jokes</title></head> <body> <h1>please Select:</h1> <form method="post" action="jokesandimages"> <h2> <input type="submit" name="joke" value="a Joke" /> <input type="submit" name="image" value="an Image" /> </h2> </form> </body></html> imagesjokesoptions.html 74

public class JokesAndImages extends HttpServlet { public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { } int randomnum = 1 + Math.abs((new Random()).nextInt() % 5); if (req.getparameter("joke")!= null) { req.setattribute("jokenumber", new Integer(randomNum)); getservletcontext().getrequestdispatcher("/ Jokes").forward(req,res); } else if (req.getparameter("image")!= null) { getservletcontext().getrequestdispatcher("/images/image" + randomnum + ".gif").forward(req, res); } else getservletcontext().getrequestdispatcher ("/imagesjokesoptions.html"). forward(req,res); public void doget... }} JokesAndImages.java 75

Jokes and Images ( 续 ) public class Jokes extends HttpServlet { public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); PrintWriter out = res.getwriter(); out.println("<html><body><h1>a Joke</h1><pre>"); int jokenum = ((Integer) req.getattribute("jokenumber")).intvalue(); getservletcontext().getrequestdispatcher ("/jokes/joke" + jokenum + ".txt").include(req, res); out.println("\n</pre>"); out.println("<a href=\"" + req.getrequesturl() + "\">Back</a>"); out.println("</body></html>"); }} Jokes.java 76

转 发 vs 重 定 向 默 认 情 况 下, SendRedirect 不 会 保 留 请 求 对 象 中 参 数 SendRedirect 会 在 客 户 端 呈 现 跳 转 后 的 URL 地 址 77

ServletContext 78

ServletContext 对 象 servlet 容 器 在 启 动 时 会 加 载 web 应 用, 并 为 每 个 web 应 用 创 建 唯 一 的 servlet context 对 象, 可 以 把 ServletContext 看 成 是 一 个 Web 应 用 的 服 务 器 端 组 件 的 共 享 内 存, 在 ServletContext 中 可 以 存 放 能 够 被 所 有 用 户 访 问 的 共 享 数 据 ServletContext 对 象 只 在 web 应 用 被 关 闭 的 时 候 才 被 销 毁, 不 同 的 web 应 用, ServletContext 各 自 独 立 存 在 79

ServletContext 对 象 每 个 Web 应 用 只 有 一 个 ServletContext 对 象 可 以 使 用 getservletcontext() 方 法 获 取 ServletContext 对 象 ServletContext 拥 有 众 多 的 方 法 例 如, 你 可 以 在 该 对 象 中 存 储 信 息, 注 意 存 储 在 此 处 的 数 据 会 伴 随 Web 应 用 的 整 个 生 命 周 期, 除 非 明 确 地 将 其 移 除 80

示 例 : 计 数 服 务 public class CounterServlet extends HttpServlet { public void init() throws ServletException { Integer counter = (Integer)getServletContext().getAttribute("counter"); } } if(counter == null) { getservletcontext().setattribute("counter",new Integer(0)); 81

public void doget(httpservletrequest req,httpservletresponse res) throws ServletException, IOException {! PrintWriter out = res.getwriter(); res.setcontenttype("text/html"); int counter = 0; synchronized(this) { counter = ((Integer)getServletContext(). getattribute("counter")).intvalue(); getservletcontext(). setattribute("counter",new Integer(++counter)); } out.println("<html><head><title>counter</title><body><h1>" + "[" + counter + "]</h1></body></html>"); }} 82

使 用 ServletContext 为 了 同 Servlet 容 器 ( 如 Tomcat) 进 行 通 信, 需 要 使 用 ServletContext 对 象 Web 应 用 的 所 有 Servlet 都 共 用 着 同 一 个 ServletContext 可 以 存 储 Web 应 用 的 初 始 参 数 可 以 存 储 和 操 纵 应 用 范 围 内 容 共 享 的 属 性 可 以 访 问 日 志 记 录 对 象 可 以 将 请 求 分 发 到 其 他 资 源 83

ServletContext 提 供 的 方 法 访 问 初 始 参 数 的 方 法 : getinitparameter(string name), getinitparameternames() 读 取 web 应 用 属 性 的 方 法 : getattribute(string name), getattributenames() 操 纵 web 应 用 属 性 的 方 法 : setattribute(string, Object), removeattribute(string) 将 相 对 路 径 转 换 为 绝 对 路 径 的 方 法 : getrealpath(string path), URL getresource(string path) 84

ServletContext 提 供 的 方 法 输 出 web 应 用 的 日 志 : log(string msg), log(string message, Throwable exception) 获 取 资 源 转 发 器 ( 稍 后 讨 论 ): RequestDispatcher getrequestdispatcher(string path) 获 取 Servlet 容 器 的 名 称 和 版 本 : String getserverinfo() 85

有 关 ServletContext 的 注 意 事 项 每 个 Web 应 用 只 有 一 个 ServletContext 对 象 同 一 个 Web 应 用 中 的 不 同 Servlet, 调 用 getservletcontext 方 法 获 得 的 是 同 一 个 ServletContext 对 象 示 例 可 以 对 其 锁 定 进 行 锁 定, 用 以 防 止 web 应 用 程 序 对 关 键 部 分 的 访 问 86

FILTER Filter 也 称 之 为 过 滤 器, 它 是 Servlet 技 术 中 非 常 重 要 的 技 术 之 一,Web 开 发 人 员 通 过 使 用Filter 技 术, 可 管 理 Web 服 务 器 上 所 有 Web 资 源, 如 JSP Servlet 静 态 页 面 等 进 行 拦 截, 从 而 实 现 一 些 特 殊 的 功 能 例 如 实 现 URL 级 别 的 权 限 访 问 控 制 过 滤 敏 感 词 汇 字 符 编 码 转 换 等 一 些 高 级 应 用 87

FILTER Filter 能 够 在 一 个 请 求 到 达 Servlet 之 前 预 处 理 用 户 请 求, 也 可 以 在 离 开 Servlet 时 处 理 HTTP 响 应 归 纳 起 来,Filter 可 以 完 成 如 下 工 作 在 执 行Servlet 之 间, 首 先 执 行Filter 程 序, 并 为 之 做 一 些 预 处 理 工 作 ; 根 据 程 序 需 要 修 改 请 求 和 响 应 ; 在 Servlet 被 调 用 之 后 截 获 Servlet 的 执 行 88

FILTER Filter API 主 要 包 括 3 个 主 要 接 口: Filter 接 口 FilterChain 接 口 和 FilterConfig 接 口 这 些 接 口 都 存 放 在 javax.servlet 包 中! Filter 接 口 包 含 以 下 方 法 :init() destroy() 和 dofilter() 方 法 ;dofilter(servletrequest request, ServletResponse response,filterchain chain) 方 法 是 Filter 的 核 心 方 法,Filter 可 以 通 过 该 方 法 对 请 求 和 响 应 进 行 处 理, 如 通 过 调 用 该 方 法 收 集 数 据 过 滤 器 通 过 传 送 给 此 方 法 的 FilterChain 参 数, 以 此 调 用 chain.dofilter() 将 控 制 权 传 送 给 下 一 个 过 滤 器 89

FILTER FilterChain 接 口 中 也 有 一 个 dofilter() 方 法, 即 void dofilter(servletrequest request, ServletResponse response) 此 方 法 是 由 Servlet 容 器 提 供 给 开 发 者 的, 用 于 对 资 源 请 求 过 滤 链 的 依 次 调 用, 通 过 FilterChain 调 用 过 滤 链 中 的 下 一 个 过 滤 器, 如 果 是 最 后 一 个 过 滤 器, 则 下 一 个 就 调 用 目 标 资 源 90

FILTER FilterConfig 接 口 可 获 取 过 滤 器 名 初 始 化 参 数 以 及 活 动 的 Servlet 上 下 文, 该 接 口 提 供 了 以 下 4 个 方 法 String getfiltername(): 返 回 web.xml 文 件 中 定 义 的 该 过 滤 器 的 名 称 ; ServletContext getservletcontext(): 返 回 调 用 者 所 处 的 Servlet 上 下 文; String getlnitparameter(string name): 返 回 过 滤 器 初 始 化 参 数 值 的 字 符 串 形 式, 当 参 数 不 存 在 时, 返 回 nul1; public Enumeration getinitparameternames(): 以 Enumeration 形 式 返 回 过 滤 器 所 有 初 始 化 参 数 值, 如 果 没 有 初 始 化 参 数, 返 回 为 null 91

LISTENER Listener 又 称 为 监 听 器, 从 字 面 上 可 以 看 出 Listener 主 要 用 来 监 听 之 用 通 过 Listener 可 以 监 听 Web 服 务 器 中 某 一 个 执 行 动 作, 并 根 据 其 要 求 做 出 相 应 的 响 应 92

LISTENER Servlet 2.4 规 范 中 提 供 了 8 个 Listener 接 口, 可 以 将 其 分 为 三 类, 分 别 如 下 第 一 类 : 与 ServletContext 有 关 的 Listener 接 口 包 括 两 个 Listener 接 口, 分 别 是 ServletContextListener 和 ServletContextAttributeListener 第 二 类 : 与 HttpSession 有 关 的 Listener 接 口 包 括 四 个 Listener 接 口, 分 别 是 HttpSessionListener HttpSessionAttributeListener HttpSessionBindingListener 和 HttpSessionActivationListener 第 三 类 : 与 ServletRequest 有 关 的 Listener 接 口 包 括 两 个 Listener 接 口, 分 别 是 ServletRequestListener 和 ServletRequestAttributeListener 93

MVC 模 式 简 介 MVC 即 Model-View-Controller( 模 型 - 视 图 - 控 制 器 ) 是 一 种 软 件 设 计 模 式,MVC 最 早 出 现 在 Smalltalk 语 言 中, 后 来 在 Java 中 得 到 广 泛 应 用, 并 且 被 Sun 公 司 推 荐 为 Java EE 平 台 的 设 计 模 式, 后 来 Sun 公 司 提 出 了 两 个 基 于 MVC 模 式 的 Java Web 开 发 模 型 :JSP Model1 和 JSP Model2 94

MVC 模 式 简 介 MVC 模 块 间 的 协 作 关 系 : 客 户 通 过 应 用 程 序 发 出 请 求, 该 请 求 转 发 给 控 制 器 ; 控 制 器 接 受 用 户 请 求, 并 决 定 使 用 何 种 业 务 逻 辑 处 理 该 请 求, 并 调 用 相 应 的 模 型 处 理 ; 模 型 处 理 用 户 请 求 并 存 取 相 关 数 据 表 示 客 户 查 询 检 索 出 的 任 何 数 据 都 被 返 回 给 控 制 器 ; 控 制 器 接 收 从 模 型 返 回 的 数 据, 并 选 择 适 当 的 视 图 显 示 响 应 结 果 95

MVC 模 式 简 介 Java EE 应 用 的 架 构 发 展 过 程 - 传 统 方 式 JSP 96

MVC 模 式 简 介 Java EE 应 用 的 架 构 发 展 过 程 -JSP Model 1 JSP JavaBean 97 Web

. MVC 模 式 简 介 Java EE 应 用 的 架 构 发 展 过 程 -JSP Model 2 Servlet JSP JavaBean Web 98

JSP 中 实 现 MVC 模 式 例 子 实 现 思 想 : 利 用MVC 模 式 的 思 想 实 现 用 户 注 册 功 能 ; 设 计 用 户 注 册 的 JSP 页 面; 设 计 JavaBean; 设 计 Servlet; 整 合 应 用! 代 码 99