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