SpringMVC3+Hibernate+MySQL CRUD 小案例(翻译)
来源:互联网 发布:黑暗启示录2bt版java 编辑:程序博客网 时间:2024/06/06 11:00
首先声明下,本人英语很蹩脚,英语好的,可以直接去看原文,原文可能打开有点慢,耐心等待下就好
我正在学习这个框架的开发,看到这一篇文章对于初学者来说还是非常好的,不管是整体的设置还是细化到每一个文件的配置
给出原文地址:http://java.dzone.com/articles/springmvc3-hibernate-crud
学习任何的Web框架从HelloWorld应用开始是一个好的主意。一旦你熟悉了这个框架的结构,那最好去做一个CRUD应用,它覆盖Web框架验证的各个方面。请求的URL映射,请求的参数绑定,预填充形式等等。
现在我就解释一下怎么样用Spring MVC3、hibernate、MySQL写一个简单的CRUD应用。我们的应用是一个联系人管理系统,你可以查看和搜索联系人,创建联系人,编辑或者删除联系人。
Step#1: 创建 CONTACTS 表
CREATE TABLE CONTACTS( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(45) NOT NULL, address varchar(45) DEFAULT NULL, gender char(1) DEFAULT 'M', dob datetime DEFAULT NULL, email varchar(45) DEFAULT NULL, mobile varchar(15) DEFAULT NULL, phone varchar(15) DEFAULT NULL, PRIMARY KEY (id));
Step#2: 复制 SpringMVC, Hibernate 和 依赖的jar包 到 WEB-INF/lib 目录下,如果你用 Maven 来管理你的项目,可以参考以下的配置
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-digester</groupId> <artifactId>commons-digester</artifactId> <version>2.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.3.2.GA</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.4.0.GA</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>jboss</groupId> <artifactId>javassist</artifactId> <version>3.7.ga</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.14</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies>
Step#3: 配置SpringMVC
a) 配置 web.xml
<servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
b) 配置视图解析器 WEB-INF/dispatcher-servlet.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp"></bean>
c) 配置注解, 属性, 资源绑定消息 WEB-INF/classes/applicationContext.xml
<context:annotation-config></context:annotation-config><context:component-scan base-package="com.sivalabs"></context:component-scan><mvc:annotation-driven> </mvc:annotation-driven ><context:property-placeholder location="classpath:config.properties"></context:property-placeholder><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="Messages"></bean>
Step#4: 配置 JDBC connection 参数 和 Hibernate 参数 config.properties
################### JDBC Configuration ##########################jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/sivalabsjdbc.username=rootjdbc.password=admin################### Hibernate Configuration ##########################hibernate.dialect=org.hibernate.dialect.MySQLDialecthibernate.show_sql=true#hibernate.hbm2ddl.auto=updatehibernate.generate_statistics=true
Step#5: 配置 数据源, Session工厂, 事务管理 的支持 WEB-INF/classes/applicationContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}" p:username="${jdbc.username}" p:password="${jdbc.password}"> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> </props> </property> <property name="packagesToScan" value="com.sivalabs"></property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"> </bean> <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
Step#6: 配置 标签, 错误提示 WEB-INF/classes/Messages.properties
App.Title=SivaLabstypeMismatch.java.util.Date={0} is Invalid Date.dob=DOB
Step#7: 创建实体类 Contact.java
package com.sivalabs.contacts;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import org.apache.commons.lang.builder.ToStringBuilder;@Entity@Table(name="CONTACTS")public class Contact{ @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column private String name; @Column private String address; @Column private String gender; @Column private Date dob; @Column private String email; @Column private String mobile; @Column private String phone; @Override public String toString() { return ToStringBuilder.reflectionToString(this); } //setters & getters }
Step#8: 创建 ContactsDAO.java (执行Contacts表的增删改查)
package com.sivalabs.contacts;import java.util.List;import org.hibernate.Criteria;import org.hibernate.SessionFactory;import org.hibernate.criterion.Restrictions;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import org.springframework.transaction.annotation.Transactional;@Repository@Transactionalpublic class ContactsDAO{ @Autowired private SessionFactory sessionFactory; public Contact getById(int id) { return (Contact) sessionFactory.getCurrentSession().get(Contact.class, id); } @SuppressWarnings("unchecked") public List<Contact> searchContacts(String name) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Contact.class); criteria.add(Restrictions.ilike("name", name+"%")); return criteria.list(); } @SuppressWarnings("unchecked") public List<Contact> getAllContacts() { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Contact.class); return criteria.list(); } public int save(Contact contact) { return (Integer) sessionFactory.getCurrentSession().save(contact); } public void update(Contact contact) { sessionFactory.getCurrentSession().merge(contact); } public void delete(int id) { Contact c = getById(id); sessionFactory.getCurrentSession().delete(c); }}
Step#9: 创建 ContactFormValidator.java (执行 创建或更新 Contact 表的验证
package com.sivalabs.contacts;import org.springframework.stereotype.Component;import org.springframework.validation.Errors;import org.springframework.validation.ValidationUtils;import org.springframework.validation.Validator;@Component("contactFormValidator")public class ContactFormValidator implements Validator{ @SuppressWarnings("unchecked") @Override public boolean supports(Class clazz) { return Contact.class.isAssignableFrom(clazz); } @Override public void validate(Object model, Errors errors) { ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name","required.name", "Name is required."); }}
Step#10: 创建 ContactsControllers.java (执行所有的CRUD 操作请求)
package com.sivalabs.contacts;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.propertyeditors.CustomDateEditor;import org.springframework.stereotype.Controller;import org.springframework.validation.BindingResult;import org.springframework.web.bind.WebDataBinder;import org.springframework.web.bind.annotation.InitBinder;import org.springframework.web.bind.annotation.ModelAttribute;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.support.SessionStatus;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class ContactsControllers{ @Autowired private ContactsDAO contactsDAO; @Autowired private ContactFormValidator validator; @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } @RequestMapping("/searchContacts") public ModelAndView searchContacts(@RequestParam(required= false, defaultValue="") String name) { ModelAndView mav = new ModelAndView("showContacts"); List<Contact> contacts = contactsDAO.searchContacts(name.trim()); mav.addObject("SEARCH_CONTACTS_RESULTS_KEY", contacts); return mav; } @RequestMapping("/viewAllContacts") public ModelAndView getAllContacts() { ModelAndView mav = new ModelAndView("showContacts"); List<Contact> contacts = contactsDAO.getAllContacts(); mav.addObject("SEARCH_CONTACTS_RESULTS_KEY", contacts); return mav; } @RequestMapping(value="/saveContact", method=RequestMethod.GET) public ModelAndView newuserForm() { ModelAndView mav = new ModelAndView("newContact"); Contact contact = new Contact(); mav.getModelMap().put("newContact", contact); return mav; } @RequestMapping(value="/saveContact", method=RequestMethod.POST) public String create(@ModelAttribute("newContact")Contact contact, BindingResult result, SessionStatus status) { validator.validate(contact, result); if (result.hasErrors()) { return "newContact"; } contactsDAO.save(contact); status.setComplete(); return "redirect:viewAllContacts.do"; } @RequestMapping(value="/updateContact", method=RequestMethod.GET) public ModelAndView edit(@RequestParam("id")Integer id) { ModelAndView mav = new ModelAndView("editContact"); Contact contact = contactsDAO.getById(id); mav.addObject("editContact", contact); return mav; } @RequestMapping(value="/updateContact", method=RequestMethod.POST) public String update(@ModelAttribute("editContact") Contact contact, BindingResult result, SessionStatus status) { validator.validate(contact, result); if (result.hasErrors()) { return "editContact"; } contactsDAO.update(contact); status.setComplete(); return "redirect:viewAllContacts.do"; } @RequestMapping("deleteContact") public ModelAndView delete(@RequestParam("id")Integer id) { ModelAndView mav = new ModelAndView("redirect:viewAllContacts.do"); contactsDAO.delete(id); return mav; } }
Step#11: 不是在所有的JSP中都引用这个 JSTL 标签库 ,而是 声明他们在一个JSP 中,并且包含这个JSP和其他的JSP.
taglib_includes.jsp
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%><%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%><%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
Step#12: 创建 JSP
a)showContacts.jsp
<%@include file="taglib_includes.jsp" %><html><head><title><spring:message code="App.Title"></spring:message> </title><script type="text/javascript" src="js/contacts.js"></script></head><body style="font-family: Arial; font-size:smaller;"> <center> <form action="searchContacts.do" method="post"> <table style="border-collapse: collapse;" border="0" bordercolor="#006699" width="500"> <tr> <td>Enter Contact Name</td> <td><input type="text" name="name"/> <input type="submit" value="Search"/> <input type="button" value="New Contact" onclick="javascript:go('saveContact.do');"/> </td></tr> </table> </form> <table style="border-collapse: collapse;" border="1" bordercolor="#006699" width="500"> <tr bgcolor="lightblue"> <th>Id</th> <th>Name</th> <th>Address</th> <th>Mobile</th> <th></th> </tr> <c:if test="${empty SEARCH_CONTACTS_RESULTS_KEY}"> <tr> <td colspan="4">No Results found</td> </tr> </c:if> <c:if test="${! empty SEARCH_CONTACTS_RESULTS_KEY}"> <c:forEach var="contact" items="${SEARCH_CONTACTS_RESULTS_KEY}"> <tr> <td><c:out value="${contact.id}"></c:out></td> <td><c:out value="${contact.name}"></c:out></td> <td><c:out value="${contact.address}"></c:out> </td> <td><c:out value="${contact.mobile}"></c:out></td> <td> <a href="updateContact.do?id=${contact.id}">Edit</a> <a href="javascript:deleteContact('deleteContact.do?id=${contact.id}');">Delete</a> </td> </tr> </c:forEach> </c:if> </table> </center> </body></html>
b)newContact.jsp
<%@include file="taglib_includes.jsp" %><html><head> <script type="text/javascript" src="js/contacts.js"></script> <title><spring:message code="App.Title"></spring:message> </title></head><body style="font-family: Arial; font-size:smaller;"><table bgcolor="lightblue" width="750" height="500" align="center" style="border-collapse: collapse;" border="1" bordercolor="#006699" > <tr> <td align="center"><h3>Edit Contact Form</h3></td> </tr> <tr valign="top" align="center"> <td align="center"> <form:form action="saveContact.do" method="post" commandName="newContact"> <table width="500" style="border-collapse: collapse;" border="0" bordercolor="#006699" cellspacing="2" cellpadding="2"> <tr> <td width="100" align="right">Name</td> <td width="150"> <form:input path="name"/></td> <td align="left"> <form:errors path="name" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">DOB</td> <td><form:input path="dob"/></td> <td align="left"><form:errors path="dob" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Gender</td> <td> <form:select path="gender"> <form:option value="M" label="Male"/> <form:option value="F" label="Female"/> </form:select> </td> <td> </td> </tr> <tr> <td width="100" align="right">Address</td> <td><form:input path="address"/></td> <td align="left"> <form:errors path="address" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Email</td> <td><form:input path="email"/></td> <td align="left"><form:errors path="email" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Mobile</td> <td><form:input path="mobile"/></td> <td align="left"> <form:errors path="mobile" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td colspan="3" align="center"> <input type="submit" name="" value="Save"> <input type="reset" name="" value="Reset"> <input type="button" value="Back" onclick="javascript:go('viewAllContacts.do');"> </td> </tr> </table> </form:form> </td> </tr></table></body></html>
c)editContact.jsp
<%@include file="taglib_includes.jsp" %><html><head> <script type="text/javascript" src="js/contacts.js"></script> <title><spring:message code="App.Title"></spring:message> </title></head><body style="font-family: Arial; font-size:smaller;"><table bgcolor="lightblue" width="750" height="500" align="center" style="border-collapse: collapse;" border="1" bordercolor="#006699" > <tr> <td align="center"><h3>Edit Contact Form</h3></td> </tr> <tr valign="top" align="center"> <td align="center"> <form:form action="updateContact.do" method="post" commandName="editContact"> <table width="500" style="border-collapse: collapse;" border="0" bordercolor="#006699" cellspacing="2" cellpadding="2"> <tr> <td width="100" align="right">Id</td> <td width="150"> <form:input path="id" readonly="true"/></td> <td align="left"> <form:errors path="id" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Name</td> <td> <form:input path="name"/></td> <td align="left"> <form:errors path="name" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">DOB</td> <td><form:input path="dob"/></td> <td align="left"><form:errors path="dob" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Gender</td> <td> <form:select path="gender"> <form:option value="M" label="Male"/> <form:option value="F" label="Female"/> </form:select> </td> <td> </td> </tr> <tr> <td width="100" align="right">Address</td> <td><form:input path="address"/></td> <td align="left"> <form:errors path="address" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Email</td> <td><form:input path="email"/></td> <td align="left"><form:errors path="email" cssStyle="color:red"></form:errors> </td> </tr> <tr> <td width="100" align="right">Mobile</td> <td><form:input path="mobile"/></td> <td align="left"> <form:errors path="mobile" cssStyle="color:red"></form:errors> </td> </tr> <tr valign="bottom"> <td colspan="3" align="center"> <input type="button" value="Delete" onclick="javascript:deleteContact('deleteContact.do?id=${editContact.id}');"> <input type="submit" name="" value="Save"> <input type="button" value="Back" onclick="javascript:go('viewAllContacts.do');"> </td> </tr> </table> </form:form> </td> </tr></table></body></html>
Step#13: 编写 javascript 文件 js/contacts.js 包含些公用的方法
function go(url){ window.location = url;}function deleteContact(url){ var isOK = confirm("Are you sure to delete?"); if(isOK) { go(url); }}
Step#14: 编写欢迎界面 index.jsp
<%response.sendRedirect("viewAllContacts.do");%>
Step#15: 启动服务器 并且在浏览器 地址栏中 键入http://localhost:8080/SpringMVCHibernate
- SpringMVC3+Hibernate+MySQL CRUD 小案例(翻译)
- hibernate之crud小案例
- Spring+Jersey+JPA+Hibernate+MySQL实现CRUD操作案例
- Hibernate-简单的crud案例
- hibernate 链接Mysql数据库小案例
- MySQL基本CRUD与简单案例
- hibernate 小案例
- springMVC3.2+spring3.2.4+hibernate 4.2.4+MySQL环境配置
- springmvc3+spring3+hibernate
- hibernate-MySQL配置文件及简单应用(CRUD)
- hibernate-MySQL配置文件及简单应用(CRUD)
- SpringMVC+Hibernate +MySql+ EasyUI实现CRUD
- SpringMVC3+Mybatis3(登录及CRUD操作)
- SpringMVC3+Mybatis3(登录及CRUD操作)
- MYSQL :小案例金山词霸
- hibernate---CRUD
- hibernate-CRUD
- 【Hibernate】crud
- 程序员技术练级攻略
- 4.5Fasade 外观模式
- 超时时间已到。超时时间已到,但是尚未从池中获取连接
- svn权限管理
- Java编程中“为了性能”要做的几点
- SpringMVC3+Hibernate+MySQL CRUD 小案例(翻译)
- zoj 树状数组经典 ( 未解)
- Java从网络读取图片并保存至本地 .
- cookie ,session,servletContext的区分
- __asm__ __volatile__("": : :"memory")
- OnInitialUpdate函数 UpdateAllViews函数 说明
- 界面闪烁以及图形重绘不彻底的另类原因
- STL vector 容器介绍
- JBoss配置二