【Jsp精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Jsp精品源码-SSH框架的理解 - 教育的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
第一章 什么是 SSH SSH 在 J2EE 项目中表示了 3 种框架即 SpringStrutsHibernate1.1 Struts1.1.1 Struts 的起源 Struts 最早是作为 Apache Jakarta 项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高 JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。
Struts 这个名字来源于在建筑和旧式飞机中使用的支持金属架。
这个框架之所以叫quotStrutsquot,是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。
这也是一个解释 Struts在开发 Web 应用程序中所扮演的角色的精彩描述。
当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。
同样,软件工程师使用 Struts 为业务应用的每一层提供支持。
它的目的是为了帮助我们减少在运用 MVC 设计模型来开发 Web 应用的时间。
我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。
如果想混合使用 Servlets 和
JSP 的优点来建立可扩展的应用,Struts 是一个不错的选择。
早期 Smalltalk 程序语言便采用了 MVCModel-View -Controller 模式 Patterns 以增加程序代码弹性,MVC 模式将程序代码整理切割为三部份,Model 部分是业务与应用领域 Business domain 相关逻辑、管理状态之对象,Controller 部分接收来自 View 所输入的资料并与 Model 部分互动,是业务流程控制 Flow Control 之处,View 部分则负责展现资料、接收使用者输入资料。
在 Java 应用中,JFC/Swing、AWT、
JSP 皆是可用作 View 之技术规格,而 JavaBean 与 Enterprise JavaBean规格则可用于 Model 程序代码,一旦应用程序以 MVC 模式加以适当(的)分割,Model 部分程序代码可在不同使用者接口外观(的)应用程序中重复使用。
随着
JSP 与 Servlet 技术大量应用于以 Web 为基础(的)应用程序,Java 开发人员群体认为应以较佳之模式以提升 Web 应用程序之可维护性与重复使用性。
早期
JSP 规格书中曾列举两种可行之
JSP 应用架构,分别为 Model1 与 Model 2。
在 Model 1 架构中,
JSP 直接处理 Web 浏览器送来之请求Request ,并辅以 JavaBean 处理应用相关逻辑。
Model 1 架构单纯编写比较容易,但在 Model 1 中
JSP 可能同时肩负 View与 Controller 角色,两类程序代码有可能混杂而不易维护。
而 Model 2 中将 Servlet 纳入架构中扮演前端 Controller 角色,将 Web 浏览器送出之请求集中送至 Servlet ,Servlet 可集中管理使用者登入、权限控制、多国语言转换等前置处理,再视需求 第 2 页 共 44 页转向给对应之
JSP 处理。
Model 2 中采用了较佳之 MVC 模式,但增加了编写复杂度。
Struts 是 Apache 软件基金下 Jakarta 项目的一部分。
除 Struts 之外,还有其他成功的开源产品,包括 Tomcat, Ant 和 Velocity。
2000 年 Craig R. McClanahan 先生贡献了他编写的
JSP Model 2 架构之 Application Framework 原始程序代码给 Apache 基金会,成为 Apache Jakarta 计划 Struts Framework 前身。
开始的代码基础从 2000 年 5 月开始开发,直到 2001 年 6 月,1.0 版本发布。
有 30 多个开发者参与进来,并有数千人参与到讨论组中。
Struts 代码基础由一个志愿的 Commnitter 团队来管理。
到 2002 年,Struts 小组共有 9 个志愿 Commnitter。
Struts 框架的主要架构设计和开发者是 Craig R.McClanahan。
Craig 也是 Tomcat 4 的主要架构师,以及 Java Web Services Developer Pack 的主要架构师和实现者。
他现在是 Sun 的 JavaServer Faces JSR-127 以及 J2EE 平台的 Web 层架构的规范领导。
Craig R. McClanahan 先生是 JCP ExpertGroup 成员之一,曾参与
JSP 规格制定与 Tomcat 4 之编写,因此 Struts Framework广受 Java 开发人员群体所重视。
Borland 自 2002 年底开始于开发工具 JBuilder 中支持 Struts Framework。
Struts 是 Apache 基金会 Jakarta 项目组的一个 Open Source 项目,它采用 MVC 模式,能够很好地帮助 java 开发者利用 J2 第 3 页 共 44 页EE 开发 Web 应用。
和其他的 java 架构一样,Struts 也是面向对象设计,将 MVC 模式quot分离显示逻辑和业务逻辑quot的能力发挥得淋漓尽致。
Structs 框架的核心是一个弹性的控制层,基于如 JavaServlets,JavaBeans,ResourceBundles 与 XML 等标准技术,以及 Jakarta Commons 的一些类库。
Struts 有一组相互协作的类(组件)、Servlet 以及
jsp tag lib 组成。
基于 struts 构架的web 应用程序基本上符合
JSP Model2 的设计标准,可以说是一个传统 MVC 设计模式的一种变化类型。
Struts 最早是作为 Apache Jakarta 项目的组成部分问世运作。
项目的创立者希望通过对该项目的研究,改进和提高 Java Server Pages、Servlet、标签库以及面向对象的技术水准。
Struts 的目的是为了减少在运用 MVC 设计模型来开发 Web 应用的时间。
你仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。
Struts 跟 Tomcat、Turbine 等诸多 Apache 项目一样,是开源软件,这是它的一大优点,使开发者能更深入的了解其内部实现机制。
除此之外,Struts 的优点主要集中体现在两个方面:Taglib和页面导航。
Taglib 是 Struts 的标记库,灵活运用,能大大提高开发效率。
另外,就目前国内的
JSP 开发者而言,除了使用
JSP 自带的常用标记外,很少开发自己的标记,或许 Struts 是一个很好的起点。
第 4 页 共 44 页 关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。
通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
MVC 即 Model-View-Controller 的缩写,是一种常用的设计模式。
MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。
Struts 是 MVC 的一种实现,它将 Servlet和
JSP 标记(属于 J2EE 规范)用作实现的一部分。
Struts 继承了 MVC 的各项特性,并根据 J2EE 的特点,做了相应的变化与扩展。
1.1.2 Struts 的流程 服务器启动后,根据 web.xml 加载 ActionServlet 读取 struts-config.xml 文件内容到内存。
以登陆为例:第一次进 login.
jsp 会先实例化 Form、把默认值String 默认为空字符串整形默认为 0赋给表单元素。
输入用户名密码提交表单、提交到 action 属性的 login.do通过 ActionServlet 读 struts-config.xml 文件找到 action 下的 path 属性找到.do通过 name 属性找 form-beans 中的 form-bean 的 name 属性得到 ActionForm 的包名类名先实例化 form,把表单的值填充给 form,调用 form 的 validate 方法验证、Action 第 5 页 共 44 页Errors 返回 null 表示验证通过,否则失败返回 input 指定的页面.验证通过会实例化 Action,执行 Action 的 excute 方法。
1.1.3 Struts 框架结构如右图 Struts 对 Model,View 和 Controller 都提供了对应的组件。
在右图中,ActionServlet,这个类是 Struts 的核心控制器,负责拦截来自用户的请求。
Action,这个类通常由用户提供,该控制器负责接收来自 ActionServlet 的请求,并根据该请求调用模型的业务逻辑方法处理请求,并将处理结果返回给
JSP 页面显示。
Model 部分:由 ActionForm 和 JavaBean 组成,其中 ActionForm 用于封装用户的请求参数,封装成 ActionForm 对象,该对象被 ActionServlet 转发给 Action,Action 根据 ActionFrom 里面的请求参数处理用户的请求。
JavaBean 则封装了底层的业务逻辑,包括数据库访问等。
第 6 页 共 44 页 View 部分:该部分采用
JSP 实现。
Struts 提供了丰富的标签库,通过标签库可以减少脚本的使用,自定义的标签库可以实现与 Model 的有效交互,并增加了现实功能。
对应上图的
JSP 部分。
Controller 组件:Controller 组件有两个部分组成——系统核心控制器,业务逻辑控制器。
系统核心控制器,对应上图的 ActionServlet。
该控制器由 Struts 框架提供,继承 HttpServlet类,因此可以配置成标注的 Servlet。
该控制器负责拦截所有的 HTTP 请求,然后根据用户请求决定是否要转给业务逻辑控制器。
业务逻辑控制器,负责处理用户请求,本身不具备处理能力,而是调用 Model 来完成处理。
对应 Action 部分。
1.2 Spring1.2.1 Spring 的起源 Rod Johson 在 2002 年编著的《Expert one to one J2EE design and development》一书中,对 Java EE 正统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。
以此书为指导思想,他编写了 interface21 框架,这是一个力图冲破 Java EE 传统开发的困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。
Spring 框架即以 interface21 框架为基础,经过重新设计,并不断丰富其内涵,于 2004 年 3 月 24 日,发布了 1.0 正式版。
同年他又推出了一部 第 7 页 共 44 页堪称经典的力作《Expert one-to-one J2EE Development without EJB》,该书在 Java 世界掀起了轩然大波,不断改变着 Java开发者程序设计和开发的思考方式。
在该书中,作者根据自己多年丰富的实践经验,对 EJB 的各种笨重臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。
至此一战功成,Rod Johnson 成为一个改变 Java 世界的大师级人物。
传统 J2EE 应用的开发效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致 J2EE 的应用没有真正实现 Write Once 及 Run Anywhere 的承诺。
Spring 作为开源的中间件,独立于各种应用服务器,甚至无须应用服务器的支持,也能提供应用服务器的功能,如声明式事务等。
Spring 致力于 J2EE 应用的各层的解决方案,而不是仅仅专注于某一层的方案。
可以说 Spring 是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。
然而,Spring 并不想取代那些已有的框架,而是与它们无缝地整合。
1.2.2 Spring 框架 Spring 是一个开源框架,它由 Rod Johnson 创建。
它是为了解决企业应用开发的复杂性而创建的。
Spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。
然而,Spring 的用途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。
第 8 页 共 44 页 ◆目的:解决企业应用开发的复杂性 ◆功能:使用基本的 JavaBean 代替 EJB,并提供了更多的企业应用功能 ◆范围:任何 Java 应用 简单来说,Spring 是一个轻量级的控制反转IoC和面向切面AOP的容器框架 ◆轻量——从大小与开销两方面而言 Spring 都是轻量的。
完整的 Spring 框架可以在一个大小只有 1MB 多的 JAR 文件里发布。
并且 Spring 所需的处理开销也是微不足道的。
此外,Spring 是非侵入式的:典型地,Spring 应用中的对象不依赖于 Spring 的特定类 ◆控制反转——Spring 通过一种称作控制反转(IoC)的技术促进了松耦合。
当应用了 IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
你可以认为 IoC 与 JNDI 相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
◆面向切面——Spring 提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。
应用对象只实现它们应该做的——完成业务逻辑——仅此而已。
它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
第 9 页 共 44 页 ◆容器——Spring 包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个 bean 如何被创建——基于一个可配置原型(prototype),你的 bean 可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。
然而,Spring 不应该被混同于传统的重量级的 EJB 容器,它们经常是庞大与笨重的,难以使用。
◆框架——Spring 可以将简单的组件配置、组合成为复杂的应用。
在 Spring 中,应用对象被声明式地组合,典型地是在一个XML 文件里。
Spring 也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有 Spring 的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。
它们也为 Spring 中的各种模块提供了基础支持。
1.2.3 Spring 框架的好处 在我们进入细节以前,让我们看一下 Spring 可以给一个工程带来的一些好处: ◆Spring 能有效地组织你的中间层对象无论你是否选择使用了 EJB。
如果你仅仅使用了 Struts 或其他的包含了 J2EE 特有 APIs 的 framework,你会发现 Spring 关注了遗留下的问题。
第 10 页 共 44 页 ◆Spring 能消除在许多工程上对 Singleton 的过多使用。
根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
◆Spring 能消除使用各种各样格式的属性定制文件的需要在整个应用和工程中,可通过一种一致的方法来进行配置。
曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性为此不得不读 Javadoc 乃至源编码吗?有了 Spring,你可很简单地看到类的 JavaBean 属性。
倒置控制的使用在下面讨论帮助完成这种简化。
◆Spring 能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
◆Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs。
在 Spring 应用中的大多数业务对象没有依赖于 Spring。
◆使用 Spring 构建的应用程序易于单元测试。
◆Spring 能使 EJB 的使用成为一个实现选择而不是应用架构的必然选择。
你能选择用 POJOs 或 local EJBs 来实现业务接口,却不会影响调用代码。
◆Spring 帮助你解决许多问题而无需使用 EJB。
Spring 能提供一种 EJB 的替换物,它们适于许多 web 应用。
例如Spring 能使用 AOP 提供声明性事务而不通过使用 EJB 容器,如果你仅仅需要与单个的数据库打交道,甚至不需要 JTA 实现。
第 11 页 共 44 页 ■Spring 为数据存取提供了一致的框架不论是使用 JDBC 或O/R mapping 产品(如 Hibernate)。
Spring 确实使你能通过最简单可行的解决办法解决你的问题。
这些特性是有很大价值的。
总结起来,Spring 有如下优点 ◆低侵入式设计,代码污染极低 ◆ 独立于各种应用服务器,可以真正实现 Write OnceRunAnywhere 的承诺 ◆Spring 的 DI 机制降低了业务对象替换的复杂性 ◆Spring 并不完全依赖于 Spring,开发者可自由选用 Spring 框架的部分或全部1.3 Hibernate1.3.1 Hibernate 框架 Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序使用,也可以在 Servlet/
JSP 的 Web 应用中使用,最具革命意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。
第 12 页 共 44 页1.3.2 Hibernate 核心接口 Hibernate 的核心接口一共有 5 个,分别为:Session、SessionFactory、Transaction、Query 和 Configuration。
这 5 个核心接口在任何开发中都会用到。
通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这五个核心接口分别加以介绍。
Session 接口:Session 接口负责执行被持久化对象的 CRUD操作CRUD 的任务是完成与数据库的交流,包含了很多常见的 SQL 语句。
但需要注意的是 Session 对象是非线程安全的。
同时,Hibernate 的 session 不同于
JSP 应用中的 HttpSession。
这里当使用 session 这个术语时,其实指的是 Hibernate 中的 session,而以后会将 HttpSesion 对象称为用户 session。
SessionFactory 接口:SessionFactory 接口负责初始化 Hibernate。
它充当数据存储源的代理,并负责创建 Session 对象。
这里用到了工厂模式。
需要注意的是 SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个 SessionFactory 就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
Configuration 接口:Configuration 接口负责配置并启动Hibernate,创建 SessionFactory 对象。
在 Hibernate 的启动的过程中,Configuration 类的实例首先定位映射文档位置、读取配置,然后创建 SessionFactory 对象。
第 13 页 共 44 页 Transaction 接口:Transaction 接口负责事务相关的操作。
它是可选的,开发人员也可以设计编写自己的底层事务处理代码。
Query 和 Criteria 接口:Query 和 Criteria 接口负责执行各种数据库查询。
它可以使用 HQL 语言或 SQL 语句两种表达方式。
第 2 章 ssh 框架的好处 典型的 J2EE 三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。
三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。
客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。
表现层是传统的
JSP 技术,自 1999 年问世以来,经过多年的发展,其广泛的应用和稳定的表现,为其作为表现层技术打下了坚实的基础。
中间层采用的是流行的 SpringHibernate,为了将控制层与业务逻辑层分离,又细分为以下几种。
Web 层,就是 MVC 模式里面的“C”(controller),负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现,该系统的 MVC 框架采用 Struts。
Service 层(就是业务逻辑层),负责实现业务逻辑。
业务逻辑层以 DAO 层为基础,通过对 DAO 组件的正面模式包装,完成系统所要求的业务逻辑。
第 14 页 共 44 页 DAO 层,负责与持久化对象交互。
该层封装了数据的增、删、查、改的操作。
PO,持久化对象。
通过实体关系映射工具将关系型数据库的数据映射成对象,很方便地实现以面向对象方式操作数据库,该系统采用 Hibernate 作为 ORM 框架。
Spring 的作用贯穿了整个中间层,将 Web 层、Service 层、DAO 层及 PO 无缝整合,其数据服务层用来存放数据。
一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力;它可以被扩展以进行内部的定制化;并且有强大的用户社区来支持它。
框架通常能很好的解决一个问题。
然而,你的应用是分层的,可能每一个层都需要各自的框架。
仅仅解决 UI 问题并不意味着你能够很好的将业务逻辑和持久性逻辑和 UI 组件很好的耦合。
不可否认,对于简单的应用,采用 ASP 或者 PHP 的开发效率比采用 J2EE 框架的开发效率要高。
甚至有人会觉得:这种分层的结构,比一般采用
JSP Servlet 的系统开发效率还要低。
采用 Hibernate 作为持久层技术的最大的好处在于:可以完全以面向对象的方式进行系统分析、系统设计。
DAO 模式需要为每个 DAO 组件编写 DAO 接口,同时至少提供一个实现类,根据不同需要,可能有多个实现类。
用 Spring 容器代替 DAO 工厂 第 15 页 共 44 页 通常情况下,引入接口就不可避免需要引入工厂来负责 DAO组件的生成。
Spring 实现了两种基本模式:单态模式和工厂模式。
而使用 Spring 可以完全避免使用工厂模式,因为 Spring 就是个功能非常强大的工厂。
因此,完全可以让 Spring 充当 DAO 工厂。
由 Spring 充当 DAO 工厂时,无须程序员自己实现工厂模式,只需要将 DAO 组件配置在 Spring 容器中,由 ApplicationContext 负责管理 DAO 组件的创建即可。
借助于 Spring 提供的依赖注入,其他组件甚至不用访问工厂,一样可以直接使用 DAO。
第 3 章 SSH——一种优雅的流行架构 用 java 来建立一个很有价值的 web 应用不.