java ssh三大框架搭建、原理及优缺点介绍

时间:2016-10-02
java ssh不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。本文章向大家介绍java ssh三大框架搭建方法、工作原理及各自的优缺点。需要的朋友可以参考一下。

ssh三大框架搭建详解

SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题。下面我介绍一下SSH框架搭建的全过程。 

第一步:准备工作。 下载好eclipse,Struts2,Spring,Hibernate。 

(1)eclipse:eclipse下载的时候建议下载JavaEE版的eclipse。当然你也可以下载eclipse-SDK。(下载eclipse-SDK需要下载Web,Tomcat等plugins) 

(2)Struts2:http://struts.apache.org/download 引入Struts的jar包。下载 struts-*-all.zip 解压后,struts\lib目录下是struts所有的相关jar包。 其中有5个是必须的:

  1. Commons-logging-1.0.4.jar
  2. Freemarker-2.3.13.jar 
  3. Ognl-2.6.11.jar
  4. Struts2-core-2.1.6.jar
  5. Xwork-2.1.2.jar 

其余jar包并不是struts必须的。还有3个包也要注意导入。不导入运行Tomcat时候可能会出现异常。 

  1. commons-io-1.3.2.jar
  2. commons-fileupload-1.2.1.jar
  3. javassist-3.7.ga.jar 

注意:javassist-3.7.ga.jar包是在struts2-blank-2.2.1.war示例工程中的web-inf/lib下的。 

(3)Spring:http://www.springsource.com/download/community 还可以在eclipse下安装下载。具体步骤是这样的:

  1. 打开eclipse-help-Software Updates.
  2. 在打开的对话框中选择上面的第二项(Available Software)。
  3. 点击Add Site按钮,弹出URL对话框。 
  4. 在对话框里输入:http://springide.org/updatesite/点击OK。 
  5. 选择sping IDE点击安装(Install)。

(4)Hibernate:http://sourceforge.net/projects/hibernate/files/hibernate3/ 

(5)Jdk的src.zip包导入。(当然不导入也可以) 

第二步:

(1)创建一个 Web Progect,自己起一个喜欢的名字。 

(2)修改WEB-INF下的web.xml文件,增加struts2的配置。

<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
    id="WebApp_ID" version="2.5">  
    <display-name>SSHTest</display-name>  
    <!-- struts Framework -->  
    <filter>  
        <filter-name>struts2</filter-name>  
        <filter-class>  
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
        </filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>struts2</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    <!-- welcome file -->  
    <welcome-file-list>  
        <welcome-file>index.jsp</welcome-file>  
    </welcome-file-list>  
</web-app> 

(3)在WEB-INF/classes目录下添加struts.xml配置文件: 

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC     
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"     
    "http://struts.apache.org/dtds/struts-2.0.dtd">    
<struts>  
    <package namespace="/" name="struts2" extends="struts-default">  
        <action name="login" method="execute" class="loginAction">  
            <result name="success">/WEB-INF/jsp/login.jsp</result>  
            <result name="input">/WEB-INF/index.jsp</result>  
        </action>  
    </package>  
</struts>    

(4)配置Spring 

1、导入spring包。spring-framework-**.zip解压后,将spring-framework-**文件夹的dist目录下的jar包导入工程中。 

2、配置web.xml文件。 

<!-- Spring Framework -->  
<listener>  
    <listener-class>  
      org.springframework.web.context.ContextLoaderListener  
    </listener-class>  
</listener>  
<context-param>  
    <param-name>contextConfigLocation</param-name>  
    <param-value>  
        classpath:/applicationContext*.xml  
    </param-value>  
</context-param>  

3、添加applicationContext.xml文件。 

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="  
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">  
    <!-- Action -->  
    <bean id="loginAction" scope="prototype" class="action.LoginAction"></bean>  
</beans>  

4、整合Spring与Struts。在Struts的lib目录中找到struts2-spring-plugin-*.jar,引入到工程中。

(5)配置Hibernate 

1、解压缩hibernate-distribution-*.zip。导入hibernate-distribution-*GA\lib\required目录中的jar包。 

  • hibernate3.jar 核心类库 
  • antlr-2.7.6.jar 代码扫描器,用来翻译HQL语句 
  • commons-collections-3.1.jar  Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大 
  • dom4j-1.6.1.jar  一个Java的XML API,类似于jdom,用来读写XML文件的 
  • javassist-3.4.GA.jar  Javassist字节码解释器 
  • jta-1.1.jar 标准的JTA API。 
  • slf4j-api-1.5.2.jar 
  • slf4j-nop-1.5.2.jar 

2、创建Hibernate配置文件。在WEB-INF/calsses目录下建立链接数据库的配置文件hibernate.cfg.xml。(本人比较懒,公司电脑中只有Access,也懒得下载别的DBMS。所以例子是连接Access的大家将就看吧。 

注意:需要导入Access_JDBC30.jar。 

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-configuration PUBLIC     
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"     
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
    <session-factory>  
        <property name="connection.driver_class">  
            com.hxtt.sql.access.AccessDriver     
        </property>  
        <property name="connection.url">  
            jdbc:access:///D:/workspace/SSHTest/TestDatabase.accdb  
        </property>  
        <!--  数据库连接设置 -->  
        <property name="eclipse.connection.profile">access</property>  
        <property name="connection.username"></property>  
        <property name="connection.password"></property>  
        <property name="dialect">com.hxtt.support.hibernate.HxttAccessDialect</property>  
        <!-- show_sql 生成SQL语句 -->  
        <property name="show_sql">true</property>  
        <!-- SQL dialect 方言 -->  
        <property name="hibernate.dialect">  
            com.hxtt.support.hibernate.HxttAccessDialect     
        </property>  
        <!-- 添加实体类的映射文件-->  
        <mapping resource="Login.hbm.xml" />  
            
        <!-- Annotation方式配置  
        <mapping class="entity.Login"/>  
         -->  
    </session-factory>  
</hibernate-configuration> 

 注意:单独使用Hibernate需要创建Session工厂类HibernateSessionFactory.java(如果用Spring整合就不需要了。Spring会在applicationContext.xml中创建。) 

Hibernat 对数据库的操作是通过Session来实现的,这里的session不同于页面间传递参数的session, 而是类似于JDBC中的 Connection。Session是Hibernate运作的中心, 对象的生命周期、事务的管理、数据库的存取都与session息息相关。而Session是由HibernateSessionFactory创建的,是线程安全的, 可以让多个执行线程同时存取HibernateSessionFactory而不会有数据共享的问题,但不能让多个线程共享一个Session。 

3、Login.hbm.xml文件

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE hibernate-mapping PUBLIC  
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
<hibernate-mapping package="包名">  
    <class name="类名" table="表名">  
        <id name="主键在java类中的字段名" column="对应表中字段" type="类型 ">  
            <generator class="主键生成策略"/>  
        </id>  
    </class>  
</hibernate-mapping>  

(6)Spring整合Hibernate。Spring对hibernate的Session的创建、提交、关闭的整个生命周期进行管理。 

配置sessionFactory,让spring来创建Session。在applicationContext.xml中增加如下代码:

<!-- sessionFactory -->  <!-- 转载请注明http://www.manongjc.com -->  
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
       <property name="configLocation">  
           <value>classpath:/hibernate.cfg.xml</value>  
       </property>  
    </bean>  

SSH框架原理介绍

1、Struts工作原理

MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC的工作原理,如下图所示: 

MVC的工作原理

转载请注明http://www.manongjc.com

Struts  是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的工作原理,

视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: Html,Bean,Logic,Template等,这有利于分开表现逻辑和程序逻辑。

控制:在Struts中,承担MVC中Controller角色的是一个Servlet,叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。

模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java Bean或EJB等。

流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevlet,ActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。

核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。

2、Spring的工作原理

Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/R mapping解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。

3、Hibernate的工作原理

Hibernate使用了J2EE架构中的如下技术:JDBC、JTA、JNDI。其中JDBC是一个支持关系数据库操作的一个基础层;它与JNDI和JTA一起结合,使得Hibernate可以方便地集成到J2EE应用服务器中去。 在这里,我们不会详细地去讨论Hibernate API接口中的所有方法,我们只简要讲一下每个主要接口的功能,如果你想了解得更多的话,你可以在Hibernate的源码包中的net.sf.hibernate子包中去查看这些接口的源代码。下面我们依次讲一下所有的主要接口: 核心接口 以下5个核心接口几乎在任何实际开发中都会用到。通过这些接口,你不仅可以存储和获得持久对象,并且能够进行事务控制。

Session接口 Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响。

SessionFactory 接口 这里用到了一个设计模式――工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。 令你感到奇怪的是SessionFactory并不是轻量级的!实际上它的设计者的意图是让它能在整个应用中共享。典型地来说,一个项目通常只需要一个SessionFactory就够了,但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。 SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据,还缓冲了一些将来有可能重复利用的数据。

Configuration 接口 Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

Query和Criteria接口  Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。 Criteria接口与Query接口非常类似,它允许你创建并执行面向对象的标准化查询。 值得注意的是Query接口也是轻量级的,它不能在Session之外使用。

Callback 接口 当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback接口会通知Hibernate去接收一个通知消息。一般而言,Callback接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。以下是它的策略接口:

  • 主键的生成 (IdentifierGenerator 接口)
  • 本地SQL语言支持 (Dialect 抽象类)
  • 缓冲机制 (Cache 和CacheProvider 接口)
  • JDBC 连接管理 (ConnectionProvider接口)

.事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口)

  • ORM 策略 (ClassPersister 接口)
  • 属性访问策略 (PropertyAccessor 接口)
  • 代理对象的创建 (ProxyFactory接口)

Hibernate为以上所列的机制分别创建了一个缺省的实现,因此如果你只是要增强它的某个策略的功能的话,只需简单地继承这个类就可以了,没有必要从头开始写代码。

Hibernate运行在两种环境下:可管理环境和不可管理环境

  • 可管理环境――这种环境可管理如下资源:池资源管理,诸如数据库连接池和,还有事务管理、安全定义。一些典型的J2EE服务器(JBoss、Weblogic、WebSphere)已经实现了这些。
  • 不可管理环境――只是提供了一些基本的功能,诸如像Jetty或Tomcat这样的servlet容器环境。

SSH框架优缺点

1、Struts优缺点

优点: 

  1. 开源软件,能更深入的了解其内部实现机制。 
  2. Taglib 标记库,灵活动用,能大大提高开发效率。
  3. 页面导航使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
  4. 提供Exception处理机制 . 
  5. 数据库链接池管理 
  6. Struts 的Action必需是thread-safe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。 

缺点: 

Taglib 是Struts的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。 

Struts 将MVC的Controller一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。 

ActionForms 使用不便、无法进行单元测试(StrutsTestCase只能用于集成)

2、Spring优缺点

优点:

  1. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。 
  2. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 
  3. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。 
  4. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。 
  5. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 
  6. 使用Spring构建的应用程序易于单元测试。 
  7. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。 
  8. Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。 
  9. Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。

Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。 

缺点:使用人数不多、jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

3、Hibernate的优缺点

优点:

  1. Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP里面的访问数据库的代码。
  2. Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。
  3. Hibernate不能用来直接和Entity Bean做对比,只有放在整个J2EE项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate也是做为JDBC的替代者出现的,而不是Entity Bean的替代者出现的。
  4. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
  5. Hibernate可以应用在任何使用JDBC的场合。
  6. Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。
  7. Hibernate 的性能非常好,因为它是个轻量级框架。 映射的灵活性很出色。
  8. 它支持各种关系数据库,从一对一到多对多的各种复杂关系。 

缺点:

它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)。

让我再列一次我已经列n次的框架结构:

传统的架构: 
1) Session Bean <-> Entity Bean <-> DB
为了解决性能障碍的替代架构: 
2) Session Bean <-> DAO <-> JDBC <-> DB
使用Hibernate来提高上面架构的开发效率的架构: 
3) Session Bean <-> DAO <-> Hibernate <-> DB

SSH框架的各自作用

AVA三大框架用来做WEN应用。 struts主要负责表示层的显示 spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作) hibernate主要是数据的持久化到数据库 在用jsp的servlet做网页开发的时候有个web.xml的映射文件,里面有个mapping的标签就是用来做文件映射的。 当你在浏览器上输入URL地址的时候,文件就会根据你写的名称对应到一个java文件,根据java文件里编写的内容显示在浏览器上,就是一个网页,所以网页名字是随便写的,随便起的名字,不管你起的是.php .jsp .do还是其他的什么都对应这个java文件,这个java文件里的代码进行什么操作就干什么,显示一句话还是连接数据库还是跳转到其他页面等等,这个java文件把数据进行封装起到安全和便于管理的作用。其实这个java文件编译过来是.class的一个字节码文件,没有那么一个类似html嵌入标签和代码的网页文件。他与jsp文件区别就是jsp把代码嵌入到html标签中。 还有servlet或者struts中html表单的action中的提交名称对应一个java文件,struts一般是.do的,都和上面一样是映射。