SpringMVC + spring311 + hibernate410 集成.docx
- 文档编号:30058830
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:15
- 大小:20.55KB
SpringMVC + spring311 + hibernate410 集成.docx
《SpringMVC + spring311 + hibernate410 集成.docx》由会员分享,可在线阅读,更多相关《SpringMVC + spring311 + hibernate410 集成.docx(15页珍藏版)》请在冰豆网上搜索。
SpringMVC+spring311+hibernate410集成
SpringMVC+spring3.1.1+hibernate4.1.0集成
一开发环境
1、动态web工程
2、部分依赖
java代码:
查看复制到剪贴板打印
hibernate-release-4.1.0.Final.zip
hibernate-validator-4.2.0.Final.jar
spring-framework-3.1.1.RELEASE-with-docs.zip
proxool-0.9.1.jar
log4j1.2.16
slf4j-1.6.1
mysql-connector-java-5.1.10.jar
hamcrest1.3.0RC2
ehcache2.4.3
hibernate-release-4.1.0.Final.zip
hibernate-validator-4.2.0.Final.jar
spring-framework-3.1.1.RELEASE-with-docs.zip
proxool-0.9.1.jar
log4j1.2.16
slf4j-1.6.1
mysql-connector-java-5.1.10.jar
hamcrest1.3.0RC2
ehcache2.4.3
3、为了方便学习,暂没有使用maven构建工程
二工程主要包括内容
1、springMVC+spring3.1.1+hibernate4.1.0集成
2、通用DAO层和Service层
3、二级缓存Ehcache
4、REST风格的表现层
5、通用分页(两个版本)
5.1、首页上一页,下一页尾页跳转
5.2、上一页12345下一页
6、数据库连接池采用proxool
7、spring集成测试
8、表现层的javavalidator框架验证(采用hibernate-validator-4.2.0实现)
9、视图采用JSP,并进行组件化分离
三TODOLIST将本项目做成脚手架方便以后新项目查询
1、Service层进行AOP缓存(缓存使用Memcached实现)
2、单元测试(把常见的桩测试、伪实现、模拟对象演示一遍区别集成测试)
3、监控功能
后台查询hibernate二级缓存hit/miss率功能
后台查询当前服务器状态功能(如线程信息、服务器相关信息)
4、springRPC功能
5、spring集成quartz进行任务调度
6、spring集成javamail进行邮件发送
7、DAO层将各种常用框架集成进来(方便查询)
8、把工作中经常用的东西融合进去,作为脚手架,方便以后查询
四集成重点及常见问题
1、spring-config.xml配置文件:
1.1、该配置文件只加载除表现层之外的所有bean,因此需要如下配置:
java代码:
查看复制到剪贴板打印
component-scanbase-package="cn.javass"> exclude-filtertype="annotation"expression="org.springframework.stereotype.Controller"/> component-scan> component-scanbase-package="cn.javass"> exclude-filtertype="annotation"expression="org.springframework.stereotype.Controller"/> component-scan> 通过exclude-filter把所有@Controller注解的表现层控制器组件排除 1.2、国际化消息文件配置 java代码: 查看复制到剪贴板打印 --国际化的消息资源文件--> --在web环境中一定要定位到classpath否则默认到当前web应用下找--> messages --国际化的消息资源文件--> --在web环境中一定要定位到classpath否则默认到当前web应用下找--> messages 此处basenames内一定是classpath: messages,如果你写出“messages”,将会到你的web应用的根下找即你的messages.properties一定在web应用/messages.propertis。 1.3、hibernate的sessionFactory配置需要使用org.springframework.orm.hibernate4.LocalSessionFactoryBean,其他都是类似的,具体看源代码。 1.4、 aspectj-autoproxyexpose-proxy="true"/>实现@AspectJ注解的,默认使用AnnotationAwareAspectJAutoProxyCreator进行AOP代理,它是BeanPostProcessor的子类,在容器启动时Bean初始化开始和结束时调用进行AOP代理的创建,因此只对当容器启动时有效,使用时注意此处。 1.5、声明式容器管理事务 建议使用声明式容器管理事务,而不建议使用注解容器管理事务(虽然简单),但太分布式了,采用声明式容器管理事务一般只对service层进行处理。 java代码: 查看复制到剪贴板打印 adviceid="txAdvice"transaction-manager="txManager"> attributes> methodname="save*"propagation="REQUIRED"/> methodname="add*"propagation="REQUIRED"/> methodname="create*"propagation="REQUIRED"/> methodname="insert*"propagation="REQUIRED"/> methodname="update*"propagation="REQUIRED"/> methodname="merge*"propagation="REQUIRED"/> methodname="del*"propagation="REQUIRED"/> methodname="remove*"propagation="REQUIRED"/> methodname="put*"propagation="REQUIRED"/> methodname="use*"propagation="REQUIRED"/> --hibernate4必须配置为开启事务否则getCurrentSession()获取不到--> methodname="get*"propagation="REQUIRED"read-only="true"/> methodname="count*"propagation="REQUIRED"read-only="true"/> methodname="find*"propagation="REQUIRED"read-only="true"/> methodname="list*"propagation="REQUIRED"read-only="true"/> methodname="*"read-only="true"/> attributes> advice> configexpose-proxy="true"> --只对业务逻辑层实施事务--> pointcutid="txPointcut"expression="execution(*cn.javass..service..*.*(..))"/> advisoradvice-ref="txAdvice"pointcut-ref="txPointcut"/> config> adviceid="txAdvice"transaction-manager="txManager"> attributes> methodname="save*"propagation="REQUIRED"/> methodname="add*"propagation="REQUIRED"/> methodname="create*"propagation="REQUIRED"/> methodname="insert*"propagation="REQUIRED"/> methodname="update*"propagation="REQUIRED"/> methodname="merge*"propagation="REQUIRED"/> methodname="del*"propagation="REQUIRED"/> methodname="remove*"propagation="REQUIRED"/> methodname="put*"propagation="REQUIRED"/> methodname="use*"propagation="REQUIRED"/> --hibernate4必须配置为开启事务否则getCurrentSession()获取不到--> methodname="get*"propagation="REQUIRED"read-only="true"/> methodname="count*"propagation="REQUIRED"read-only="true"/> methodname="find*"propagation="REQUIRED"read-only="true"/> methodname="list*"propagation="REQUIRED"read-only="true"/> methodname="*"read-only="true"/> attributes> advice> configexpose-proxy="true"> --只对业务逻辑层实施事务--> pointcutid="txPointcut"expression="execution(*cn.javass..service..*.*(..))"/> advisoradvice-ref="txAdvice"pointcut-ref="txPointcut"/> config> 此处一定注意使用hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题: 当有一个方法list传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: NoSessionfoundforcurrentthread异常。 这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug,欢迎大家讨论下。 因此最好的解决方案是使用REQUIRED的传播行为。 二、spring-servlet.xml: 2.1、表现层配置文件,只应加装表现层Bean,否则可能引起问题。 java代码: 查看复制到剪贴板打印 --开启controller注解支持--> --注: 如果base-package=cn.javass则注解事务不起作用--> component-scanbase-package="cn.javass.demo.web.controller"> include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/> component-scan> --开启controller注解支持--> --注: 如果base-package=cn.javass则注解事务不起作用--> component-scanbase-package="cn.javass.demo.web.controller"> include-filtertype="annotation"expression="org.springframework.stereotype.Controller"/> component-scan> 此处只应该加载表现层组件,如果此处还加载dao层或service层的bean会将之前容器加载的替换掉,而且此处不会进行AOP织入,所以会造成AOP失效问题(如事务不起作用),再回头看我们的1.4讨论的。 2.2、 view-controllerpath="/"view-name="forward: /index"/>表示当访问主页时自动转发到index控制器。 2.3、静态资源映射 java代码: 查看复制到剪贴板打印 --当在web.xml中DispatcherServlet使用 default-servlet-handler/> --静态资源映射--> resourcesmapping="/images/**"location="/WEB-INF/images/"/> resourcesmapping="/css/**"location="/WEB-INF/css/"/> resourcesmapping="/js/**"location="/WEB-INF/js/"/> --当在web.xml中DispatcherServlet使用 default-servlet-handler/> --静态资源映射--> resourcesmapping="/images/**"location="/WEB-INF/images/"/> resourcesmapping="/css/**"location="/WEB-INF/css/"/> resourcesmapping="/js/**"location="/WEB-INF/js/"/> 以上是配置文件部分,接下来来看具体代码。 三、通用DAO层Hibernate4实现 为了减少各模块实现的代码量,实际工作时都会有通用DAO层实现,以下是部分核心代码: java代码: 查看复制到剪贴板打印 publicabstractclassBaseHibernateDao protectedstaticfinalLoggerLOGGER=LoggerFactory.getLogger(BaseHibernateDao.class); privatefinalClass privatefinalStringHQL_LIST_ALL; privatefinalStringHQL_COUNT_ALL; privatefinalStringHQL_OPTIMIZE_PRE_LIST_ALL; privatefinalStringHQL_OPTIMIZE_NEXT_LIST_ALL; privateStringpkName=null; @SuppressWarnings("unchecked") publicBaseHibernateDao(){ this.entityClass=(Class Field[]fields=this.entityClass.getDeclaredFields(); for(Fieldf: fields){ if(f.isAnnotationPresent(Id.class)){ this.pkName=f.getName(); } } Assert.notNull(pkName); //TODO@Entitynamenotnull HQL_LIST_ALL="from"+this.entityClass.getSimpleName()+"orderby"+pkName+"desc"; HQL_OPTIMIZE_PRE_LIST_ALL="from"+this.entityClass.getSimpleName()+"where"+pkName+">? orderby"+pkName+"asc"; HQL_OPTIMIZE_NEXT_LIST_ALL="from"+this.entityClass.getSimpleName()+"where"+pkName+" orderby"+pkName+"desc"; HQL_COUNT_ALL="selectcount(*)from"+this.entityClass.getSimpleName(); } @Autowired @Qualifier("sessionFactory") privateSessionFactorysessionFactory; publicSessiongetSession(){ //事务必须是开启的,否则获取不到 returnsessionFactory.getCurrentSession(); } …… } publicabstractclassBaseHibernateDao protectedstaticfinalLoggerLOGGER=LoggerFactory.getLogger(BaseHibernateDao.class); privatefinalClass privatefinalStringHQL_LIST_ALL; privatefinalStringHQL_COUNT_ALL; privatefinalStringHQL_OPTIMIZE_PRE_LIST_ALL; privatefinalStringHQL_OPTIMIZE_NEXT_LIST_ALL; privateStringpkName=null; @SuppressWarnings("unchecked") publicBaseHibernateDao(){ this.entityClass=(Class Field[]fields=this.entityClass.getDeclaredFields(); for(Fieldf: fields){ if(f.isAnnotationPresent(Id.class)){ this.pkName=f.getName(); } } Assert.notNull(pkName); //TODO@Entitynamenotnull HQL_LIST_ALL="from"+this.entityClass.getSimpleName()+"orderby"+pkName+"desc"; HQL_OPTIMIZE_PRE_LIST_ALL="from"+this.entityClass.getSimpleName()+"where"+pkName+">?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SpringMVC spring311 hibernate410 集成