说说最多人用的SSH或SSI吧,现在用的比较多的应该就是struts2.x+spring3.X+hibernate4.X或hibernate3.X了吧,mybatis用的人也有,方便有DBA的公司。
来看看SSH和SSI的优点吧:
1)spring IOC很牛叉,管理对象,使我们免于一系列的对象依赖处理中
2)struts2相对于struts1有很多改进,dispatcher等等好像还蛮好用的(2接触得不多,这里就不多说了)
3)hibernate这个几乎是JAVA界的ORM典范,这个相信大家都知道它的好处了,缓存管理,对象和表的映射,这些都足已让我们投入它的怀抱。
4)mybatis或者ibatis,对于存在DBA的公司,可以在SQL语句上面进行相当精度的调优,这个是比hibernate好的地方,缓存那些基本都差不多。
5)代码规范,SSH或SSI框架实现的架构,基本上是4层,或更多层数,具体看定义,在代码的实现上面比较统一,看起来也比较舒服,方便以后的维护。
当然,有优点肯定也有缺点:
1)学习成本,三大框架,说明是了“大”框架,突出在大,学习成本肯定不低,特别是要深入的时候,三个框架,随便一个都可以花费巨大的精力。
2)运用了orm框架的系统,在SQL语句上面可能没有直接JDBC上那么灵活,不能方便DBA或者相应的数据库人员进行调优。

真正可以把JAVA那些比较重要的内容吃透的人,学哪个框架都不是问题,比如把并发,IO,反射这些都深入了解的话,IOC框架也可以自己写一个,
另外,分布式那些很深入的话,hadoop那些快速入门也没什么问题的(hadoop太复杂了,这个感觉不大属于实用的环节,我们就没必要去说写一个了)。

转载:http://cxshun.iteye.com/blog/1901636

相信S2SH没人不知道了吧,struts2+spring+hibernate,企业开发的“基础”架构,为什么基础标上引号,因为这个基础只是很多人自以为的而已,最基础的是servlet,很多培训机构很多基础都不教,直接上来就三大框架了,SSH不然就SSI,搞得很多人以为JAVAWEB开发就一定要框架,没框架就跟没了手一个样。三大框架没有什么坏处,实用,很多公司都在用,直接上手开发。但毕业以为真的好久没用三大框架了,spring倒是有用,特别是springMVC,感觉用起来比struts2爽多了。其实想想也知道,spring是吸收了struts的一些优点的,另外加上一些RESTFUL的东西,感觉爽多了。但今天我们不看springMVC,以后我们再抽时间来一起看看springMVC的优雅的地方。

进入正题啦。SSH一直在更新版本,这里我还是要说一下版本,不然一堆朋友会骂我一顿的,struts2我用的是2.3.4,spring是最新的3.2.2,hibernate是4.1.9,还是蛮新的啊。

在进入代码前,我们先来了解下三大框架各自扮演的角色。

1)struts:为什么我们用struts,跟servlet比起来什么区别?实际上不用struts我们还是可以做到MVC的,只是在配置文件上面可能就比较郁闷点了。struts主要帮我们实现分发的一个功能,将我们的具体的请求分到某一个具体的类中,并帮我们进行属性的设置(struts1.X中通过ActionForm来进行)。struts2相比struts1是进步很多了,自动设值,没有强制要求实现或继承类,并且有了一系列的请求链之类的概念。由于这些用得不多,免得误导各位兄弟,就不多说了。

2)spring:相信spring的大名没有搞JAVA的不知道了吧。很多人接触spring最开始应该也是通过它的IOC了解的吧,或者直接啥都不知道,就三大框架SSH来了。没关系,反正当我们用三大框架时,spring很大程度上是作为一个纽带类的工具,结合另外两大框架,SSI,SSH都一样,spring只是提供了工具让我们更方便地使用三大框架。当然,框架结合中很大程序也依赖了spring的IOC,另外,事务我们也当然会用到。AOP这些比较高级的东西,就要看需要了,如有什么日志要求,拦截要求,用AOP就可以实现地比较好了。

3)Hibernate:Hibernate在JAVA界也是大名鼎鼎的了,基本上是ORM的标准了。它提供了缓存,一级和二级,并且还有HQL,三大框架结合的时候,我们用它的什么呢?当然就是ORM这个映射的主要功能了,缓存的我们暂时不考虑了。很多人没考虑过为什么需要ORM吧。其实主要还是因为数据的字段和类之间的冲突,如果用JDBC来操作,一个个字段去set,估计做久了,人都会疯掉,所以这时ORM就出现了。

三大框架各自负责的东西如下:struts2——负责请求转发及表单的相应处理,spring——类的组织(即IOC),把本来由struts2管理的Action作为bean来管理,hibernate——ORM映射,把类映射到表中。

了解了大概分工,当然就开始我们的编码了。三大框架比较麻烦的就是包了,很多人喜欢用myeclipse主要还是因为它可以帮我们导入三大框架的包。但建议新手还是不要用那个,一是myeclipse有自己的项目结构,拿到eclipse一导还要设置一些project facet之类的,给别人带来不便;二是公司里面很少用myeclipse,还是熟悉eclipse好点。或者喜欢idea的也不错。

struts2的必须的包如下:antlr,asm,xwork,struts2-core,ognl,common-logging,common-fileupload,struts-spring-plugin,大概就这几个,可能没写全,大家可以在启动时报错的情况再加上,不建议一上来就丢所有包,三大框架有一些包是冲突的。

spring3需要的包如下:spring-beans,spring-core,spring-context,spring-context-support,spring-expression,spring-orm(我们用到三大框架,需要ORM支持),spring-web,spring-tx(我们用到事务,但例子中不涉及)。

hibernate4需要的包如下:hibernate下载包内的required文件夹的所有JAR包。

就大概这些包就OK了,还是那句话,不建议一上来就放所有包,因为三大框架有些包是有冲突的,在需要的时候酌情加上就好,出现ClassNotFound的时候就把到相应的JAR包,放到lib目录下。

准备工作就到此结束了,我们正式开始了。

1)首先,我们需要使用struts2,肯定要让他拦截请求

  1. <filter>
  2. <filter-name>struts2</filter-name>
  3. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>struts2</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

这段代码就让struts拦截所有请求,当然,并不是说就这样所有请求就被spring拦截了,我们还可以配置struts.xml,让struts拦截特定的后缀名,一般情况下都是action。如下:

  1. <constant name="struts.objectFactory" value="spring" />
  2. <constant name="struts.action.extension" value="action" />

struts.action.extension就配置了拦截的默认后缀名,这样在拦截的时候就会检查后缀名,符合的就会被struts进行转发了。而struts.objectFactory而是表示把struts的转发处理类交由spring来进行管理,也即是作为bean进行管理。

2)平常我们直接使用spring的时候,会调用*ApplicationContext,但我们现在是在WEB情况下,总不能手动调用吧。实际上,spring提供了一个供WEB情况下调用的方法,有一个servlet(这个我没用过,不大清楚怎么用),一个listener,servlet是供不支持filter的应用服务器调用的,但现在我们基本上都使用listener了。

  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>

这种情况下是spring需要和其他框架结合的情况下使用的大部分情况,当我们只是使用springMVC时,就可以直接配置DispatcherServlet进行替换上面的struts的servlet,具体我们之后用springMVC的时候再看。

这种情况下,一般会去加载WEB-INF目录下的applicationContext.xml文件,当你文件名不是这个,或者路径不在这里时,就可以配置configContextPath属性

  1. <context-param>
  2. <param-name>configContextPath</param-name>
  3. <param-value>WEB-INF/applicationContext.xml</param-value>
  4. </context-param>

它支持使用classpath:前缀等,这里不多说了,可以详细看spring的配置文件。这样实际上我们就已经把struts和spring结合起来了,只是没有进行一些bean的配置和struts的转发罢了。

3)而作为ORM的hibernate,此时也由spring来一起管理。spring提供了一个LocalSessionFactory,注意,这个类,hibernate3和4是不同的,spring提供了两个。下面这段配置在applicationContext.xml中

  1. <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource" />
  3. <property name="mappingResources">
  4. <list>
  5. </list>
  6. </property>
  7. <property name="hibernateProperties">
  8. <props>
  9. </props>
  10. </property>
  11. </bean>

其实的配置就跟hibernate中的类似了,这里不多说具体的代码了。

4)在以前spring2.5.x的时候,我们用的最多的是HibernateDaoSupport,但spring3.X开始就不提供这个支持了,我们需要用原生的session进行操作(只需要注入SessionFactory即可),但这里实际上就涉及到一个问题,如果我们每个请求都去打开关闭连接,会比较消耗资源,但如果不关闭连接,又会不大好。所以就需要有一个折衷的方案,有一个管理器来管理连接。这里spring提供了一个OpenSessionInView,在每打开一个view(基本上是每一个请求时),会打开Session,这里它内部怎么管理我们就暂时先不管了。

  1. <filter>
  2. <filter-name>openSessionInViewFilter</filter-name>
  3. <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>openSessionInViewFilter</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

这里还是让他拦截所有的请求,当然可以配置成只拦截action后缀的,就没有必要浪费资源了。

5)基本上,我们的SSH框架就搭好了,接下来只是代码的问题了。只需要在spring配置文件中配置bean,或者喜欢Annotation的话可以直接@Component(value='bean名称')就可以了,但要记得在配置文件中开启Component-scan。

代码就不写详细的了,大致如下的:

  1. @Component(value="userAction")
  2. public class UserAction{}
  1. <package name="user" extends="struts-default" namespace="/user">
  2. <!-- 用户登录 -->
  3. <action name="login" class="userAction" method="login">
  4. <result name="ERROR">/pages/login.jsp</result>
  5. </action>
  6. </package>

实际上也就是把class中的指向修改为指向bean即可。

代码详细的就不贴了,毕竟是总结贴。总得来说,SSH对于一个团队内规范代码是比较有好处的,因为在框架的规范下写出的代码基本上有一个特定的形式在,对以后的维护也好点。但对于初学的朋友来说,建议不要太多的依赖框架,真非要用,至少需要在总体上了解一下这个框架做了什么,什么情况下需要用它,什么情况下绝不要用。

【转载】S2SH的更多相关文章

  1. S2SH新手框架结构的准备工作只需要导入这些文件

    实习北京最近一直在某公司.时间很冲突,总想着有事找东西坐,思想,做事先成套我吧 一套完整的东西想好主题,术去实现了,在学校尽管说是学了J2EE,可是确实没学到东西,Struts2+Hibernate不 ...

  2. S2SH新手框架建立具体过程

    S2SH集成框架新手学习总结 第一章:S2SH框架新手搭建准备工作仅仅都须要导入那些文件 第二篇:S2SH框架新手搭建具体过程 版本号信息:Struts2.3+Hibernate4.3.6+Sprin ...

  3. Crystal Clear Applied: The Seven Properties of Running an Agile Project (转载)

    作者Alistair Cockburn, Crystal Clear的7个成功要素,写得挺好. 敏捷方法的关注点,大家可以参考,太激动所以转载了. 原文:http://www.informit.com ...

  4. RTP与RTCP协议介绍(转载)

    RTSP发起/终结流媒体.RTP传输流媒体数据 .RTCP对RTP进行控制,同步.RTP中没有连接的概念,本身并不能为按序传输数据包提供可靠的保证,也不提供流量控制和拥塞控制,这些都由RTCP来负责完 ...

  5. 《Walking the callstack(转载)》

    本文转载自:https://www.codeproject.com/articles/11132/walking-the-callstack Download demo project with so ...

  6. [转载]MVVM模式原理分析及实践

    没有找到很好的MVVM模式介绍文章,简单找了一篇,分享一下.MVVM实现了UI\UE设计师(Expression Blend 4设计界面)和软件工程师的合理分工,在SilverLight.WPF.Wi ...

  7. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  8. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作

    从MyEclipse转战到IntelliJ IDEA的经历 注转载址:http://blog.csdn.net/luoweifu/article/details/13985835 我一个朋友写了一篇“ ...

  9. TCP同步与异步,长连接与短连接【转载】

    原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896   这是今天看到的一篇讲到T ...

随机推荐

  1. paip.gui控件tabs控件加载内容的原理以及easyui最佳实现

    paip.gui控件tabs控件加载内容的原理以及easyui最佳实现 //////////////tabs控件的加载 同form窗体一样,俩个方式 两个方式:一个是url,简单的文本可以使用这个,不 ...

  2. iOS开发-状态模式

    状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...

  3. iOS开发----调用地图导航

    注意:本文章下的代码有个别变量未知,所以是不能直接跑通的,我也是转别人的 在IOS6.0系统后,兼容iOS5.0与iOS6.0地图导航,需要分两个步骤 #define SYSTEM_VERSION_L ...

  4. CSS实现特殊效果

    CSS实现三道杠效果 http://jsbin.com/hocopusuvi/edit?html,css,output CSS实现圆点效果 http://jsbin.com/nojiromaje/ed ...

  5. FreeCodeCamp 前端初级算法(个人向)

    freecodecamp 初级算法地址戳这里 Reverse a String 翻转字符串 function reverseString(str) { str=str.split("&quo ...

  6. 通过ReentrantLock源代码分析AbstractQueuedSynchronizer独占模式

    1. 重入锁的概念与作用       reentrant 锁意味着什么呢?简单来说,它有一个与获取锁相关的计数器,如果已占有锁的某个线程再次获取锁,那么lock方法中将计数器就加1后就会立刻返回.当释 ...

  7. php对csv文件的读取,写入,输出下载操作

    在实际工作中,很多时候需要把网站上的一些数据下载到CSV文件里,方便以后查看. 亦或者是用CSV进行一些批量的上传工作. 这个时候我们就需要对CSV进行读写操作. 1.CSV的读取操作 <?ph ...

  8. 使用Nginx负载均衡搭建高性能.NETweb应用程序二

    在文章<使用Nginx负载均衡搭建高性能.NETweb应用程序一>中,让我们对Nginx有了一个初步认识,下面我们将在windows平台下面使用Nginx演示集群部署我们的web应用. 一 ...

  9. Python:常用函数封装

    def is_chinese(uchar): """判断一个unicode是否是汉字""" if uchar >= u'\u4e00' ...

  10. 【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項…

    http://makedreamvsogre.blogspot.tw/2014/01/ios-dependenciesogre-source.html 可能有人會想問我為什麼要自行編譯IOS Depe ...