前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring+SpringMVC+Hibernate简单整合(转)

Spring+SpringMVC+Hibernate简单整合(转)

作者头像
yaohong
发布2019-09-11 17:46:03
7790
发布2019-09-11 17:46:03
举报
文章被收录于专栏:姚红专栏姚红专栏

SpringMVC又一个漂亮的web框架,他与Struts2并驾齐驱,Struts出世早而占据了一定优势,下面同样做一个简单的应用实例,介绍SpringMVC的基本用法,接下来的博客也将梳理一下Struts2和SpringMVC的一些异同,通过梳理和旧知识的联系,让学习的成本变低,花很短的时间就可以了解一门貌似新的技术,其实本质没变。

原文http://langgufu.iteye.com/blog/2088355

下面开始实例,这个实例的需求是对用户信息进行增删改查。首先创建一个web项目test_ssh,目录结构及需要的Jar包如下图:

创建一个User实体类,放在Entity包下,采用注解的方式:

代码语言:javascript
复制
package com.tgb.entity;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.Table;  
 
import org.hibernate.annotations.GenericGenerator;  
 
@Entity 
@Table(name="T_USER")  
public class User {  
 
 @Id 
 @GeneratedValue(generator="system-uuid")  
 @GenericGenerator(name = "system-uuid",strategy="uuid")  
 @Column(length=32)  
 private String id;  
 
 @Column(length=32)  
 private String userName;  
 
 @Column(length=32)  
 private String age;  
 
 public String getId() {  
 return id;  
    }  
 
 public void setId(String id) {  
 this.id = id;  
    }  
 
 public String getUserName() {  
 return userName;  
    }  
 
 public void setUserName(String userName) {  
 this.userName = userName;  
    }  
 
 public String getAge() {  
 return age;  
    }  
 
 public void setAge(String age) {  
 this.age = age;  
    }  
}  

本篇关于SpringMVC基本都会采用注解的方式,首先配置好数据源以及事务spring-common.xml,放在config.spring包下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 
 
 <!-- 配置数据源 --> 
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > 
 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
 <property name="url" value="jdbc:mysql://localhost/test_ssh"></property> 
 <property name="username" value="root"></property> 
 <property name="password" value="1"></property> 
 </bean> 
 
 <!-- 配置SessionFactory --> 
 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
 <property name="dataSource" ref="dataSource" /> 
 <property name="hibernateProperties"> 
 <props> 
 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
 <prop key="hibernate.hbm2ddl.auto">update</prop> 
 <prop key="hibernate.show_sql">true</prop> 
 <prop key="hibernate.format_sql">true</prop> 
 </props> 
 </property> 
 <property name="annotatedClasses"> 
 <list> 
 <value>com.tgb.entity.User</value> 
 </list> 
 </property> 
 </bean> 
 
 <!-- 配置一个事务管理器 --> 
 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory"/> 
 </bean> 
 
 <!-- 配置事务,使用代理的方式 --> 
 <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> 
 <property name="transactionManager" ref="transactionManager"></property> 
 <property name="transactionAttributes"> 
 <props> 
 <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> 
 <prop key="modify*">PROPAGATION_REQUIRED,-myException</prop> 
 <prop key="del*">PROPAGATION_REQUIRED</prop> 
 <prop key="*">PROPAGATION_REQUIRED</prop> 
 </props> 
 </property> 
 </bean> 
</beans> 

然后配置关于SpringMVC的内容,下面配置中都有注释说明,就不再赘述,spring-mvc.xml放在config.spring包下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.2.xsd  
    http://www.springframework.org/schema/mvc  
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> 
 
 <!-- 注解扫描包 --> 
 <context:component-scan base-package="com.tgb" /> 
 
 <!-- 开启注解 --> 
 <mvc:annotation-driven /> 
 
 <!-- 静态资源(js/image)的访问 --> 
 <mvc:resources location="/js/" mapping="/js/**"/> 
 
 <!-- 定义视图解析器 --> 
 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
 <property name="prefix" value="/"></property> 
 <property name="suffix" value=".jsp"></property> 
 </bean> 
</beans> 

完成这些共用的配置之后,来配置web项目起点web.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
 <display-name>json_test</display-name> 
 <welcome-file-list> 
 <welcome-file>login.jsp</welcome-file> 
 </welcome-file-list> 
 
 <!-- 加载所有的配置文件 --> 
 <context-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>classpath*:config/spring/spring-*.xml</param-value> 
 </context-param> 
 
 <!-- 配置Spring监听 --> 
 <listener> 
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
 </listener> 
 
 <!-- 配置SpringMVC --> 
 <servlet> 
 <servlet-name>springMVC</servlet-name> 
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
 <init-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>classpath*:config/spring/spring-mvc.xml</param-value> 
 </init-param> 
 <load-on-startup>1</load-on-startup> 
 </servlet> 
 <servlet-mapping> 
 <servlet-name>springMVC</servlet-name> 
 <url-pattern>/</url-pattern> 
 </servlet-mapping> 
 
 <!-- 配置字符集 --> 
 <filter> 
 <filter-name>encodingFilter</filter-name> 
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
 <init-param> 
 <param-name>encoding</param-name> 
 <param-value>UTF-8</param-value> 
 </init-param> 
 <init-param> 
 <param-name>forceEncoding</param-name> 
 <param-value>true</param-value> 
 </init-param> 
 </filter> 
 <filter-mapping> 
 <filter-name>encodingFilter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
 
 <!-- 配置Session --> 
 <filter> 
 <filter-name>openSession</filter-name> 
 <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> 
 </filter> 
 <filter-mapping> 
 <filter-name>openSession</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
</web-app> 

读者需自行下载jquery包,放到webContent文件夹下的js包下。然后创建几个测试页面,分别如下:

Login.jsp,项目的入口界面。

  1. <h5><a href="/test_ssh/user/getAllUser">进入用户管理页</a></h5>

Index.jsp,用户管理的主界面

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=UTF-8" 
 pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<script type="text/javascript" src="../js/jquery-1.7.1.js"></script> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
<script type="text/javascript"> 
    function del(id){  
        $.get("/test_ssh/user/delUser?id=" + id,function(data){  
            if("success" == data.result){  
                alert("删除成功");  
                window.location.reload();  
            }else{  
                alert("删除失败");  
            }  
        });  
    }  
</script> 
</head> 
<body> 
 <h6><a href="/test_ssh/user/toAddUser">添加用户</a></h6> 
 <table border="1"> 
 <tbody> 
 <tr> 
 <th>姓名</th> 
 <th>年龄</th> 
 <th>操作</th> 
 </tr> 
 <c:if test="${!empty userList }"> 
 <c:forEach items="${userList }" var="user"> 
 <tr> 
 <td>${user.userName }</td> 
 <td>${user.age }</td> 
 <td> 
 <a href="/test_ssh/user/getUser?id=${user.id }">编辑</a> 
 <a href="javascript:del('${user.id }')">删除</a> 
 </td> 
 </tr> 
 </c:forEach> 
 </c:if> 
 </tbody> 
 </table> 
</body> 
</html> 

addUser.jsp,添加用户界面

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=UTF-8" 
 pageEncoding="UTF-8"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
<script type="text/javascript"> 
    function addUser(){  
        var form = document.forms[0];  
 form.action = "/test_ssh/user/addUser";  
 form.method="post";  
        form.submit();  
    }  
</script> 
</head> 
<body> 
 <h1>添加用户</h1> 
 <form action="" name="userForm"> 
        姓名:<input type="text" name="userName"> 
        年龄:<input type="text" name="age"> 
 <input type="button" value="添加" onclick="addUser()"> 
 </form> 
</body> 
</html> 

editUser.jsp,修改用户信息界面。

代码语言:javascript
复制
<%@ page language="java" contentType="text/html; charset=UTF-8" 
 pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<script type="text/javascript" src="../js/jquery-1.7.1.js"></script> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
 <h1>编辑用户</h1> 
 <form action="/test_ssh/user/updateUser" name="userForm" method="post"> 
 <input type="hidden" name="id" value="${user.id }"> 
        姓名:<input type="text" name="userName" value="${user.userName }"> 
        年龄:<input type="text" name="age" value="${user.age }"> 
 <input type="submit" value="编辑" > 
 </form> 
</body> 
</html> 

还有success.jsp和error.jsp页面,无代码,就不再展示。

框架越来越多,越来越好用,但随之而来的繁杂的、各成体系的配置怎么办?项目大了感觉注解靠谱些。

这篇接着上篇,把没贴完的代码写完,上篇主要完成了一些公共配置和界面的东西,这篇把后台的代码完成。

首先是web包下属于的control层的类UserController,这相当于Struts中的Action,是重要的类:

代码语言:javascript
复制
package com.tgb.web;  
import java.io.IOException;  
import java.io.PrintWriter;  
 
import javax.annotation.Resource;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
 
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
 
import com.tgb.entity.User;  
import com.tgb.manager.UserManager;  
 
@Controller 
@RequestMapping("/user")  
public class UserController {  
 
 @Resource(name="userManager")  
 private UserManager userManager;  
 
 @RequestMapping("/getAllUser")  
 public String getAllUser(HttpServletRequest request){  
 
        request.setAttribute("userList", userManager.getAllUser());  
 
 return "/index";  
    }  
 
 @RequestMapping("/getUser")  
 public String getUser(String id,HttpServletRequest request){  
 
        request.setAttribute("user", userManager.getUser(id));  
 
 return "/editUser";  
    }  
 
 @RequestMapping("/toAddUser")  
 public String toAddUser(){  
 return "/addUser";  
    }  
 
 @RequestMapping("/addUser")  
 public String addUser(User user,HttpServletRequest request){  
 
        userManager.addUser(user);  
 
 return "redirect:/user/getAllUser";  
    }  
 
 @RequestMapping("/delUser")  
 public void delUser(String id,HttpServletResponse response){  
 
        String result = "{\"result\":\"error\"}";  
 
 if(userManager.delUser(id)){  
            result = "{\"result\":\"success\"}";  
        }  
 
        response.setContentType("application/json");  
 
 try {  
            PrintWriter out = response.getWriter();  
            out.write(result);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
 
 @RequestMapping("/updateUser")  
 public String updateUser(User user,HttpServletRequest request){  
 
 if(userManager.updateUser(user)){  
            user = userManager.getUser(user.getId());  
            request.setAttribute("user", user);  
 return "redirect:/user/getAllUser";  
        }else{  
 return "/error";  
        }  
    }  
}  

然后是属于manager包下的业务逻辑类,接口UserManager:

代码语言:javascript
复制
package com.tgb.manager;  
import java.util.List;  
import com.tgb.entity.User;  
 
public interface UserManager {  
 
 public User getUser(String id);  
 
 public List<User> getAllUser();  
 
 public void addUser(User user);  
 
 public boolean delUser(String id);  
 
 public boolean updateUser(User user);  
}  

实现类UserManagerImpl:

代码语言:javascript
复制
package com.tgb.manager;  
 
import java.util.List;  
 
import com.tgb.dao.UserDao;  
import com.tgb.entity.User;  
 
public class UserManagerImpl implements UserManager {  
 
 private UserDao userDao;  
 
 public void setUserDao(UserDao userDao) {  
 this.userDao = userDao;  
    }  
 
 @Override 
 public User getUser(String id) {  
 return userDao.getUser(id);  
    }  
 
 @Override 
 public List<User> getAllUser() {  
 return userDao.getAllUser();  
    }  
 
 @Override 
 public void addUser(User user) {  
        userDao.addUser(user);  
    }  
 
 @Override 
 public boolean delUser(String id) {  
 
 return userDao.delUser(id);  
    }  
 
 @Override 
 public boolean updateUser(User user) {  
 return userDao.updateUser(user);  
    }  
 
}  

最后是属于dao包底下的DAO层,主要由Hibernate完成。接口UserDao:

代码语言:javascript
复制
package com.tgb.dao;  
 
import java.util.List;  
 
import com.tgb.entity.User;  
 
public interface UserDao {  
 
 public User getUser(String id);  
 
 public List<User> getAllUser();  
 
 public void addUser(User user);  
 
 public boolean delUser(String id);  
 
 public boolean updateUser(User user);  
}  

实现类UserDaoImpl:

代码语言:javascript
复制
package com.tgb.dao;  
import java.util.List;  
 
import org.hibernate.Query;  
import org.hibernate.SessionFactory;  
 
import com.tgb.entity.User;  
 
public class UserDaoImpl implements UserDao {  
 
 private SessionFactory sessionFactory;  
 
 public void setSessionFactory(SessionFactory sessionFactory) {  
 this.sessionFactory = sessionFactory;  
    }  
 
 @Override 
 public User getUser(String id) {  
 
        String hql = "from User u where u.id=?";  
        Query query = sessionFactory.getCurrentSession().createQuery(hql);  
        query.setString(0, id);  
 
 return (User)query.uniqueResult();  
    }  
 
 @Override 
 public List<User> getAllUser() {  
 
        String hql = "from User";  
        Query query = sessionFactory.getCurrentSession().createQuery(hql);  
 
 return query.list();  
    }  
 
 @Override 
 public void addUser(User user) {  
        sessionFactory.getCurrentSession().save(user);  
    }  
 
 @Override 
 public boolean delUser(String id) {  
 
        String hql = "delete User u where u.id = ?";  
        Query query = sessionFactory.getCurrentSession().createQuery(hql);  
        query.setString(0, id);  
 
 return (query.executeUpdate() > 0);  
    }  
 
 @Override 
 public boolean updateUser(User user) {  
 
        String hql = "update User u set u.userName = ?,u.age=? where u.id = ?";  
        Query query = sessionFactory.getCurrentSession().createQuery(hql);  
        query.setString(0, user.getUserName());  
        query.setString(1, user.getAge());  
        query.setString(2, user.getId());  
 
 return (query.executeUpdate() > 0);  
    }  
 
}  

最后外加一个配置spring-beans.xml,放在config.spring包下,负责为各层依赖注入需要的对象:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 
 
 <bean id="userDao" class="com.tgb.dao.UserDaoImpl"> 
 <property name="sessionFactory" ref="sessionFactory"></property> 
 </bean> 
 
 <bean id="userManagerBase" class="com.tgb.manager.UserManagerImpl"> 
 <property name="userDao" ref="userDao"></property> 
 </bean> 
 
 <!-- 此处为代理 --> 
 <bean name="userManager" parent="transactionProxy"> 
 <property name="target" ref="userManagerBase"></property> 
 </bean> 
</beans> 

到此为止,所有的配置和代码完成

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-09-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档