SpringMVC+hibernate整合小例子,用户的增删查改
对于使用框架写项目,我的第一反应的把所有需要的jar文件引入。
因为我用的是JDK1.8,当使用spring3.2 注解的时候会出现问题,所以最终使用的spring4.0. hibernate使用的版本为4.0 。至于一些依赖包的版本就是看别人的资料拿的。
然后看下整体的项目结构
第一步写的是web.xml配置文件,当然有写东西是后面加上去的,不是一步到位的,比如说控制post方式的乱码、以及无法时候JS文件等一些静态文件,后面的代码都是在做的过程遇到问题再一点一点百度,然后加上去的。
<?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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 控制乱码 --> <filter> <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 创建spring监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- spring的监听器可以通过这个上下文参数来获取beans.xml的位置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!--<url-pattern>/</url-pattern> 使用/会拦截所有的url所以无法直接访问项目中的静态文件 解决方法使用 资源管理 <mvc:resources location="/js/" mapping="/js/**"/> --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
这里的实体类的生成、以及Users.hbm.xml文件使用的hibernate的反向工程生成的。至于方向工程如何操作可以看我之前关于方向工程的文件。使用反向工程的好处就是在于节省时间,减少错误的发生。
http://blog.csdn.net/qq303437511/article/details/47263849 具体讲解了如何安装插件、以及使用方向工程。
package com.spring.mvc.model; // Generated 2016-4-22 10:22:24 by Hibernate Tools 3.4.0.CR1 /** * Users generated by hbm2java */ public class Users implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1L; private Integer userid; private String nickname; private String username; private String password; private String answer; private Boolean question; private Boolean role; private Boolean isdel; private Boolean userState; public Users() { } public Users(String nickname, String username, String password, String answer, Boolean question, Boolean role, Boolean isdel, Boolean userState) { this.nickname = nickname; this.username = username; this.password = password; this.answer = answer; this.question = question; this.role = role; this.isdel = isdel; this.userState = userState; } public Integer getUserid() { return this.userid; } public void setUserid(Integer userid) { this.userid = userid; } public String getNickname() { return this.nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public String getAnswer() { return this.answer; } public void setAnswer(String answer) { this.answer = answer; } public Boolean getQuestion() { return this.question; } public void setQuestion(Boolean question) { this.question = question; } public Boolean getRole() { return this.role; } public void setRole(Boolean role) { this.role = role; } public Boolean getIsdel() { return this.isdel; } public void setIsdel(Boolean isdel) { this.isdel = isdel; } public Boolean getUserState() { return this.userState; } public void setUserState(Boolean userState) { this.userState = userState; } }Users.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-4-22 10:22:24 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.spring.mvc.model.Users" table="users" catalog="database1"> <id name="userid" type="java.lang.Integer"> <column name="userid" /> <generator class="identity" /> </id> <property name="nickname" type="string"> <column name="nickname" length="20" /> </property> <property name="username" type="string"> <column name="username" length="40" /> </property> <property name="password" type="string"> <column name="password" length="40" /> </property> <property name="answer" type="string"> <column name="answer" length="50" /> </property> <property name="question" type="java.lang.Boolean"> <column name="question" /> </property> <property name="role" type="java.lang.Boolean"> <column name="role" /> </property> <property name="isdel" type="java.lang.Boolean"> <column name="isdel" /> </property> <property name="userState" type="java.lang.Boolean"> <column name="userState" /> </property> </class> </hibernate-mapping>
第三写控制器
package com.spring.mvc.action; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.spring.mvc.model.Users; import com.spring.mvc.service.UsersService; //声明这是一个控制器 @Controller
public class UsersController { @Resource private UsersService userservice; @RequestMapping("adduser") public String addUser(String username,String password,Users user){ System.out.println(username); System.out.println(password); System.out.println("1"+user); userservice.addUsers(user); return "success"; }
//这个方法用于用户注册时判断用户名是否已经存在。需要使用ajax来实现异步刷新 @RequestMapping("valUsername") public @ResponseBody Map<String,Object> findUsersByName(HttpServletRequest request){ Map<String,Object> map = new HashMap<String,Object>(); String username = (String) request.getParameter("username"); //System.out.println(username+"111"); String msg = userservice.findUsersByName(username); map.put("msg", msg); return map; } @RequestMapping("/listUsers") public String listAll(Map<String,Object> model){ //Map<String,Object> model 这种形式的返回model中的属性可以任意。 List<Users> userList =userservice.list(); model.put("userList", userList); return "UsersList"; } @RequestMapping("/userUpdate") public String update(Integer id, Model model){ //System.out.println(id); Users Users = userservice.findUsersById(id); model.addAttribute(Users); //model里面的属性需要和类名一样 但是需要小写 return "UserUpdate"; } @RequestMapping("/updateInfo") public String updateInfo(HttpServletRequest request,Users user){ System.out.println(user.getUsername()); userservice.UpdateInfo(user); return "UserUpdate"; } @RequestMapping("/deleteById") public String delUser(Integer id){ userservice.delUserById(id); return "redirect:/listUsers"; } }
在 Spring mvc3中,响应、接受 JSON都十分方便。
使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON。
使用 @RequestBody 注解前台只需要向 Controller 提交一段符合格式的 JSON,Spring 会自动将其拼装成 bean。
Spring这个转换是靠org.codehaus.jackson这个组件来实现的,所有需要引入jackson-core-asl和org.codehaus.jackson两个jar包
上面一段是从别人那复制过来了,但是我只使用了jackson-core-asl-1.9.13.jar、jackson-mapper-asl-1.9.13.jar也是可以实现效果的。
第四 写service类
package com.spring.mvc.service; import java.util.List; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.spring.mvc.dao.UsersDao; import com.spring.mvc.model.Users; @Service("userservice") public class UsersService { @Resource private UsersDao userdao; public boolean addUsers(Users user){ this.userdao.addUser(user); return true; } public String findUsersByName(String username){ return this.userdao.findUserByName(username); } public List<Users> list() { return this.userdao.list(); } public Users findUsersById(Integer id) { return this.userdao.findUserById(id); } public void UpdateInfo(Users user) { this.userdao.UpdateInfo(user); } public void delUserById(Integer id) { this.userdao.delUserById(id); } }
package com.spring.mvc.dao; import java.util.List; import com.spring.mvc.model.Users; public interface UsersDao { public void addUser(Users user); public String findUserByName(String username); public List<Users> list(); public Users findUserById(Integer id); public void UpdateInfo(Users user); public void delUserById(Integer id); }
package com.spring.mvc.daoimpl; import java.util.List; import javax.annotation.Resource; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import com.spring.mvc.dao.UsersDao; import com.spring.mvc.model.Users; @Repository("userdao") public class UserDaoImpl implements UsersDao { @Resource private SessionFactory sessionFactory; public void addUser(Users user) { sessionFactory.getCurrentSession().saveOrUpdate(user); } @SuppressWarnings("unchecked") @Override public String findUserByName(String username) { String sql = "from Users u where u.username = "+"'"+username+"'"; System.out.println(username); List<Users> usersList = (List<Users>) sessionFactory.getCurrentSession().createQuery(sql).list(); System.out.println(usersList.size()); if(usersList.size()>0){ return "true"; }else{ return "false"; } } @Override public List<Users> list() { //Query q = sessionFactory.getCurrentSession().createQuery("from Users"); @SuppressWarnings("unchecked") List<Users> usersList = (List<Users>) sessionFactory.getCurrentSession().createQuery("from Users").list(); return usersList; } @Override public Users findUserById(Integer id) { return (Users) sessionFactory.getCurrentSession().get(Users.class,id); } @Override public void UpdateInfo(Users user) { String sql = "update Users set username=? where userid=?"; Query q = sessionFactory.getCurrentSession().createQuery(sql); q.setString(0, user.getUsername()); q.setInteger(1, user.getUserid()); q.executeUpdate(); } @Override public void delUserById(Integer id) { Users u = (Users) sessionFactory.getCurrentSession().get(Users.class,id); sessionFactory.getCurrentSession().delete(u); } }
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd "> <!-- 自动扫描 --> <context:component-scan base-package="com.spring.mvc.action"/> <!-- 注解驱动 --> <mvc:annotation-driven/> <!-- 资源管理 --> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/imgs/" mapping="/imgs/**"/> <!--视图解析器 --> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/jsp/"/> <!-- 后缀 --> <property name="suffix" value=".jsp"/> </bean> </beans>一些bean的实例、数据源、还有事务管理、AOP配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <!-- 自动扫描 --> <context:component-scan base-package="com.spring.mvc.daoimpl,com.spring.mvc.service,com.spring.mvc.dao"/> <!-- 数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost/database1" /> <property name="user" value="root" /> <property name="password" value="1234" /> <property name="maxPoolSize" value="80" /> <property name="minPoolSize" value="1"/> <property name="initialPoolSize" value="1" /> <!-- <property name="maxIdleTime" value="2500" /> --> </bean> <!--配置sessionFactory--> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 映射文件的目录 --> <property name="mappingDirectoryLocations"> <list> <value>classpath:com/spring/mvc/model</value> </list> </property> <!-- 其他的hibernate常用配置 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> </bean> <!-- hibernate事务管理器,在service层上实现事务管理,实现平台无关 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 事务通知 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT" /> <tx:method name="updae*" propagation="REQUIRED" isolation="DEFAULT" /> <tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" /> <tx:method name="batch*" propagation="REQUIRED" isolation="DEFAULT" /> <tx:method name="load*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" /> <tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" isolation="DEFAULT" read-only="true" /> <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" /> </tx:attributes> </tx:advice> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.spring.mvc.service.*.*(..))" /> </aop:config> </beans>下面是JSP文件
这个是用户注册页面、里面有一段ajax代码实现用户名是否可以用的异步验证功能
当用户输入的用户名已存在 会出现提示
<%@ 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 src="/GDUTCourse/js/jquery-1.9.1.min.js"> </script> </head> <body> <form action="${pageContext.request.contextPath}/adduser" method="post"> <h1>用户注册</h1> 用户名:<input type="text" name="username" id="username"/> <label id="tishi" style="display:none;">用户名已经存在</label> 密码: <input type="password" name="password"/> <input type="submit" value="注册"> </form> </body> <script type="text/javascript"> $("#username").blur(function(){ var username = $("#username").val(); $.ajax({ data:{username:username}, type:"GET", dataType: 'json', url:"/GDUTCourse/valUsername", error:function(data){ alert("出错了!!:"+data.msg); }, success:function(data){ if(data.msg == "true" ){ // alert("success:"+data.msg); $("#tishi").show(); }else{ $("#tishi").hide(); } } }); }); </script> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!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>用户列表</title> </head> <body> <h2>用户列表</h2> <table border="1"> <tr> <td>id</td> <td>name</td> <td>password</td> <td>操作</td> </tr> <c:forEach items="${userList}" var="users"> <tr> <td>${users.userid}</td> <td>${users.username}</td> <td>${users.password}</td> <td> <a href="${pageContext.request.contextPath}/userUpdate?id=${users.userid}">修改</a> <a href="${pageContext.request.contextPath}/deleteById?id=${users.userid}">删除</a> </td> </tr> </c:forEach> </table> </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%> <!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> </head> <body> <body> <sf:form id="p" action="updateInfo" method="post" modelAttribute="users"> <h2>修改用户</h2> <table border="1"> <tr> <td>id:</td> <td><sf:input path="userid"/></td> </tr> <tr> <td>name:</td> <td><sf:input path="username"/></td> </tr> <tr> <td>age:</td> <td><sf:input path="password"/></td> </tr> <tr> <td><input type="submit"/></td> </tr> </table> </sf:form> </body> </body> </html>