SpringMVC Resetful+Hibernate+MySQL实现增删改查操作

来源:互联网 发布:淘宝装修主页 编辑:程序博客网 时间:2024/06/17 16:45

一、Maven构建项目

     该示例采用Maven构建一个Web项目,项目结构如图所示:

       其中,pom.xml文件中依赖如下所示,自动添加相应依赖包,包括Spring MVC、Hibernate、MySQL JDBC等:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>sdd</groupId><artifactId>sdd</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name /><description /><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.glassfish</groupId><artifactId>bean-validator</artifactId><version>3.0-JBoss-4.0.2</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.annotation</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.ejb</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.enterprise.deploy</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.jms</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.management.j2ee</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.eclipse.persistence</groupId><artifactId>javax.persistence</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.resource</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.security.auth.message</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.security.jacc</artifactId><version>3.0.1</version><exclusions><exclusion><artifactId>javax.servlet</artifactId><groupId>org.glassfish</groupId></exclusion></exclusions></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.servlet.jsp.jstl</artifactId><version>3.0.1</version></dependency><dependency><groupId>org.glassfish</groupId><artifactId>javax.transaction</artifactId><version>3.0.1</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api-osgi</artifactId><version>2.2.1</version></dependency><dependency><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>jstl-impl</artifactId><version>1.2</version><exclusions><exclusion><artifactId>servlet-api</artifactId><groupId>javax.servlet</groupId></exclusion><exclusion><artifactId>jsp-api</artifactId><groupId>javax.servlet.jsp</groupId></exclusion></exclusions></dependency><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.3</version></dependency><dependency><groupId>javax.xml</groupId><artifactId>webservices-api-osgi</artifactId><version>2.0.1</version></dependency><dependency><groupId>org.jboss.weld</groupId><artifactId>weld-osgi-bundle</artifactId><version>1.0.1-SP3</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-core-asl</artifactId><version>1.9.12</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.12</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.5.0</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.0.2.RELEASE</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.3.11.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.20</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.0.5.RELEASE</version></dependency><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.2</version><exclusions><exclusion><groupId>xerces</groupId><artifactId>xerces</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.6</version></dependency></dependencies><build><sourceDirectory>${basedir}/src</sourceDirectory><outputDirectory>${basedir}/WebRoot/WEB-INF/classes</outputDirectory><resources><resource><directory>${basedir}/src</directory><excludes><exclude>**/*.java</exclude></excludes></resource></resources><plugins><plugin><artifactId>maven-war-plugin</artifactId><configuration><webappDirectory>${basedir}/WebRoot</webappDirectory><warSourceDirectory>${basedir}/WebRoot</warSourceDirectory></configuration></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build></project>

二、配置Web.xml

        web.xml配置是整个框架整合的关键,需要配置对Spring的支持、SpringMVC的支持,同时需要解决浏览器对于rest PUT和DELETE请求的支持。

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <display-name></display-name>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>    <!-- 添加对spring的支持 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>         <!-- Spring 刷新Introspector防止内存泄露 -->     <listener>         <listener-class>             org.springframework.web.util.IntrospectorCleanupListener         </listener-class>     </listener><!-- Spring MVC配置 --><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name> <!-- 不能是/*,否则会报404 --><url-pattern>/</url-pattern> </servlet-mapping><!-- 浏览器不支持put,delete等method,由该filter将/user?_method=delete转换为标准的http delete方法 -->      <filter>         <filter-name>HiddenHttpMethodFilter</filter-name>         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>      </filter>        <filter-mapping>         <filter-name>HiddenHttpMethodFilter</filter-name>         <!-- spring 名称一定要和servlet-mapping中servlet name一致 -->       <servlet-name>spring</servlet-name>       </filter-mapping>  <!-- 指定Spring配置文件位置 -->    <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param></web-app>

三、配置spring-servlet.xml

        一般以servlet-name来命名,你也可以取其他名字。该文件主要配置Spring MVC,同时需要解决Spring MVC对静态文件的解析过滤,通常放在WEB-INF路径下,具体内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="                 http://www.springframework.org/schema/beans                 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                 http://www.springframework.org/schema/context                 http://www.springframework.org/schema/context/spring-context-4.0.xsd                 http://www.springframework.org/schema/mvc                 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><!-- Spring MVC扫描Control --><context:component-scan base-package="com.springmvc.control" /><!-- 使用如下两个class激活@RequestMapping annotation --><beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /><!-- 通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器 --><!-- 设置不过滤内容,比如:css,jquery,img 等资源文件 --><mvc:resources location="/*.html" mapping="/**.html" /><mvc:resources location="/css/*" mapping="/css/**" /><mvc:resources location="/js/*" mapping="/js/**" /><mvc:resources location="/images/*" mapping="/images/**" /><!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/jsp/" /><property name="suffix" value=".jsp" /></bean><!-- 避免IE执行AJAX时,返回JSON出现下载文件 --><bean id="mappingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean><!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --><beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 --></list></property></bean></beans>

四、创建并配置jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8jdbc.username=rootjdbc.password=root

五、创建并配置applicationContext.xml文件

     该文件通常放在src目录下

<?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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd    http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx-4.0.xsd    http://www.springframework.org/schema/aop    http://www.springframework.org/schema/aop/spring-aop-4.0.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-4.0.xsd    http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><!-- 注解支持 --><context:annotation-config /><!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描 --><context:component-scan base-package="com.springmvc.dao,com.springmvc.service"><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- JDBC属性文件位置 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- MySQL数据库连接 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${jdbc.driverClassName}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></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.show_sql">true</prop></props></property><property name="mappingResources"><list><value>com/springmvc/model/User.hbm.xml</value></list></property></bean><!-- Spring接管Hibernate CRUD操作 --><bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- Spring声明式事务管理器 --><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory" /></bean><!-- 配置事务特性,配置add,delete,update开始的方法,事务传播特性为required --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!-- REQUIRED 表示 如果存在一个事务,则支持当前事务。如果没有事务则开启 --><tx:method name="add*" propagation="REQUIRED" /><tx:method name="delete*" propagation="REQUIRED" /><tx:method name="update*" propagation="REQUIRED" /><tx:method name="*" read-only="true" /></tx:attributes></tx:advice><!-- 配置那些类的方法进行事务管理,当前com.ssh2.basedao.impl包中的子包, 类中所有方法需要,还需要参考tx:advice的设置 --><aop:config><aop:pointcut id="allManagerMethod"expression="execution(* com.springmvc.service.*.*(..))" /><aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" /></aop:config><!-- 导入SpringMVC Servlet配置文件 --><import resource="classpath*:spring-servlet.xml" /></beans>

六、编写控制类

        Controller控制类是Spring MVC的核心,类似于Struts2框架中的Action,通过@Controller注解实现Spring的注入,并通过@RequestMapping接收前端映射请求。加入返回值@ResponseBoady注解后,要把对象转换成json格式,缺少转换依赖的jar包,会出现以下异常的情况,需要添加依赖的jar,jackson-core-asl-1.9.12.jar,jackson-mapper-asl-1.9.12.jar问题解决。

Response Status: 406 (Not Acceptable)  

package com.springmvc.control;import javax.annotation.Resource;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.stereotype.Repository;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.servlet.ModelAndView;import com.springmvc.model.User;import com.springmvc.service.UserService;/** * Scope:表示实例是原型,这样会对每一个请求实例化,保证线程安全 Spring中使用 Controller注解表示该类是控制器 * Repository注解Dao访问类 Service注解业务逻辑处理类 Resource注解表示使用某个bean资源 * RequestMapping:表示对该类所有方法的请求URL,前面必须接上/user,如/user/login 表示对login方法的请求访问 *  * @author Administrator *  */@Scope("prototype")@Controller@RequestMapping("/user")public class UserControl {@Resource(name = "userService")private UserService userService;private String message;/** *  * Spring MVC中使用RequestMapping处理URL请求, *     GET:表示查询;POST:表示添加操作 *     PUT:表示修改操作;DELETE:表示删除操作 * ResponseBody:表示返回对象或者值; * consumes: 表示前端传过来的数据格式; * produces:表示返回数据格式 */@RequestMapping(value = "/login", method = RequestMethod.GET, consumes = "application/json", produces = "application/json")@ResponseBodypublic User login(User user, Model model) {// System.out.println(user.getUsername());User u = userService.findUserByNameAndPassword(user);return u;}@RequestMapping(value = "/addUser", method = RequestMethod.POST, produces = "application/json")@ResponseBodypublic String addUser(User user) {boolean flag = userService.addUser(user);if (flag) {message = "success";} else {message = "error";}return message;}/** * PathVariable:注解方法参数,表示该参数变量值是通过URL传递的 * URL中必须包含该参数变量名,变量名需要相同才能完成变量传递注入 */@RequestMapping(value = "/deleteUser/{id}", method = RequestMethod.DELETE, produces = "application/json")@ResponseBodypublic String deleteUser(@PathVariable Integer id) {boolean flag = userService.deleteUser(id);if (flag) {message = "success";} else {message = "error";}return message;}public void setUserService(UserService userService) {this.userService = userService;}public UserService getUserService() {return userService;}}

七、编写业务逻辑类

package com.springmvc.service;import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.springmvc.dao.UserDao;import com.springmvc.model.User;@Service(value="userService")public class UserService {@Resource(name="userDao")private UserDao userDao;public User findUserByNameAndPassword (User user) {List<User> listUsers = userDao.findByNameAndPassword(user);if(listUsers.size() > 0) {return listUsers.get(0);}return null;}public User findUserByName (String name) {        List<User> listUsers = userDao.findUserByName(name);if(listUsers.size() > 0) {return listUsers.get(0);}return null;}public boolean deleteUser(Integer id) {return userDao.deleteUser(id);}public boolean addUser(User user) {return userDao.addUser(user);}public UserDao getUserDao() {return userDao;}public void setUserDao(UserDao userDao) {this.userDao = userDao;}}

八、编写Dao操作类

package com.springmvc.dao;import java.util.ArrayList;import java.util.List;import javax.annotation.Resource;import org.springframework.orm.hibernate4.HibernateTemplate;import org.springframework.stereotype.Repository;import com.springmvc.model.User;@Repository(value="userDao")public class UserDao {//hibernateTemplate是Spring提供的Hibernate Dao操作类,在applicationContext中已经完成bean注入,所以此处直接//可以拿过来使用@Resource(name="hibernateTemplate")private HibernateTemplate hibernateTemplate;//根据用户名和密码查询public List<User>  findByNameAndPassword (User user) {   String queryString = "from User where username = :username and password = :password";   String paramNames[] = {"username" , "password"};   String paramValues[] = {user.getUsername(),user.getPassword()};      //findByNamedParam方法提供hql方法参数查询,避免Sql注入漏洞   @SuppressWarnings("unchecked")   List<User> listUsers = (List<User>) hibernateTemplate.findByNamedParam(queryString, paramNames, paramValues);       return listUsers;}@SuppressWarnings("unchecked")public  List<User> findUserByName(String name) {List<User> userList = new ArrayList<User>();String queryString = "from User where username like:name";userList = (List<User>) hibernateTemplate.findByNamedParam(queryString,"name",name);        return userList;}public boolean  addUser(User user) {    try {    hibernateTemplate.save(user);   } catch (Exception e) {           return false;}    return true;}public boolean deleteUser(Integer id) {try {User user = hibernateTemplate.get(User.class, id);hibernateTemplate.delete(user);} catch (Exception e) {return false;}return true;}public HibernateTemplate getHibernateTemplate() {return hibernateTemplate;}public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {this.hibernateTemplate = hibernateTemplate;}}

九、本示例中的Model类

package com.springmvc.model;public class User {private Integer id;private String username;private String password;private String address;private String tel;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}}

十、前端JSP页面Ajax请求

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--><!-- action uri 前面不能加/ 否则路径变成从根开始  --><!-- <script type="text/javascript" src="js/jquery-easyui-1.4.4/jquery.min.js"></script> --><script type="text/javascript"src="js/jquery-easyui-1.4.4//jquery.min.js"></script><script type="text/javascript">$(document).ready(function() {$("#btnQuery").click(function() {var username = $("#username").val();var password = $("#password").val();var data = {"username" : username,"password" : password};// alert(JSON.stringify(data));$.ajax({type : "GET",url : "user/login",dataType : "json", //后台返回值类型data : data,beforeSubmit : function() {},success : function(data) {alert(data.username + " " + data.password+ " " + data.address + " "+ data.tel);},error : function(data) {alert("error");}});});$("#btnAdd").click(function() {var username = $("#username").val();var password = $("#password").val();var address = $("#address").val();var tel = $("#tel").val();var data = {"username" : username,"password" : password,"address" : address,"tel" : tel};$.ajax({type : "POST",url : "user/addUser",dataType : "json", //后台返回值类型data : data,beforeSubmit : function() {},success : function(data) {if(data == 'success') {alert("添加成功");}else {alert("添加失败");}},error : function(data) {alert("error");}});});$("#btnDel").click(function() {var id = $("#id").val();$.ajax({type : "DELETE",url : "user/deleteUser/"+id,dataType : "json", //后台返回值类型beforeSubmit : function() {},success : function(data) {if(data == 'success') {alert("删除成功");}else {alert("删除失败");}},error : function(data) {alert("error");}});});});</script></head><body>   <!-- 查询 -->用户名:<input type="text" id="username" value="xx"><br> 密码:<input type="password" id="password" value="1233"><br><a href="javascript:void(0)" id="btnQuery">查询</a>    <br>    <!-- 添加 -->用户名:<input type="text" id="username" value="张三图"><br> 密码:<input type="password" id="password" value="1233"><br> 地址:<input type="text" id="address" value="安徽天长"><br> 联系方式:<input type="password" id="tel" value="1232333"><br><input type="button" id="btnAdd" value="提交"><br><!-- 删除 --><input type="text" id="id" value="51"><input type="button" id="btnDel" value="删除"><%--     <form:form action="user/login" method="post">                 用户名:<input type="text" name="username" value="xx"><br>                   密码:    <input type="password" name="password" value="1233"><br>                       用户名:<input type="text" name="address" value="ss"><br>                   密码:    <input type="password" name="tel" value="1232333"><br>        <input type="submit" value="提交">     </form:form>           --%><%--<form:form action="user/deleteUser/50" method="delete">        <input type="submit" value="提交">     </form:form>  --%></body></html>

        HTTP请求中本身是不支持PUT和DELETE method方法请求的,本文在web.xml中添加了过滤器处理该部分请求,并且通过Ajax发送请求。但是Spring MVC本身也提供了<form:form>标签,通过表单提交的方式发送Restful请求,如上面代码中注释内容所示。只需要在页面前面导入标签库即可。

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>





1 0