SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解

注:此文档只说明简单的框架集成,各个框架的高级特性未涉及,刚刚接触框架的新人可能需要参考其他资料。

PS:本次练习所用jar包都能在此下载到:http://pan.baidu.com/s/1sjmgdYX

  • 准备工作

  开发环境:JDK 7u80、Eclipse 4.4 、Tomcat 7.0.63、MySQL 5.6

     开发使用组件:Spring 3.2.14、Hibernate 3.6.10、common-logging 1.2、aopalliance.jar、aspectjweaver.jar、mysql-connector-java-5.1.35-bin.jar

   在Eclipse下创建动态web项目Test,创建过程中注意勾选web.xml的选项,如果不勾选,项目创建之后需要手动创建web.xml,创建完成后将其部署到Tomcat中,项目结构应该如下(Package Explorer下,看个人习惯):

    

  • 配置Spring

    将以下JAR包复制到lib文件夹下,不要问为什么是这些,想知道为什么可以把其他任意一个删掉看看启动项目报什么错。

    

    在web.xml中配置Spring监听器,代码如下:

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

    创建applicationContext.xml,当前版本的Spring默认其位于WEB-INF下,不过大多数开发人员习惯还是将其放到src下,这里我们将其放在src下。之后向applicationContext.xml中添加bean相关声明,具体如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
  6. </beans>

web.xml中添加如下内容,用于自定义Spring配置文件的位置:

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:applicationContext.xml</param-value>
  4. </context-param>

     新建测试实体类User,路径暂定为com.test.entity,添加如下代码:

  1. package com.test.entity;
  2.  
  3. public class User {
  4.  
  5. private String id;
  6. private String username;
  7. private String password;
  8.  
  9. public String getId() {
  10. return id;
  11. }
  12. public void setId(String id) {
  13. this.id = id;
  14. }
  15. public String getUsername() {
  16. return username;
  17. }
  18. public void setUsername(String username) {
  19. this.username = username;
  20. }
  21. public String getPassword() {
  22. return password;
  23. }
  24. public void setPassword(String password) {
  25. this.password = password;
  26. }
  27.  
  28. }

    applicationContext.xml中添加如下定义(此处测试完成之后可以删除):

  1. <bean id="user" class="com.test.entity.User">
  2. <property name="username" value="test" />
  3. </bean>

    新建Test类,暂定路径com.test.test,添加如下代码:

  1. package com.test.test;
  2.  
  3. import org.springframework.context.support.FileSystemXmlApplicationContext;
  4.  
  5. import com.test.entity.User;
  6.  
  7. public class Test{
  8.  
  9. @SuppressWarnings("resource")
  10. public static void main(String[] args) {
  11. FileSystemXmlApplicationContext ac =
  12. new FileSystemXmlApplicationContext("src\\applicationContext.xml");
  13. User user = (User) ac.getBean("user");
  14. System.out.println(user.getUsername());
  15. }
  16.  
  17. }

    运行Test类查看结果,如果输出test则表示spring框架运行正常。

  • 配置SpringMVC

    添加SpringMVC所需JAR包:spring-webmvc-3.2.14.RELEASE.jar,在web.xml中添加SpringMVC前端控制器相关配置,SpringMVC的配置文件默认servlet配置名-servlet.xml(例如此处应该为springmvc-servlet.xml),位于WEB-INF下,这里我们将spring的配置文件与springmvc配置文件合并,所以我们需要在配置DispatcherServlet时说明配置文件的位置,配置如下:

  1. <servlet>
  2. <servlet-name>springmvc</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <init-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:applicationContext.xml</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>
  10. <servlet-mapping>
  11. <servlet-name>springmvc</servlet-name>
  12. <url-pattern>*.do</url-pattern>
  13. </servlet-mapping>

    配置springmvc扫描器,用于扫描springmvc注解,此处需要用到context标签, 所以需要添加context的文档声明,所有代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-3.2.xsd">
  9.  
  10. <context:component-scan base-package="com.test" />
  11.  
  12. <bean id="user" class="com.test.entity.User">
  13. <property name="username" value="test" />
  14. </bean>
  15. </beans>

    配置视图解析器,Controller层处理完请求之后会返回数据或者视图,所以我们需要先添加视图解析器,否则无法跳转回前台页面,代码如下:

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <property name="suffix" value=".jsp"/>
  3. </bean>
  • 测试SpringMVC

    创建index.jsp,代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>test</title>
  7. </head>
  8. <body>
  9. <form action="${pageContext.request.contextPath }/user/test.do" method="post">
  10. <label>用户名:</label><input type="text" name="username" /><br>
  11. <label>密码:</label><input type="password" name="password" />
  12. <input type="submit" value="登录">
  13. </form>
  14. </body>
  15. </html>

    创建return.jsp,代码如下:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>test</title>
  7. </head>
  8. <body>
  9. ${user.username }:${user.password }
  10. </body>
  11. </html>

    创建UserController,暂定位于com.test.controller,用于接收前台请求,代码如下:

  1. package com.test.controller;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.ui.ModelMap;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7.  
  8. import com.test.entity.User;
  9. import com.test.service.UserService;
  10.  
  11. @Controller
  12. @RequestMapping("/user")
  13. public class UserController {
  14.  
  15. @Autowired
  16. private UserService userService;
  17.  
  18. @RequestMapping("/test")
  19. public String test(User user,ModelMap model){
  20. System.out.println(user.getUsername());
  21. System.out.println(user.getPassword());
  22. model.addAttribute(user);
  23. return "/return";
  24. }
  25.  
  26. }

    启动Tomcat后测试即可,正常情况下结果如下,说明框架已成功相应请求:

    

  • 配置Hibernate集成

    添加以下JAR包:

    

    applicationContest.xml中添加Hibernate相关配置,hibernate的实体声明可以选择配置文件和注解两种方式,我个人比较倾向于配置文件方式,如下图所示:

  1. <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
  2. <property name="url" value="jdbc:mysql://localhost:3306/test" />
  3. <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  4. <property name="username" value="root" />
  5. <property name="password" value="root" />
  6. </bean>
  7.  
  8. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  9. <property name="dataSource" ref="dataSource" />
  10. <property name="mappingLocations">
  11. <value>classpath*:/com/test/entity/*.cfg.xml</value>
  12. </property>
  13. <property name="hibernateProperties">
  14. <props>
  15. <prop key="hibernate.show_sql">true</prop>
  16. </props>
  17. </property>
  18. </bean>

    由于Hibernate3必须在事务中处理数据访问,所以需要添加事务控制,个人倾向于使用aop方式,所以需要先添加tx和aop的文档配置,配置后文档声明部分代码如下:

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.2.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">

     配置事务控制器,并通过aop将其织入到service切面进行事务控制,如下所示:

  1. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  2. <property name="sessionFactory" ref="sessionFactory" />
  3. </bean>
  4.  
  5. <tx:advice id="txAdvice" transaction-manager="txManager">
  6. <tx:attributes >
  7. <tx:method name="*" propagation="REQUIRED"/>
  8. </tx:attributes>
  9. </tx:advice>
  10.  
  11. <aop:config>
  12. <aop:pointcut expression="execution(* com.test.service.*.*(..))" id="aopPointcut"/>
  13. <aop:advisor advice-ref="txAdvice" pointcut-ref="aopPointcut"/>
  14. </aop:config>
  • 测试整体框架

    Mysql中创建test_user表用于测试框架能否正常进行数据库的操作,此处我们测试在事务管理中进行保存操作,建表语句如下:

  1. create table test_user (
  2. id varchar(36) primary key,
  3. username varchar(20) not null,
  4. password varchar(50) not null
  5. );

    创建Hibernate实体映射文件,内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.test.entity.User" table="test_user">
  7. <id name="id" type="java.lang.String" length="36">
  8. <column name="id" />
  9. <generator class="uuid" />
  10. </id>
  11.  
  12. <property name="username" type="java.lang.String" length="10" >
  13. <column name="username" not-null="true" unique="true"/>
  14. </property>
  15.  
  16. <property name="password" type="java.lang.String" length="32" >
  17. <column name="password" not-null="true" unique="true"/>
  18. </property>
  19. </class>
  20. </hibernate-mapping>

    创建UserDAO,暂定位于com.test.dao下,用于处理数据库操作,代码如下:

  1. package com.test.dao;
  2.  
  3. import org.hibernate.SessionFactory;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Repository;
  6.  
  7. import com.test.entity.User;
  8.  
  9. @Repository
  10. public class UserDAO {
  11.  
  12. @Autowired
  13. private SessionFactory sessionFactory;
  14.  
  15. public String save(User user){
  16. return (String) sessionFactory.getCurrentSession().save(user);
  17. }
  18.  
  19. }

    创建UserService,暂定位于com.test.service下,用于提供请求服务,代码如下:

  1. package com.test.service;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5.  
  6. import com.test.dao.UserDAO;
  7. import com.test.entity.User;
  8.  
  9. @Service
  10. public class UserService {
  11.  
  12. @Autowired
  13. private UserDAO userDAO;
  14.  
  15. public String save(User user){
  16. return userDAO.save(user);
  17. }
  18.  
  19. }

    修改UserController如下:

  1. package com.test.controller;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.ui.ModelMap;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7.  
  8. import com.test.entity.User;
  9. import com.test.service.UserService;
  10.  
  11. @Controller
  12. @RequestMapping("/user")
  13. public class UserController {
  14.  
  15. @Autowired
  16. private UserService userService;
  17.  
  18. @RequestMapping("/test")
  19. public String test(User user,ModelMap model){
  20. userService.save(user);
  21. model.addAttribute(user);
  22. return "/return";
  23. }
  24.  
  25. }

    至此项目内容应该如下图所示:

    重启Tomcat后输入用户名和密码,点击按钮后查看数据库,正常结果为后台未报错且数据库有数据存入,如下图所示:

    

    接下来我们测试下在出现异常的情况下能否正常回滚事务,修改Service代码如下:

  1. package com.test.service;
  2.  
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5.  
  6. import com.test.dao.UserDAO;
  7. import com.test.entity.User;
  8.  
  9. @Service
  10. public class UserService {
  11.  
  12. @Autowired
  13. private UserDAO userDAO;
  14.  
  15. public String save(User user){
  16. userDAO.save(user);
  17. throw new RuntimeException("测试事务能否正常回滚!");
  18. }
  19. }

    重启Tomcat后测试框架能否正常回滚,正常情况下,后台会将自定义的异常抛出,而数据库中未出现第二条数据,框架集成到此结束,之后便可进行基于框架的开发工作了。

  PS:各位有什么问题或者不同看法可以留言    

 

SpringMVC + Spring 3.2.14 + Hibernate 3.6.10的更多相关文章

  1. SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解

    注:此文档只说明简单的框架集成,各个框架的高级特性未涉及,刚刚接触框架的新人可能需要参考其他资料. PS:本次练习所用jar包都能在此下载到:http://pan.baidu.com/s/1sjmgd ...

  2. S2SH框架集成详解(Struts 2.3.16 + Spring 3.2.6 + Hibernate 3.6.10)

    近期集成了一次较新版本的s2sh,出现了不少问题,网上资料也是良莠不齐,有的甚至就是扯淡,简单的把jar包扔进去就以为是集成成功了,在这里整理一下详细的步骤,若哪位有什么不同看法,可以留言,欢迎批评改 ...

  3. javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】

    一.失败案例 1. 控制台报错信息 严重: Exception sending context initialized event to listener instance of class org. ...

  4. SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,MyBatis)的区别

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  5. Springmvc+Spring+Hibernate搭建方法及实例

    Springmvc+Spring+Hibernate搭建方法及实例  

  6. SpringMVC+Spring+Hibernate的小样例

    Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...

  7. Springmvc+Spring+Hibernate搭建方法

    Springmvc+Spring+Hibernate搭建方法及example 前面两篇文章,分别介绍了Springmvc和Spring的搭建方法,本文再搭建hibernate,并建立SSH最基本的代码 ...

  8. Maven搭建springMVC+spring+hibernate环境

    这次不再使用struts2做控制器,采用spring自己的springMVC框架实现. 首先,改写pom.xml文件,不需要struts2的相关jar了. pom.xml <project xm ...

  9. spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

    这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器 ...

随机推荐

  1. 【buildroot-2011.11】You may have to install &#39;g++&#39; on your build machine

    buildroot - 2011.11 当进行交叉编译.例如像以下错误提及演示: "You may have to install 'g++' on your build machine&q ...

  2. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志

    Tethering技术在移动平台上已经运用的越来越广泛了.它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi.USB或是Bluetooth等方式连接到此移动设备.在Android中能够将Wi ...

  3. linux下改动内核參数进行Tcp性能调优 -- 高并发

    前言: Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升, 以下就列举一些Tcp/ip内核 ...

  4. 【Stackoverflow好问题】将InputStream转换为String

    不重复造轮子. 最可靠的方法,或者使用Apache commons IOUtils  这样简单几行代码就搞定了 StringWriter writer = new StringWriter(); IO ...

  5. cocos2dx三种定时器使用

         cocos2dx三种定时器的使用以及停止schedule.scheduleUpdate.scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的用法. 首先,什么是定时 ...

  6. client多线程

    1.多线程对象 对象可以是多线程访问,线程可以在这里分为两类: 为完成内部业务逻辑的创建Thread对象,线程需要访问对象. 使用对象的线程外部对象. 进一步假设更精细的划分.业主外螺纹成线等线,. ...

  7. hdu3182 状态压缩水题

    题意是这种     给你n个汉堡     每一个汉堡有它的价值   做每一个汉堡都得花费相应的能量      如今告诉你最大能量 让你求获得的最大的价值(有些汉堡必须有还有一些汉堡做好为前提) 给你的 ...

  8. Android - 数据存储 -存储文件

    Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ...

  9. PowerDesigner有几个需要设置

    安装后PDM后.一些易于使用的设计人才需求. 一. 建立name与code做自己的主动关联,我们输入name当你不希望个别及连带code已经改变. 打开Tools->General Option ...

  10. C语言标准库函数qsort具体解释

    1 函数简单介绍 功 能: 使用高速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(c ...