SSH框架是个怎么回事?
我相信来看这篇文章的童鞋基本上是刚开始入门正在努力找方向的,所以我将尽可能的少涉及旁枝末节及背景知识,力求简明易懂。当然高手们如果在读了小文之后发现了任何错误和不妥,请不吝指正。
直接进入正题。现在我们访问的大多数网页都是动态网页,这个动态是相对于互联网刚刚兴起的时候那些纯HTML的静态网页来说的。动态网页指那些由网站那边的服务器根据用户的请求动态生成的网页,静态网页与之相反其内容固定不变的。动态网页开发最根本的就是服务器端接收到浏览器提交的请求,通过一系列的程序操作最终生成一段完整的HTML文档,再交给浏览器显示的过程。
最原始的编写动态网页的方法是使用servlet,其实就是把用户请求传递给一个java类,这个类负责分析请求中的内容然后用println输出一行行的HTML代码,交给浏览器显示。这种方法的确能够动态生成网页,不过有两个致命的问题不好解决。首先:HTML一直都是网页设计人员的法宝,他们能够设计出漂亮精美的页面,但是使用servlet开发的话,要用java语言输出这些文档,这使得设计人员还需要掌握java才成。其次,即使是java开发人员,使用println这种方式想把复杂的网页内容正确完整的输出就不是一件简单的事情,或者说,根本就是就是不可能的。
后来,人们将思路转变了一下,于是JSP出现了,它允许将java代码嵌入到设计好的HTML页面中。解决了使用servlet开发动态页面遇到的那两个难题。对于网页设计人员来说在他们面前的仍然是他们所熟悉的HTML,只是扩展了部分特殊的标签以容纳业务逻辑代码。对于java程序员来说,也可以专心编写与业务逻辑相关的java代码。服务器会将JSP中的java代码自动转换为servlet,一定程度上减轻了开发人员的负担。但是这种实现方式将页面的显示逻辑和业务逻辑都混杂在JSP页面中,无论是前台页面还是后台逻辑哪一方发生修改,都需要另一方参与,反而增加了维护成本。
之后,采用JSP+Servlet+Javabean的新模式实现了最基本的MVC分层,这种结构被称之为MVC Model1。有负责前台展示的 JSP、负责流程逻辑控制的Servlet以及负责数据封装的Javabean。是这种结构仍然存在问题:因为JSP页面中仍然需要使用符号嵌入很多的 Java代码,这致使页面结构混乱,Servlet和Javabean负责了大量的跳转和运算工作,耦合紧密,程序复用度低等等。这引起了人们对 JSP 页面内脚本元素的使用的广泛关注,这接着导致了人们进行替代解决方案的开发。
JSP2.0规范推出增加了JSP标准标签库JSTL(JSP Standard Tag Library)。这是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。使得网页设计人员不需要向页面嵌入脚本即可实现基本的页面逻辑。
MVC Model 2 中将Servlet 纳入架构中扮演前端Controller 角色,将Web 浏览器送出之请求集中送至Servlet ,Servlet 可集中管理使用者登入、权限控制、多国语言转换等前置处理,再视需求转向给对应之JSP 处理。Model 2 中采用了较佳之MVC 模式,但增加了编写复杂度。
为了简化开发,Struts出现了。所以说,其目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。针对不同的业务,我们需要一个Action类负责页面跳转和后台逻辑运算,一个或几个JSP页面负责数据的输入和输出显示,还有一个 Form类负责传递Action和JSP中间的数据。JSP中可以使用Struts框架提供的一组标签,就像使用HTML标签一样简单,可以完成非常复杂的逻辑。在Struts里面,Action里面放置业务逻辑的代码,这些代码不可避免的要和数据库打交道比如从数据库中读取信息并把操作好的信息再存回数据库。但使用复杂的SQL语句进行读写、关闭连接,获得的数据又需要转换或封装后往外传,这是一个非常烦琐的过程。当项目大到一定程度的时候,需要把对数据库的维护独立出去。
这时出现了 Hibernate框架,它需要你创建一系列的持久化类,每个类的属性都可以简单的看做和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表件关联的对应。当我们需要相关操作是,不用再关注数据库表。我们不用再去一行行的查询数据库,只需要持久化类就可以完成增删改查的功能。使我们的软件开发真正面向对象,而不是面向混乱的代码。我的感受是,使用Hibernate比JDBC方式减少了80%的编程量。
现在我们有三个层了,可是每层之间的调用是怎样的呢?比如显示层的Struts需要调用一个业务类,就需要new一个业务类出来,然后使用;业务层需要调用持久层的类,也需要new一个持久层类出来用。通过这种new的方式互相调用就是软件开发中最糟糕设计的体现。简单的说,就是调用者依赖被调用者,它们之间形成了强耦合,如果我想在其他地方复用某个类,则这个类依赖的其他类也需要包含。程序就变得很混乱,每个类互相依赖互相调用,复用度极低。如果一个类做了修改,则依赖它的很多类都会受到牵连。 为此,出现Spring框架。
Spring的作用就是完全解耦类之间的依赖关系,一个类如果要依赖什么,那就是一个接口。至于如何实现这个接口,这都不重要了。只要拿到一个实现了这个接口的类,就可以轻松的通过xml配置文件把实现类注射到调用接口的那个类里。所有类之间的这种依赖关系就完全通过配置文件的方式替代了。所以 Spring框架最核心的就是所谓的依赖注射和控制反转。
Struts负责显示层,Hibernate负责持久层,Spring负责中间的业务层,这个结构是目前使用最广泛的Java Web应用程序架构了。