JEE环境下各类开发架构简介.doc_第1页
JEE环境下各类开发架构简介.doc_第2页
JEE环境下各类开发架构简介.doc_第3页
JEE环境下各类开发架构简介.doc_第4页
JEE环境下各类开发架构简介.doc_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 JEEJEE环境下各类环境下各类开发架构简介开发架构简介 姓名 高伟勋 电子邮件 gwx 来源 www javathinker org 2 中文摘要 如今 各种可用的 Web 框架如雨后春笋般林立 把浏览器指向 Java 技术网站时 常会看到 新版的 Web 框架发布的消息 这些新框架意图改变现代世界 虽然有些人认为这是坏事 把 Java 群体分解得支离破碎 但事实是 不断冒出的新框架只是演化的过程而已 通过这样的演化过程 有些框架成为目前几种主流的 Web 框架 本文着重讨论几种主流框 架的原理 尤其详细讲解 Structs 框架 各框架之间的比较 及这些框架在未来发展的趋势 它们包括 Structs 框架 JavaServer Faces JSF 框架 Spring 框架 这些框架几乎都是 Model View Controller MVC 模式的实现 所以本文先介绍了 MVC 的 工作模式及其原理 Struts 框架实质上就是在 JSP Model2 的基础上实现的一个 MVC 框架 在 下面的章节中将详细介绍 Struts 框架的工作原理及流程 JSF 是对 Struts 的升级 不过不同 于 Struts 的开放源代码模式 它是 Sun 制定的一个规范 本文除了介绍 JSF 的工作原理 还有 很大的篇幅对 JSF Struts 的模式应用进行比较 Spring 是另一个解决了许多在 J2EE 开发中 常见的问题的强大框架 Spring 的架构基础是基于使用 JavaBean 属性的 Inversion of Control 容器 然而 这仅仅是完整图景中的一部分 Spring 在使用 IoC 容器作为构建所有架 构层的完整解决方案方面是独一无二的 Spring 提供了唯一的数据访问抽象 包括简单和有 效率的 JDBC 框架 极大的改进了效率并且减少了可能的错误 Spring 的数据访问架构还集成 了 Hibernate 和其他 O R mapping 解决方案 关键词 关键词 MVC Struts JSF Spring 3 目 录 中文摘要中文摘要 2 2 目目 录录 3 3 第第 1 1 章章 绪论绪论 5 5 1 1 引言 5 1 2 MVC 模式简介 5 1 3 基于 J2EE 的几种设计框架简介 6 1 3 1Struts 框架 6 1 3 2 JavaServer Face JSF 框架 6 1 3 3 Spring 框架 7 第第 2 2 章章 MODEL VIEW CONTROLLERMODEL VIEW CONTROLLER MVCMVC 模式 模式 8 8 2 1 MVC 的概念 8 2 2 视图 9 2 3 控制器 9 2 4 模型 10 2 5 MVC 的优点 10 第第 3 3 章章 STRUCTSSTRUCTS 框架框架 1111 3 1 JAVAWEB应用结构的发展 11 3 1 1 Model 1 结构 11 3 1 2 Model 2 结构 12 3 2 STRUTS概述 12 3 3 STRUTS的各组件 13 3 3 1 Struts 控制器组件 13 3 3 2 Struts 模型组件 19 3 3 3 Struts 视图组件 19 3 4 配置 STRUTS应用 21 3 4 1 创建 Web 应用的配置文件 web xml 21 3 4 2 Struts 配置文件 struts config xml 与 org apache struts config 包 22 3 5 STRUTS的国际化 23 3 5 1 Locale 类 24 3 5 2 ResourceBundle 类 25 第第 4 4 章章 JAVASERVERJAVASERVER FACEFACE JSFJSF 框架 框架 2727 4 1 JSF 基于组件的 MODEL 2 MVC 策略 27 4 1 1 Controller 27 4 1 2 Model 28 4 1 3 View 28 4 2 JSF 事件 29 4 2 1 UI 事件 29 4 4 2 2 侦听器 29 4 2 3 阶段标识 30 4 2 4 时间排队和广播 30 4 3 标准 JSF 请求处理流程 30 4 5 1 恢复视图 30 4 5 2 应用请求值 31 4 5 3 处理验证 31 4 5 4 更新 Model 数值 31 4 5 5 调用应用 32 4 5 6 渲染响应 32 第第 5 5 章章 SPRINGSPRING 框架概述框架概述 3333 5 1 SPRING 框架总览 33 5 2 IOC 和 AOP 简介 35 5 2 1面向方面的编程 AOP 35 5 2 2 IOC 容器 36 5 2 3 BeanFactory 接口 36 5 3SPRING MVC 框架 37 5 3 1 Spring MVC 框架简介 37 5 3 2 配置 Spring MVC 37 5 3 3 配置应用程序的 URL 38 5 3 4 装入配置文件 38 5 4 HIBERNATE 与 SPRING 39 5 4 1Hibernate 简介 39 5 4 2 Spring 中的 Hibernate 40 第第 6 6 章章 总结和展望总结和展望 4242 参考文献参考文献 4343 5 第 1 章 绪论 过去几年来 万维网的发展已经到了一个很重要的转折点 Java 开发人员必须辛苦地在一 个 JSP 页面里塞进表示逻辑 通过 SQL 存取数据库以及导航智能的日子过去了 Java Web 开发 人员已从那些失败的经验吸取了教训 付出了除错和维护的时间 继续向前挺进 1 1 引言 如今 各种可用的 Web 框架如雨后春笋般林立 把浏览器指向 Java 技术网站时 常会看到 新版的 Web 框架发布的消息 这些新框架意图改变现代世界 虽然有些人认为这是坏事 把 Java 群体分解得支离破碎 但事实是 不断冒出的新框架只是演化的过程而已 当今重要的 Web 应用程序的设计和结构把开发人员推进到逻辑和实际可能的极限 这些应 用程序所面临的问题有各式各样的解决办法 有些解决办法历经岁月的考验 在新一代软件中 依然能传达相当有价值的观点 有些解决办法就做不到了 既然无法满足用户和增值的需求 往往只能靠边站了 通过这样的演化过程 有些框架成为目前几种主流的 Web 框架 本文着重讨论几中主流框 架的原理 他们之间的比较 及这些框架在未来发展的趋势 它们包括 Structs 框架 JavaServer Faces JSF 框架 Spring 框架 1 2 MVC 模式简介 MVC 是 Model View Controller 的简称 即模型 视图 控制器 它把应用程序分成三个核 心模块 模型 视图 控制器 它们各自处理自己的任务 视图是用户看到并与之交互的界面 作用如下 视图向用户显示相关的数据 接受用户的 输入 不进行任何实际的业务处理 视图向模型查询业务状态 但不能改变模型 视图接受模 型发出的数据更新事件 从而对用户界面进行同步更新 模型是应用程序的主体部分 模型表示业务数据和业务逻辑 一个模型能为多个视图提 供数据 应用于模型的代码只需写一次就可以被多个视图重用 提高了代码的可重用性 控制器接受用户的输入并调用模型和视图去完成用户的需求 当 Web 用户单击 Web 页面中 的递交按钮来发送 HTML 表单时 控制器本身不输出任何东西或处理任何业务数据 控制器接收 6 请求并决定调用哪个模型组件去处理请求 然后决定调用哪个视图来显示模型处理返回的数据 1 3 基于 J2EE 的几种设计框架简介 本节简单介绍一些设计框架和基本概念 这些框架都说 MVC 模式的具体实现 或者包含 MVC 模式的实现 1 3 1 Struts 框架 Struts 实质上就是在 JSP Model2 的基础上实现的一个 MVC 框架 模型 JavaBean EJB 组件 控制器 ActionServlet Action 视图 JSP Struts 客户化标签 从视图角度 View 首先 Struts 提供了 Java 类 org apache struts action ActionForm Java 开发者将该类细分来创建表单 bean 在运行时 该 bean 有两种用法 当 JSP 准备相关的 HTML 表单以进行显示时 JSP 将访问该 bean 它保存要 放入表单中的值 那些值是从业务逻辑或者是从先前的用户输入来提供的 当从 Web 浏览器中 返回用户输入时 该 bean 将验证并保存该输入以供业务逻辑或 如果验证失败的话 后续重新显 示使用 其次 Struts 提供了许多定制 JSP 标记 它们的使用简单 但是它们在隐藏信息方面功能 强大 例如 除了 bean 名称和给定 bean 中每个段的名称之外 页面设计者不需要知道有关表 单 bean 的更多信息 从模型角度 Model Struts 虽然不直接有助于模型开发 在 Struts 中 系统模型的状 态主要由 ActiomForm Bean 和值对象体现 从控制器角度 Controller 在 Struts 框架中 Controller 主要是 ActionServlet 但是对于业务逻辑的操作则主要由 Action ActionMapping ActionForward 这几个组件协调完 成 其中 Action 扮演了真正的控制逻辑的实现者 而 ActionMapping 和 ActionForward 则指 定了不同业务逻辑或流程的运行方向 1 3 2 JavaServer Face JSF 框架 JSF 框架和那些常用来创建 Web 应用程序的 MVC 框架并没有多大的差异 不过 JSF 在很多地 方都添加了功能 那是 Struts 所欠缺的 而且把接口和实现相分离 7 由于 JSF 是围绕着 MVC 概念而设计出来的 当然会看到 JSF 中有模型 视图和控制器 虽 然这些部分在 JSF 中都有 但 Web 会对 MVC 模型有一些特别的限制 浏览器不太会坐在那里等 着时间来到 相反的 浏览器在发出需要某种信息的请求后 就会期待信息被返回来 并不会 专门监听事件发生 JSF 的做法是提供组件来处理应用程序中属于控制器那部分的工作 其中包括 FrontController 类似于 Struts 的 ActionServlet NavigationHandler 转换和格式化组 件 拦截命令的 ActionListeners 以及验证表示数据 JSF 也为视图提供了组件 这些组件的 实现方式是做成客户特有的输出显示工具 也就是输出生成器 这些输出生成器知道如何在浏 览器中生成按钮或文本字段 JSF 的目标是提供一种构建 UI 的方式 这种方式独立于客户类型 其做法就是利用一种输 出显示工具 使其内含跟客户类型有关的 UI 部分 输出显示工具会检测所使用的客户类型 再 据此显示图形部件 JSF 也允许自定义图形不见 这很类似于 Java Swing 事实上 如果输出 显示工具不支持某种客户类型 你也可以创建全新的输出显示工具 1 3 3 Spring 框架 Spring 是什么呢 首先它是一个开源的项目 而且目前非常活跃 它是一个基于 IoC 和 AOP 的构架多层 j2ee 系统的框架 但它不强迫你必须在每一层中必须使用 Spring 因为它模块 化的很好 允许你根据自己的需要选择使用它的某一个模块 它实现了很优雅的 MVC 对不同 的数据访问技术提供了统一的接口 采用 IoC 使得可以很容易的实现 bean 的装配 提供了简洁 的 AOP 并据此实现 Transcation Managment 等等 Spring 是一个开源框架 是为了解决企业应用程序开发复杂性而创建的 框架的主要优势 之一就是其分层架构 分层架构允许您选择使用哪一个组件 同时为 J2EE 应用程序开发提供 集成的框架 Spring 框架是一个分层架构 由 7 个定义良好的模块组成 Spring 模块构建在核心容器 之上 核心容器定义了创建 配置和管理 bean 的方式 组成 Spring 框架的每个模块 或组 件 都可以单独存在 或者与其他一个或多个模块联合实现 Spring 框架的功能可以用在任何 J2EE 服务器中 大多数功能也适用于不受管理的环境 Spring 的核心要点是 支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象 毫无疑问 这样的对象可以在不同 J2EE 环境 Web 或 EJB 独立应用程序 测试环境之间重用 8 第 2 章 Model View Controller MVC 模式 MVC 最初是随 Smalltalk 开始流行的 如今用于许多现代设计框架 MVC 主要的好处之一 是为交互性用户界面提供了可重用组件 MVC 模式旨在将交互性应用分成三个单独的组件 Model View Controller Model 代表核心的应用数据与功能性逻辑 View 渲染数据并显示给 应用的用户 Controller 处理用户的交互或输入 三个组件均通过变更传播机制来通信 以保 持彼此间的通信 2 1 MVC 的概念 MVC 是 Model View Controller 的简称 即模型 视图 控制器 它把应用程序分成三个核 心模块 模型 视图 控制器 它们各自处理自己的任务 首先控制器接收用户的请求 并决 定应该调用哪个模型来进行处理 然后模型根据用户请求进行相应的业务逻辑处理 并返回数 据 最后控制器调用相应的视图格式化模型返回的数据 并通过视图呈现给用户 图 2 1 1 MVC 结构图 MVC 模式各模块的功能如下表 9 图 2 1 2 MVC 模块的功能图 2 2 视图 视图是用户看到并与之交互的界面 作用如下 视图向用户显示相关的数据 接受用户的 输入 不进行任何实际的业务处理 视图向模型查询业务状态 但不能改变模型 视图接受模 型发出的数据更新事件 从而对用户界面进行同步更新 视图指的是把领域模型以某种用户接口显示出来 相同的领域模型可以有多种视图 领域 模型包含了业务实体 并由业务实体保存与应用程序相关的状态 比方说 视图是一个窗口 客户可以通过窗口来查看模型的状态 而客户所见到的外观将随窗口而异 由于业务对象本身无法对外展现自己 因此必须交由视图组件向客户呈现领域模型的信息 这种视图的表示可能是 XML 和 XSLT 的形式 并将 SOAP 信息返回给 Web 服务客户 尽管可以对 不同类型的客户提供不同的视图 但是所使用的仍然是相同的模型 模型是用来表示应用程序 的状态 而视图则是用来表示模型或模型的一部分给客户看的 2 3 控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求 当 Web 用户单击 Web 页面中 的递交按钮来发送 HTML 表单时 控制器本身不输出任何东西或处理任何业务数据 J2EE 前端控制器设计模式使用一个控制器作为中控点来接收所有客户请求 这个模式除了 具有其他优点外 它对于应用程序功能的影响是 应用程序可以把安全机制 国际化以及获得 相同的服务 当这些服务的行为需要修改时 对那些可能会影响整个程序的修改而言 只需要 10 在程序中某个很小的 几乎隔绝的区域内进行修改即可 2 4 模型 模型是应用程序的主体部分 模型表示业务数据和业务逻辑 一个模型能为多个视图提 供数据 应用于模型的代码只需写一次就可以被多个视图重用 提高了代码的可重用性 应用程序的模型组件可以视为一个组织中最有价值的软件部件 模型包括了业务数据以及 存取和修改这些数据的法则 把模型放在某个位置是很重要的 如此才可以维持数据的有效性 和完整性 减少冗余 并增加重用性 模型应该知道跟使用业务对象及其相关法则的客户类型无关 事实上 模型中的组件应该 不知道是哪个类型的客户或框架正在使用它 请记住这个原理 依赖性往下走 数据往上走 其基本思想是 当你使用分层结构时 较上层的总是会依赖较下层的 但较下层的不应该依 赖其上的层次 2 5 MVC 的优点 首先 最重要的一点是多个视图能共享一个模型 同一个模型可以被不同的视图重用 大 大提高了代码的可重用性 由于 MVC 的三个模块相互独立 改变其中一个不会影响其他两个 所以依据这种设计思想 能构造良好的松偶合的构件 此外 控制器提高了应用程序的灵活性和可配置性 控制器可以用来联接不同的模型和视 图去完成用户的需求 这样控制器可以为构造应用程序提供强有力的手段 11 第 3 章 Structs 框架 Struts 作为一个开放原代码的应用框架 在最近几年得到了飞速的发展 在 JSP Web 应 用开发中应用得非常广泛 有的文献上说它已经成为 JSP Web 应用框架的事实上的标准 那么 究竟什么是 Struts 呢 要回答这个问题还得从 JSP Web 应用的两种基本的结构模式 Model 1 和 Model 2 说起 3 1 JavaWeb 应用结构的发展 3 1 1 Model 1 结构 图 3 1 1 model 1 应用结构 model 1 是一个以 JSP 文件为中心的模式 在这种模式中 JSP 页面不仅负责表现逻辑 也负责控制逻辑 专业书籍上称之为逻辑耦合在页面中 这种处理方式 对一些规模很小的项 目如 一个简单的留言簿 也没什么太大的坏处 实际上 人们开始接触一些对自己来说是新 的东西的时候 比如 用 JSP 访问数据库时 往往喜欢别人能提供一个包含这一切的单个 JSP 页面 因为这样在一个页面上他就可以把握全局 便于理解 但是 用 Model 1 模式开发大型 时 程序流向由一些互相能够感知的页面决定 当页面很多时要清楚地把握其流向将是很复杂 的事情 当您修改一页时可能会影响相关的很多页面 大有牵一发而动全身的感觉 使得程序 的修改与维护变得异常困难 还有一个问题就是程序逻辑开发与页面设计纠缠在一起 既不便 于分工合作也不利于代码的重用 这样的程序其健壮性和可伸缩性都不好 Grady Booch 等 人在 UML 用户指南一书中 强调建模的重要性时 打了一个制作狗窝 私人住宅 和大厦的 形象比喻来说明人们处理不同规模的事物时应该采用的合理方法一样 人们对不同规模的应用 12 程序也应该采用不同的模式 3 1 2 Model 2 结构 图 3 1 2 model 2 应用结构 为了克服 Model 1 的缺陷 人们引入了 Model 2 它引入了 控制器 这个概念 控制器 一般由 servlet 来担任 客户端的请求不再直接送给一个处理业务逻辑的 JSP 页面 而是送给 这个控制器 再由控制器根据具体的请求调用不同的事务逻辑 并将处理结果返回到合适的页 面 因此 这个 servlet 控制器为应用程序提供了一个进行前 后端处理的中枢 一方面为输入 数据的验证 身份认证 日志及实现国际化编程提供了一个合适的切入点 另一方面也提供了 将业务逻辑从 JSP 文件剥离的可能 业务逻辑从 JSP 页面分离后 JSP 文件蜕变成一个单纯完 成显示任务的东西 这就是常说的 View 而独立出来的事务逻辑变成人们常说的 Model 再加 上控制器 Control 本身 就构成了 MVC 模式 实践证明 MVC 模式为大型程序的开发及维护 提供了巨大的便利 3 2 Struts 概述 其实 MVC 开始并不是为 Web 应用程序提出的模式 传统的 MVC 要求 M 将其状态变化 通报给 V 但由于 Web 浏览器工作在典型的拉模式而非推模式 很难做到这一点 因此有些 人又将用于 Web 应用的 MVC 称之为 MVC2 正如上面所提到的 MVC 是一种模式 当然可以 有各种不同的具体实现 包括您自己就可以实现一个体现 MVC 思想的程序框架 Struts 就是 一种具体实现 MVC2 的程序框架 它的大致结构如图 3 2 所示 13 图 3 2 Struts 应用结构 图 3 2 基本勾勒出了一个基于 Struts 的应用程序的结构 从左到右 分别是其表示层 view 控制层 controller 和模型层 Model 其表示层使用 Struts 标签库构建 来自 客户的所有需要通过框架的请求统一由叫 ActionServlet 的 servlet 接收 ActionServlet Struts 已经为我们写好了 只要您应用没有什么特别的要求 它基本上都能满足您的要求 根据接收的请求参数 struts config xml 中 Struts 配置 ActionMapping 将请求送给合适 的 Action 去处理 解决由谁做的问题 它们共同构成 Struts 的控制器 Action 则是 Struts 应用中真正干活的组件 开发人员一般都要在这里耗费大量的时间 它解决的是做什么的问题 它通过调用需要的业务组件 模型 来完成应用的业务 业务组件解决的是如何做的问题 并 将执行的结果返回一个代表所需的描绘响应的 JSP 或 Action 的 ActionForward 对象给 ActionServlet 以将响应呈现给客户 3 3 Struts 的各组件 3 3 1 Struts 控制器组件 3 3 1 1 多应用模块 多应用模块指同一个应用包含多个子应用 每个子应用可以处理相关的一组功能 例如 对于网上购物应用 可以由一个子应用来处理商品和商品目录信息 再由另一个子应用处理购 物车和订单信息 把应用划分成多个模块 可以简化应用的并行开发过程 缩短开发周期 所 有的子应用都共享同一个 ActionServlet 实例 但每个子应用有单独的配置文件和 RequestProcessor 实例 14 图 3 3 1 1 Struts 的多应用模块 3 3 1 2 ActionServlet 组件 ActionServlet 组件充当 Struts 框架的中央控制器 Servlet 容器会在 ActionServlet 被 加载后立即执行它的 init 方法 以下是 ActionServlet 的 init 方法完成的初始化操作 1 调用 initInternal 方法 初始化 Struts 框架内在的消息资源 如与系统日志相关的通 知 警告和错误消息 2 调用 initOther 方法 从 web xml 文件中加载 ActionServlet 的初始化参数 如 config 参数 3 调用 initServlet 方法 从 web xml 文件中加载 ActionServlet 的 URL 映射信息 此外 还会注册 web xml 和 Struts 配置文件所使用的 DTD 文件 这些 DTD 文件用来验证 web xml 和 Struts 配置文件的语法 4 调用 initModuleConfig 方法 加载并解析默认子应用模块的 Struts 配置文件 创建 ModuleConfig 对象 把它存储在 ServletContext 中 5 调用 initModuleMessageResources 方法 加载并初始化默认子应用模块的消息资源 创建 MessageResources 对象 把它存储在 ServletContext 中 15 6 调用 initModuleDataSources 方法 加载并初始化默认子应用模块的数据源 如果在 Struts 配置文件中没有定义元素 就忽略这一步骤 7 调用 initModulePlugins 方法 加载并初始化默认子应用模块的所有插件 8 当默认子应用模块被成功的初始化后 如果还包括其他子应用模块 将重复步骤 4 到 步骤 7 分别对其他子应用模块进行初始化 图 3 3 1 2 Struts 控制器初始化流程 当 ActionServlet 实例接收到 HTTP 请求后 在 doGet 或 doPost 方法中都会调用 process 方法来处理请求 以下是 ActionServlet 的 process 方法的源代码 protected void process HttpServletRequest request HttpServletResponse response throws IOException ServletException ModuleUtils getInstance selectModule request getServletContext getRequestProcessor getModuleConfig request process request response 我们再来看 Struts 控制器是如何响应客户请求的 16 图 3 3 1 3 Struts 控制器响应客户请求的工作流程 Struts 框架响应客户请求的工作流程如下 1 如果 ActionMapping 实例不存在 就创建一个 ActionMapping 对象 它包含了把请 求转发给哪个 Action 的信息 2 如果 ActionForm 实例不存在 就创建一个 ActionForm 对象 把客户提交的表单数 据保存到 ActionForm 对象中 3 根据配置信息决定是否需要表单验证 如果需要验证 就调用 ActionForm 的 validate 方法 4 如果 ActionForm 的 validate 方法返回 null 或返回一个不包含 ActionMessage 的 ActionErrors 对象 就表示表单验证成功 17 5 ActionServlet 根据配置信息决定将请求转发给哪个 Action 如果相应的 Action 实 例不存在 就先创建这个实例 然后调用 Action 的 execute 方法 6 Action 的 execute 方法返回一个 ActionForward 对象 ActionServlet 再把客户请 求转发给 ActionForward 对象指向的 JSP 组件 7 ActionForward 对象指向的 JSP 组件生成动态网页 返回给客户 对于以上流程的步骤 4 如果 ActionForm 的 validate 方法返回一个包含一个或多个 ActionError 的 ActionErrors 对象 就表示表单验证失败 此时 ActionServlet 将直接把请求 转发给包含客户提交表单的 JSP 组件 在这种情况下 不会再创建 Action 对象并调用 Action 的 execute 方法 3 3 1 3 RequestProcessor 组件 RequestProcessor 的 process 方法 1 调用 processMultipart 方法 如果 HTTP 请求方式为 POST 并且请求的 contentType 属性以 multipart form data 开头 标准的 HttpServletRequest 对象将被重 新包装 以方便处理 multipart 类型的 HTTP 请求 如果请求方式为 GET 或者 contentType 属性不是 multipart 就直接返回原始的 HttpServletRequest 对象 2 调用 processPath 方法 获得请求 URI 的路径 这一信息可用于选择合适的 Struts Action 组件 3 调用 processLocale 方法 当 ControllerConfig 对象的 locale 属性为 true 将 读取用户请求中包含的 Locale 信息 然后把 Locale 实例保存在 session 范围内 4 调用 processContent 方法 读取 ControllerConfig 对象的 contentType 属性 然 后调用 response setContentType contentType 方法 设置响应结果的文档类型和字符编码 5 调用 processNoCache 方法 读取 ControllerConfig 对象的 nocache 属性 如果 nocache 属性为 true 在响应结果中加入特定的头参数 Pragma Cache Control 和 Expires 防止页面被存储在客户浏览器的缓存中 6 调用 processPreprocess 方法 该方法不执行任何操作 直接返回 true 子类可 以覆盖这个方法 执行客户化的预处理请求操作 7 调用 processMapping 方法 寻找和用户请求的 URI 匹配的 ActionMapping 如果 不存在这样的 ActionMapping 向用户返回恰当的错误消息 18 8 调用 processRoles 方法 先判断是否为 Action 配置了安全角色 如果配置了安全 角色 就调用 isUserInRole 方法判断当前用户是否具备必需的角色 如果不具备 就结束请 求处理流程 向用户返回恰当的错误消息 9 调用 processActionForm 方法 先判断是否为 ActionMapping 配置了 ActionForm 如果配置了 ActionForm 就先从 ActionForm 的存在范围内寻找该 ActionForm 实 例 如果不存在 就创建一个实例 接下来把它保存在合适的范围中 保存时使用的属性 key 为 ActionMapping 的 name 属性 10 调用 processPopulate 方法 如果为 ActionMapping 配置了 ActionForm 就先调 用 ActionForm 的 reset 方法 再把请求中的表单数据组装到 ActionForm 中 11 调用 processValidate 方法 如果为 ActionMapping 配置了 ActionForm 并且 ActionMapping 的 validate 属性为 true 就调用 ActionForm 的 validate 方法 如果 validate 方法返回的 ActionErrors 对象中包含 ActionMessage 对象 说明表单验证失败 就 把 ActionErrors 对象存储在 request 范围内 再把请求转发到 ActionMapping 的 input 属性指 定的 Web 组件 如果 ActionForm 的 validate 方法执行表单验证成功 就继续执行下一步请 求处理流程 12 调用 processForward 方法 判断是否在 ActionMapping 中配置了 forward 属性 如果配置了这个属性 就调用 RequestDispatcher 的 forward 方法 请求处理流程结束 否 则继续下一步 13 调用 processInclude 方法 判断是否在 ActionMapping 中配置了 include 属性 如果配置了这个属性 调用 RequestDispatcher 的 include 方法 请求处理流程结束 否则 继续下一步 14 调用 processActionCreate 方法 先判断是否在 Action 缓存中存在这个 Action 实例 如果不存在 就创建一个 Action 实例 把它保存在 Action 缓存中 15 调用 processActionPerform 方法 该方法再调用 Action 实例的 execute 方法 execute 方法位于 try catch 代码中 以便捕获异常 16 调用 processActionForward 方法 把 Action 的 execute 方法返回的 ActionForward 对象作为参数传给它 processActionForward 根据 ActionForward 对象包含 的请求转发信息来执行请求转发或重定向 19 3 3 1 4 Action 组件 Action 类的 execute 方法 public ActionForward execute ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response throws IOException ServletException Action 类的 execute 方法的参数和返回值 execute 方法包含以下参数 ActionMapping 包含了这个 Action 的配置信息 和 struts config xml 文件中的元 素对应 ActionForm 包含了用户的表单数据 当 Struts 框架调用 execute 方法时 ActionForm 中的数据已经通过了表单验证 HttpServletRequest 当前的 HTTP 请求对象 HttpServletResponse 当前的 HTTP 响应对象 Action 类的 execute 方法返回 ActionForward 对象 它包含了请求转发路径信息 3 3 2 Struts 模型组件 Struts 模型的组成有好几种不同的看法 对 Web 应用程序而言 业务对象和表示对象间的 界线会变得很模糊 因为某个应用程序的业务对象很可能是另一个应用程序的数据传输对象 data transfer object 简称 DTO 使用何种类型的模型足见 还可能取决于你所构建的是传统的两层应用程序还是多层分布 式应用程序 通常 对两层应用程序而言 业务对象都是和 Web 应用程序放在一起 也就是说 对象都部署在相同的 JVM 中 如此一来 使用这个业务对象来为视图获取数据就简单多了 不 过 只是因为比较简单 并不表示这样做一定是明智之举 业务对象可能又很深的对象图所组 成 其中可能有许多引用指向和表示无关的资源 一不小心 业务对象很快就会和某个特定的 表示耦合在一起 使得每次网站的外观和操作方式只要一改变 就会出现意想不到的副作用 3 3 3 Struts 视图组件 20 3 3 3 1 Struts 客户化标签库 Struts 客户化标签是联系视图组件和 Struts 框架中其它组件的纽带 这些标签可以访问 或显示来自于控制器和模型组件的数据 Struts 客户化标签库分类有 Struts HTML 标签库 Struts Bean 标签库 Struts Logic 标签库 Struts Nested 标签库 Struts HTML 标签可以和标准的 HTML 元素完成相同的功能 在 Struts 应用中提倡使用 Struts HTML 标签 这是因为这些标签可以和 Struts 框架的其他组件紧密联系在一起 例如 标签用来定义 HTML 表单 Struts 框架能够把这个表单中的数据自动映射到相应的 ActionForm Bean 中 Struts Bean 标签库中的标签可以访问已经存在的 JavaBean 以及它们的属性 还可以定义 新的 Bean 把它存放在 page 范围内或者用户指定的范围内 供网页内其他元素访问 有一些 Bean 标签可以方便的访问 HTTP 请求的 Header 信息 请求参数或 Cookie 把这些信息存放在一 个新定义的 JavaBean 中 Struts Logic 标签库中的标签可以根据特定的逻辑条件来控制输出网页内容 或者循环遍 历集合中所有元素 ActionForm 3 3 3 2 ActionForm 组件 Struts 框架的 ActionForm 对象可用来在用户和业务层之间传输客户的输入数据 Struts 框架会自动从请求中收集输入数据 再将这些数据交给一个使用表单 bean form bean 的 Action 对象 接着表单 bean 可以再交给业务层 为了把表示层和业务层分离开来 不应该直 接把 ActionForm 对象交给业务层 而是应该当使用 ActionForm 对象得到的数据创建适当的 DTO Struts 框架的数据验证可分为两种类型 表单验证和业务逻辑验证 在本例中 它们分别 运用于以下场合 表单验证 由 ActionForm 处理 如果用户没有在表单中输入姓名 就提交表单 将生成 表单验证错误 业务逻辑验证 由 Action 处理 如果用户在表单中输入的姓名为 Monster 按照本 应用的业务规则 不允许向 Monster 打招呼 因此将生成业务逻辑错误 21 下面的步骤说明了 Struts 框架如何处理每个请求响应的 ActionForm 对象 1 检查该项动作的响应映射 查看是否已经有某个 ActionForm 得到配置 2 如果对应这个对作培植了某个 ActionForm 则使用 action 元素中的 name 属性来查找 表单 bean 的配置信息 3 查看是否已经创建了 ActionForm 的一个实例 4 如果在适当的作用域内已经存在一个 ActionForm 实例 而且在这个实例的类型正是这 个新请求所需要的类型 则重用这个实例 5 否则创建所需 ActionForm 的一个新实例 并存储在适当的作用域中 有 action 的 scope 属性配置 6 调用 ActionForm 实例 reset 方法 7 反复处理请求参数 如果参数名在 ActionForm 实例中具有对应的设置方法 就为它填 上该请求参数的值 8 最后 如果 validate 属性的值设为 true 则调用 ActionForm 实例的 validate 方 法 并返回所出现的任何错误 对任何 HTML 页面而言 如果表单数据是以 POST 方式传输的 就应该使用 AvtionForm 必 要时 相同的 ActionForm 可以同时给多个页面使用 只要 HTML 字段能和 ActionForm 对象性质 property 匹配即可 3 4 配置 Struts 应用 3 4 1 创建 Web 应用的配置文件 web xml 对于 Struts 应用 它的配置文件 web xml 应该对 ActionServlet 类进行配置 此外 还应 该声明 Web 应用所使用的 Struts 标签库 在 web xml 中配置 ActionServlet action org apache struts action ActionServlet config WEB INF struts config xml 22 2 action do 在 web xml 中声明 Struts 标签库 WEB INF struts bean tld WEB INF struts bean tld WEB INF struts html tld WEB INF struts html tld WEB INF struts logic tld WEB INF struts logic tld 3 4 2 Struts 配置文件 struts config xml 与 org apache struts config 包 在 Struts 应用启动时 会把 Struts 配置文件中的配置信息读入到内存 并把它们存放在 config 包中相关 JavaBean 类的实例中 23 图 3 4 2 org apache struts config 包结构图 在 Struts 配置文件中配置 HelloAction path 属性 指定请求访问 Action 的路径 type 属性 指定 Action 的完整类名 name 属性 指定需要传递给 Action 的 ActionForm Bean scope 属性 指定 ActionForm Bean 的存放范围 validate 属性 指定是否执行表单验证 input 属性 指定当表单验证失败时的转发路径 元素还包含一个子元素 它定义了一个请求转发路径 3 5 Struts 的国际化 国际化 简称为 I18N 指的是在软件设计阶段 就应该使软件具有支持多种语言和地区的 功能 这样 当需要在应用中添加对一种新的语言和国家的支持时 不需要对已有的软件返工 24 无需修改应用的程序代码 国际化的应用特征有 当应用需要支持一种新的语言时 无需修改应用程序代码 文本 消息和图片从源程序代码中抽取出来 存储在外部 应该根据用户的语言和地理位置 对与特 定文化相关的数据 如日期 时间和货币 进行正确的格式化 支持非标准的字符集 可以方 便快捷地对应用做出调整 使它适应新的语言和地区 3 5 1 Locale 类 Local 对象本身并不执行和 I18N 相关的格式化或解析工作 Local 对象仅仅负责向本地敏 感的类提供本地化信息 例如 DateFormat 类依据 Local 对象来确定日期的格式 然后对日期 进行语法分析和格式化 创建 Local 对象时 需要明确的指定其语言和国家代码 以下代码片段创建了两个 Local 对象 一个是美国的 另外一个是中国的 Locale usLocale new Locale en US Locale chLocale new Locale ch CH Java 虚拟机在启动时会查询操作系统 为运行环境设置默认的 Locale Java 程序可以调 用 java util Locale 类的静态方法 getLocale 来获得默认的 Locale Locale defaultLocale Locale getDefault Web 容器在其本地环境中通常会使用以上默认的 Locale 而对于特定的终端用户 Web 容 器会从 HTTP 请求中获取 Locale 信息 可以通过 Locale 的构造方法来创建 Locale 对象 在创建 Locale 对象时应该把语言和国 家代码两个参数传递给构造方法 对于 Web 应用程序 通常不必创建自己的 Locale 实例 因为 Web 容器会负责创建所需的 Locale 实例 在应用程序中 可以调用 HttpServletRequest 对象 的以下两个方法 来取得包含 Web 客户的 Locale 信息的 Locale 实例 public java util Locale getLocale public java util Enumeration getLocales Struts 配置文件的元素的 locale 属性指定是否把 Locale 对象保存在 session 范围中 默认值为 true 表示会把 Locale 对象保存在 session 范围中 在处理每一个 用户请求时 RequestProcessor 类都会调用它的 processLocale 方法 processLocale 方法 把 Locale 对象存贮在 session 范围中必须满足以下条件 Struts 配置文件的元 素的 locale 属性为 true session 范围内还不存在 Locale 对象 25 Action 基类的 getLocale 方法能获得 locale 对象 先通过 HttpServletRequest 参数获得 HttpSession 对象 然后再通过 HttpSession 对象 来读取 Locale 对象 如果存在 HttpSession 对象并

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论