【转载】S2SH

说说最多人用的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,肯定要让他拦截请求

Java代码  

  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。如下:

Xml代码  

  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了。

Java代码  

  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属性

Xml代码  

  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中

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,这里它内部怎么管理我们就暂时先不管了。

Xml代码  

  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。

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

Java代码  

  1. @Component(value="userAction")
  2. public class UserAction{}

Xml代码  

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

时间: 2024-10-07 21:11:12

【转载】S2SH的相关文章

java S2SH项目框架整合搭建实例教程(转载)

现在开发的一个项目使用S2SH框架,配置环境用了一两天,现在把当时配置环境时写的文档整理下发出来,也算加强点记忆. 1 开发环境 ?         MyEclipse5.5 ?         JDK 1.6 ?         Java EE 5.0 ?         Tomcat6.0 ?         Struts2.1.6 ?         Spring2.5.6 ?         Hibernate3.3.1 2 为ssh做好准备 2.1下载包 ?         Strut

java S2SH项目框架整合搭建实例教程

原创整理不易,转载请注明出处:java S2SH项目框架整合搭建实例教程 代码下载地址:http://www.zuidaima.com/share/1787220771113984.htm 现在开发的一个项目使用S2SH框架,配置环境用了一两天,现在把当时配置环境时写的文档整理下发出来,也算加强点记忆. 1 开发环境 ?         MyEclipse5.5 ?         JDK 1.6 ?         Java EE 5.0 ?         Tomcat6.0 ?      

S2SH注册登录

原文:S2SH注册登录 源代码下载地址:http://www.zuidaima.com/share/1587139713076224.htm 简单的S2SH注册登录Demo,三大框架全部为最新jar包,使用idea IDE jar包截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

【转载】C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CExample {private:     int a;public:     CExample(int b)     { a=b;}     void Show ()     {        cout<

门控时钟-理论分析 ---- 转载

转载自:http://www.chipsbank.com/news_detail/newsId=123.html 门控的基本要求: 1. 所需要的沿(对于正沿触发的寄存器是正沿,对于负沿触发的寄存器是负沿)不增加,不减少: 1. 不会产生毛刺: 1. 使用后功耗要能够降低: 1. 最好面积还会减小. 1. 上升沿触发的门控时钟的结构研究:应用与上升沿触发的寄存器的门控. 1. 直接与门结构: 1. 高电平使能Latch + 与门结构: 1. 低电平使能Latch + 与门结构: 1. 波形研究:

浅谈Java中的equals和==(转载)

在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就

JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结--转载http://www.cnblogs.com/kubixuesheng/p/5202561.html

转载自---http://www.cnblogs.com/kubixuesheng/p/5202561.html 俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面的堆,栈 JVM的堆,栈和os如何对应 为啥方法的调用需要栈 属于月经问题了,正好碰上有人问我这类比较基础的知识,无奈我自觉回答不是有效果,现在深入浅出的总结下: 前一篇文章总结了:JV

GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流(转载)

最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮助. GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化Git仓库 :git init ; -- 提交改变到缓存 :git commit -m 'desc

2.EasyUI学习总结(二)——easyloader分析与使用(转载)

本文转载自:http://www.cnblogs.com/haogj/archive/2013/04/22/3036685.html 使用脚本库总要加载一大堆的样式表和脚本文件,在easyui 中,除了可以使用通常的方式加载之外,还提供了使用 easyloader 加载的方式.这个组件主要是为了按需加载组件而诞生.什么情况下使用它呢? 你觉得一次性导入 easyui 的核心 min js 和 css 太大 你只用到 easyui 的其中几个组件 你想使用其中的一个组件,但是你又不知道这个组件依赖