Изучить любой веб-фреймворк, начиная с приложения HelloWorld, — хорошая идея. Как только вы ознакомитесь с конфигурацией фреймворка, лучше создать приложение CRUD (создание, чтение, обновление, удаление), которое охватывает различные аспекты веб-фреймворка, такие как проверка, сопоставления URL-адресов запроса, привязка параметров запроса, предварительное заполнение форм и т. Д. .
Теперь я собираюсь объяснить , как написать простое приложение CRUD с помощью SpringMVC3, Hibernate и MySQL.
Наше приложение является ContactsManagement, где вы можете просматривать или искать контакты, создавать новые контакты, редактировать или удалять существующие контакты.
Шаг № 1: Создать таблицу КОНТАКТОВ
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));
Шаг № 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>
Шаг № 3: Настройка SpringMVC
а) Настройте DispatcherServlet в 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>
б) Настройте View Resolver в WEB-INF / dispatcher-servlet.xml
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/jsp/" p:suffix=".jsp"> </bean>
c) Настройка поддержки аннотаций, PropertyPlaceHolderConfigurer, ResourceBundleMessageSource в 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>
Шаг № 4: Настройте параметры соединения JDBC и свойства 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
Шаг № 5: Настройте DataSource, SessionFactory, поддержку TransactionManagement в 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>
Шаг № 6: Настройте метки, сообщения об ошибках в WEB-INF / classes / Messages.properties
App.Title=SivaLabstypeMismatch.java.util.Date={0} is Invalid Date.dob=DOB
Шаг № 7: Создайте класс Entity 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 }
Шаг № 8: Создайте ContactsDAO.java, который выполняет операции CRUD над таблицей 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); }}
Шаг № 9: Создайте ContactFormValidator.java, который выполняет проверки при сохранении / обновлении контакта.
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."); }}
Шаг № 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; } }
Шаг № 11: Вместо записи описаний библиотеки тегов JSTL во всех JSP, объявите их в одной 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"%>
Шаг № 12: Создайте JSP.
а) 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>
б) 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>
Шаг № 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); }}
Шаг № 14: Приветственный файл index.jsp
<%response.sendRedirect("viewAllContacts.do");%>
Шаг № 15 : Запустите сервер и укажите URL вашего браузера на http: // localhost: 8080 / SpringMVCHibernate
От: http://sivalabs.blogspot.com/2011/04/springmvc3-hibernate-crud-sample.html