strust2.1 + spring3.0 + ibatis3.0 + annotation

[size=medium]近期开发框架选择strust2.1 + spring3.0 + ibatis3.0
尽量使用annotation,少使用xml,ibatis除外
[b]
1.strust2.1[/b]
主要使用到的plugin是Convention Pluin,因为他是实现Restful和annotation的关键。
ServletActionContext静态类可以得到很多运行环境
filterServlet接收到請求,使用ActionProxy分析配置文件,进而确定这个请求执行哪些interceptors,再调用对应action完成请求,返回请求前还可能需要执行一些interceptors,所以Strust的功能都是使用interceptor方式提供的,我们要处理的只是相应的action.strust提供了默认的interceptors stack,这样每个action都不用定义这些interceptors而直接使用他们的功能,而一些其他interceptor,或自定义的interceptor则需要在action中定义.
暂时可能用到的interceptors: file-upload,object-population,servlet-config
如果有多个interceptors 也就是interceptor stack,他们的执行顺序有时挺重要的
(1).object popublation对象自动装载params
须有modelDriven,params这两个interceptor
action implements ModelDriven
public Person getModel(){
this.person = new Person();
return this.person;
}

(2).servlet config
须有servletConfig interceptor,
主要是为了得到HttpServletRequest,HttpServletResponse,
action 分别 implements ServletRequestAware,ServletResponseAware

(3).file-upload
须有fileUpload interceptor
在html中
<form name="myForm" enctype="multipart/form-data">
<input type="file" name="myDoc" value="Browse ..." />
<input type="submit" />
</form>
在action中
public void setMyDoc(File myDoc)
public void setMyDocContentType(String contentType)
public void setMyDocFileName(String filename)
注意setMyDoc跟html中的name="myDoc"对应
上传多个"myDoc"时,就用setMyDoc(File[] myDoc),下同
Struts2的action是有状态的,必须保证其线程的安全性,
也就是一个请求new一个action,如果使用spring管理则使用@Scope("prototype")修饰action.
如果主要使用annotation配置struts的功能,action类需要用@ParentPackage("default")修饰才能用到“default"package定义的东西,
比如interceptor,global-result等.
应该也可以直接在"default"那个package上标明namespace="/"
另一个比较郁闷的地方是使用Convention后并不能include其他文件,
比如<#include "/include/meta.html">
虽然默认的根模板是/WEB-INF/content/,但是必须使用
<#include "/WEB-INF/content/include/meta.html">也就是必须指定全路径
最后的解决方法是在action类上使用@ResultPath("/WEB-INF/content/")来指定根模板目录.
convention会在没有相对应的action类定义路径时直接返回模板文件,这有时对于返回静态文件很有用,这样就不用每个請求都需要一个action类对应着.但是这时的include又必须使用全路径了.

[b]2.spring3.0[/b]
需要额外的类库:aopalliance.jar, aspectjweaver.jar, cglib-nodep-2.1_3.jar
主要使用到事务控制,依赖注入(DI)
通过在类型字段之上定义@AutoWare,spring会自动帮我们注入类型的对象到相应变量。
在类定义上使用@Component表示这个类让spring管理,另外还有几个相似的annotation
@Service表示业务层,@Controller表示控制层(类似strust的Action),
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) @Scope(“prototype”)来改变。

[b]3.ibatis3.0[/b]
SqlSessionFactory
每个应用对应一个SqlSessionFactory实体对象,在整个应用过程都会存在
要构建一个SqlSessionFactory对象,可以通过SqlSessionFactoryBuilder.build(reader)构建,
reader是Reader对象,读取ibatis的配置文件如SqlMapConfig.xml

SqlSession
从SqlSessionFactory.openSession()拿到一个sqlSession,
这个sqlSession是执行SQL Mapper命令的全部,
他的应用scope应该是线程的,可以在service层控制关闭session

接着就是ibatis的配置文件,影响到ibatis的行为,定义顺序不能乱,如
导入sql mapper文件就必须放到最后,

[b]4.关于整合strust2.1,spring3.0,ibatis3.0[/b]
strust2.1与spring3.0集成比较简单
将strust的spring插件放到lib中,设置strust常量
<constant name="struts.objectFactory" value="spring" />
strust2.1的action是无状态的,而他的interceptor才是有状态的,也就是必须线程安全的,所以Action类不需要@Scope(“prototype”),一开始我以为需要.
而Strust的核心类,interceptor,results有没有交给spring管理呢,
按道理是有的,因为strust有个专门的spring插件


ibatis3.0没有提供与spring集成的插件,
spring提供的是ibatis 2版本,
所以我自己写了一个Ibatis3SqlSessionFactoryBean,
这个bean的任务是配置ibatis的基本属性,
enviroment,transactionManager,dataSource不再配置,
使用spring提供的dataSource,事务控制留给spring去管理.
这个bean implements FactoryBean<SqlSessionFactory>, InitializingBean
在afterPropertiesSet()方法中定义怎样build这个SqlSessionFactory,
其实在build这个sqlsessionFactory的时候可以参考ibaits3本身的build实现.
问题是那个environment在ibatis的配置文件上不存在了,因为都交给spring去管理了,
所以可以自己构造environment这个对象,再set到configuration中
再return new DefaultSqlSessionFactory(configuration);
其中的关键点在于那个datasource,因为我们的事务是交给spring管理了,所以这个datasource应该包装成dataSourceToUse = new TransactionAwareDataSourceProxy(this.dataSource);
不然的话spring不会帮我们处理事务,也就是不会commit,close之类的.
变成要调用者完成这些复杂的事.
还有个问题是从sqlSessionFactory.openSession();拿到的sqlSession,
可以将它设置成ThreadLocal,这样在一个线程中拿到的sqlSession是相同的.
//------
经测试使用ThreadLocal会发生两次请求拿到的connection相同,导致第二次抛出connection已关闭的错误
//------
还可以使用
(SqlSession)TransactionSynchronizationManager.getResource(sqlSessionFactory);

[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSH2框架是结合了Spring3.2、Struts2.3.4和Hibernate4.2三个框架的一种开发模式。它的目标是将这三个框架的优势结合起来,实现更高效、更方便的开发方式。 首先,Spring框架作为SSH2的核心框架,提供了Spring IOC容器和AOP特性。Spring能够管理对象的生命周期,简化了大量的配置和代码。它还提供了声明式事务管理和面向切面编程能力,极大地简化了事务处理和异常处理。 其次,Struts2作为SSH2的MVC框架,提供了强大的请求处理和表单验证功能。它基于标签和表达式语言,可以直接将页面元素和后台数据进行绑定,大大减少了前端和后台开发的工作量。Struts2还支持拦截器,能够方便地进行权限控制和请求的预处理。 最后,Hibernate作为SSH2的ORM框架,提供了面向对象的数据库访问方式。Hibernate能够将Java对象和数据库表进行映射,并提供了强大的查询和缓存功能。使用Hibernate,开发者可以将精力集中在业务逻辑上,而不需要过多关注数据库操作的细节。 通过整合SpringStruts2和Hibernate,SSH2框架能够极大地简化企业级应用的开发过程。开发者可以更专注于业务逻辑的设计和实现,而不需要关心框架的集成和配置。同时,SSH2框架还提供了良好的扩展性和灵活性,可以根据项目需求进行定制和拓展。 总而言之,SSH2框架是一种结合了SpringStruts2和Hibernate的开发模式,通过整合三个框架的优势,提供了更高效、更方便的开发方式。它简化了项目的配置和集成,提高了开发效率,是开发企业级应用的优秀选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值