摘要: 本文主要讲述整合springMVC, spring, hibernate的具体过程, 并连接上oracle进行简单的DUAL.
1、springMVC、spring、hibernate整合过程
2、实现简单的DUAL
1、springMVC、spring、hibernate整合过程
a) 引入jar包、具体jar包如下图:
b) 使用spring的bean配置关于连接数据库的一些信息、hibernate的常用配置信息、及事务的管理方式springAnnotation-hibernate.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [ <!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml"> ]> <beans> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:chen" /> <property name="username" value="chen" /> <property name="password" value="chen" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 为sessionFactory注入dataSource --> <property name="dataSource" ref="dataSource" /> <!-- 常用hibernate配置 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hiberante.format_sql">true</prop> </props> </property> <!-- 加载用于生成数据库中表的hibernate配置文件。 --> <property name="configLocations"> <list> <value> classpath*:com/chy/ssh/web/annotation/hibernate/hibernate.cfg.test.xml </value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 事务管理 、当使用spring为每个Controller注入属性时引用此bean、为其添加事务管理 --> <bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <property name="transactionManager" ref="transactionManager"></property> <!-- 根据不同的操作开启不同的事务管理方式 --> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="get*">PROPAGATION_NEVER</prop> </props> </property> </bean> </beans>
c) 配置hibernate的配置文件、用于生成表。这里不是通过写每一个实体类的hibernate.hbm.xml来对应数据库中的table、而是通过注解的方式来实现的。 hibernate.cfg.test.xml:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 用于关联表的实体类 --> <mapping class="com.chy.ssh.web.annotation.entity.User"/> </session-factory> </hibernate-configuration>
具体的entity——User:
package com.chy.ssh.web.annotation.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 int 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }
d) web.xml加载配置文件:
<?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"> <!-- 加载配置文件、这里在classpath下写多个不同的文件是为了在团体开发中、不同的小组有不同的配置文件、 这样就不会相互影响、减小冲突、易于管理、最后在主要的配置文件中导入各个模块的配置文件即可! --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/springAnnotation-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <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/springAnnotation-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <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> <!-- encoding filter for jsp page --> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 用于session的管理、解决事务提交后再次操作数据库不能正常打开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>
2、实现简单的DUAL:没有多少要说的地方、主要介绍两个类:UserDAOImpl、UserController、具体的代码中都有说明
a) UserDAOImpl:
package com.chy.ssh.web.annotation.dao; import java.util.List; import org.hibernate.Query; import org.hibernate.SessionFactory; import com.chy.ssh.web.annotation.entity.User; public class UserDAOImple implements UserDAO { private SessionFactory sessionFactory; public void addUser(User user) { sessionFactory.getCurrentSession().save(user); } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @SuppressWarnings("unchecked") public List<User> getAllUser() { String hql = "from User"; Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list(); } public boolean delUser(String userId) { String hql = "delete from User u where u.id=?"; Query query = sessionFactory.getCurrentSession().createQuery(hql); query.setString(0, userId); return (query.executeUpdate() > 0); } 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(); } 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.setInteger(1, user.getAge()); query.setString(2, user.getId()); return (query.executeUpdate() > 0); } }
b) UserController:
package com.chy.ssh.web.annotation.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.List; 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.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import com.chy.ssh.web.annotation.entity.User; import com.chy.ssh.web.annotation.service.UserService; @Controller @RequestMapping("/user") public class UserController { @Resource(name="userManager") private UserService userManager; @RequestMapping("/toUser") public String toUser(){ return "/addUser"; } @RequestMapping("/addUser") public String addUser(@ModelAttribute("pojo")User user){ userManager.addUser(user); return "/success"; } @RequestMapping("/getAllUser") public String getAllUser(HttpServletRequest request){ List<User> userList = userManager.getAllUser(); request.setAttribute("userList", userList); return "/userManager"; } @RequestMapping("/delUser") public void delUser(String id,HttpServletResponse response){ String result = "{\"result\":\"error\"}"; if(userManager.delUser(id)){ result = "{\"result\":\"success\"}"; } PrintWriter out = null; response.setContentType("application/json"); try { out = response.getWriter(); out.write(result); } catch (IOException e) { e.printStackTrace(); } } @RequestMapping("/getUser") public String getUser(String id,HttpServletRequest request){ User user = userManager.getUser(id); request.setAttribute("user", user); return "/editUser"; } @RequestMapping("/updateUser") public String updateUser(User user,HttpServletRequest request){ if(userManager.updateUser(user)){ user = userManager.getUser(user.getId()); request.setAttribute("user", user); return "/editUser"; }else{ return "/error"; } } }
1、整体结构图:
2、第一次访问URL:http://localhost:8080/springMVC_spring_hibernate/user/toUser
3、addUser.jsp:
<%@ 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.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> </script> </head> <body> <h3>添加用户</h3> <form action="/springMVC_spring_hibernate/user/addUser" method="post"> 姓名:<input type="text" name="userName"> 年龄:<input type="text" name="age"> <input type="submit" value="添加"> </form> </body> </html>
4、success.jsp:
<body> springMVC + spring + hibernate 集成成功!!! </body>
5、访问获取所有学生信息URL:http://localhost:8080/springMVC_spring_hibernate/user/getAllUser
6、userManager.jsp:
<%@ 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.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>用户管理</title> <script type="text/javascript"> function del(id) { alert(id); $.get("/springMVC_spring_hibernate/user/delUser?id=" + id, function( data) { alert(data.result); if ("success" == data.result) { alert("删除成功!"); window.location.reload(); } else { alert("删除失败!"); } }); } </script> </head> <body> <table border="1"> <tbody> <tr> <th>姓名</th> <th>年龄</th> <th>编辑</th> </tr> <c:if test="${!empty userList }"> <c:forEach items="${userList }" var="u"> <tr> <td>${u.userName }</td> <td>${u.age }</td> <td> <a href="/springMVC_spring_hibernate/user/getUser?id=${u.id }">编辑</a> <a href="javascript:del('${u.id }')">删除</a> </td> </tr> </c:forEach> </c:if> </tbody> </table> </body> </html>
7、editUser.jsp:
<%@ 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.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>修改用户</title> </head> <body> <h3>修改用户</h3> <form name="userForm" action="/springMVC_spring_hibernate/user/updateUser" 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>