使用Spring的Hibernate构建Java Web应用程序
這篇文章將展示如何在Spring環(huán)境中使用帶有Hibernate ORM的MYSQL DB創(chuàng)建學(xué)生注冊(cè)應(yīng)用程序。 這是一個(gè)簡(jiǎn)單的應(yīng)用程序,旨在在注冊(cè)期間從用戶收集輸入詳細(xì)信息,將詳細(xì)信息保存在MYSQL DB中,并在登錄期間對(duì)它們進(jìn)行身份驗(yàn)證。
1.使用Maven模板創(chuàng)建Java Web應(yīng)用程序項(xiàng)目
首先,在IDE中,通過(guò)為項(xiàng)目的GroupId和Artifact Id提供適當(dāng)?shù)闹?#xff0c;使用maven-archetype-webapp模板創(chuàng)建Java Maven項(xiàng)目(基于字符串“ webapp”過(guò)濾目錄)。 下面顯示了示例Web應(yīng)用程序目錄結(jié)構(gòu),其中包含標(biāo)準(zhǔn)部署描述符web.xml和Maven pom.xml。
2.更新pom.xml
為了使上述Maven Java Web Application項(xiàng)目在Spring框架中支持Hibernate ORM,請(qǐng)將以下依賴項(xiàng)添加到現(xiàn)有pom.xml中
- jstl,spring-webmvc和servlet-api(用于Spring支持)
- mysql-connector-java(用于MYSQL支持)
- spring-jdbc(用于通過(guò)JDBC Spring進(jìn)行數(shù)據(jù)訪問(wèn))
- spring-orm(用于使用Spring進(jìn)行ORM數(shù)據(jù)訪問(wèn))
- spring-data-jpa(用于JPA支持)
- hibernate-validator和hibernate-entitymanager(用于Hibernate支持)
- jta(用于事務(wù)支持)
3.修改web.xml
修改web.xml的內(nèi)容以包括以下內(nèi)容:
- 一個(gè)servlet,并為其指定配置文件的位置。 在此示例中,在項(xiàng)目布局的WEB-INF / config文件夾下創(chuàng)建了一個(gè)名為springConfig.xml的配置文件。
- Servlet映射,以映射在上一步中創(chuàng)建的servlet,當(dāng)客戶端指定與url模式匹配的url時(shí)應(yīng)調(diào)用該servlet。
- 一個(gè)ContextLoaderListener,用于將spring與Web應(yīng)用程序集成,并提供contextConfigLocation用于JPA的上下文文件。
4.創(chuàng)建Spring配置文件
在文件夾WEB-INF / config下創(chuàng)建一個(gè)Spring Bean配置文件。 如果STS(Spring Tool Suite)是IDE,請(qǐng)繼續(xù)并啟用上下文和mvc命名空間。 servletConfig.xml將如下所示
<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"></beans>啟用所需的名稱空間后,包括以下內(nèi)容(在<beans>和</ beans>標(biāo)記之間),以指示該應(yīng)用程序是注釋驅(qū)動(dòng)的,并且是上下文組件掃描的基本包。
<mvc:annotation-driven /><context:component-scan base-package="com.github.elizabetht" />包括Spring的bean InternalResourceViewResolver以查找jsp文件
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /> </bean>包括用于指定屬性文件的Bean(稍后將對(duì)此進(jìn)行詳細(xì)介紹),該文件將用于存儲(chǔ)自定義消息或?qū)傩浴?通過(guò)以下配置,可以在項(xiàng)目的src / main / resources文件夾下創(chuàng)建一個(gè)名為messages.properties的屬性文件。
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basename" value="messages" /> </bean>5.創(chuàng)建persistence.xml
在項(xiàng)目的src / main / resources / META-INF文件夾下創(chuàng)建一個(gè)名為persistence.xml的文件,以定義JPA所需的持久性單元。 將以下內(nèi)容添加到persistence.xml中,以定義名為punit的持久性單元。
<persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="{http://java.sun.com/xml/ns/persistence} {http://java.sun.com/xml/ns/persistence_2_0.xsd}"version="2.0"><persistence-unit name="punit"></persistence-unit></persistence>6.創(chuàng)建jpaContext.xml
按照web.xml中的定義,在項(xiàng)目的src / main / resources文件夾下創(chuàng)建一個(gè)名為jpaContext.xml的文件,以定義JPA和Hibernate相關(guān)的配置。 請(qǐng)注意,在Maven項(xiàng)目中src / main / resources文件夾下創(chuàng)建的任何文件都會(huì)由Maven自動(dòng)添加到類路徑中。 如果STS(Spring Tool Suite)是IDE,請(qǐng)繼續(xù)啟用context,jpa和tx命名空間。 jpaContext.xml將如下所示
<?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:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"><beans>啟用所需的名稱空間后,包括以下內(nèi)容(在<beans>和</ beans>標(biāo)記之間),以指示該應(yīng)用程序是注釋驅(qū)動(dòng)的,并且是jpa存儲(chǔ)庫(kù)掃描的基本包。
<context:annotation-config /><jpa:repositories base-package="com.github.elizabetht.repository" />接下來(lái),包括bean PersistenceAnnotationBeanPostProcessor。 這對(duì)于處理持久性單元,持久性上下文注釋以及注入與JPA相關(guān)的資源是必需的。
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />包括EntityManagerFactory的bean,該bean列出了各種與JPA相關(guān)的屬性/資源。
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="persistenceUnitName" value="punit" /><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"><property name="showSql" value="true" /></bean></property><property name="jpaPropertyMap"><map><entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /><entry key="hibernate.hbm2ddl.auto" value="validate" /><entry key="hibernate.format_sql" value="true" /></map></property></bean>包括用于數(shù)據(jù)源的bean,可以在其中指定MYSQL DB的屬性,例如url,用戶名和密碼。 將<include connection url>替換為用于連接到MYSQL DB的實(shí)際連接URL。 同樣,將<include username>和<include password>替換為實(shí)際的用戶名和密碼值。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql//<include connection url>:3306/studentEnrollment?autoReconnect=true&createDatabaseIfNotExist=true&" /><property name="username" value="<include username>" /><property name="password" value="<include password>" /> </bean>包括用于事務(wù)管理器的Bean,用于范圍/控制事務(wù)。
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /> </bean><tx:annotation-driven transaction-manager="transactionManager" />從而結(jié)束了jpaContext.xml中的長(zhǎng)配置
7.創(chuàng)建用于學(xué)生注冊(cè)/登錄的JSP文件
在WEB-INF下創(chuàng)建一個(gè)名為“ jsp”的文件夾(在該文件夾中,如InternalResourceViewResolver bean的servletConfig.xml中所示,在其中創(chuàng)建jsp文件)。
創(chuàng)建一個(gè)文件signup.jsp以包含一個(gè)表單,以獲取輸入詳細(xì)信息,例如學(xué)生的UserName,Password,FirstName,LastName,DateOfBirth和EmailAddress。 注冊(cè)頁(yè)面的快照如下:
接下來(lái),創(chuàng)建一個(gè)文件login.jsp以包含帶有用戶名和密碼的表單。 登錄頁(yè)面的快照如下:
還要?jiǎng)?chuàng)建success.jsp來(lái)指示登錄成功,并創(chuàng)建failure.jsp來(lái)指示登錄失敗(這些只是用于顯示內(nèi)容的頁(yè)面-不涉及處理邏輯)。
此應(yīng)用程序使用twitter bootstrap http://getbootstrap.com/和http://bootswatch.com/united/作為樣式表。 它還使用日期選擇器樣式表在“學(xué)生注冊(cè)”頁(yè)面( http://www.eyecon.ro/bootstrap-datepicker/ )中為DateOfBirth字段彈出日歷。
可以在https://github.com/elizabetht/StudentEnrollmentWithSpring/tree/master/src/main/webapp中找到此應(yīng)用程序的webapp文件夾下的文件的參考鏈接。
8.為Controller,Model,Repository和Service層類創(chuàng)建包
在src / main / java文件夾下為Spring Controller,Model,Repository和Service類分別創(chuàng)建軟件包。
包創(chuàng)建后的項(xiàng)目示例快照如下所示:
9.創(chuàng)建模型層的類
在包c(diǎn)om.github.elizabetht.model內(nèi)創(chuàng)建一個(gè)名為Student.java的POJO類,以在注冊(cè)過(guò)程中包含Student模型實(shí)體的詳細(xì)信息。 在同一個(gè)包c(diǎn)om.github.elizabetht.model中創(chuàng)建另一個(gè)名為StudentLogin.java的POJO類,以包含Student Login詳細(xì)信息。
可以在https://github.com/elizabetht/StudentEnrollmentWithSpring/tree/master/src/main/java/com/github/elizabetht/model中找到到Model類文件的參考鏈接。
10.為存儲(chǔ)庫(kù)層創(chuàng)建類
在com.github.elizabetht.repository包內(nèi)創(chuàng)建一個(gè)名為StudentRepository.java的接口類,以支持存儲(chǔ)庫(kù)層數(shù)據(jù)庫(kù)操作。
為了應(yīng)用程序的目的,需要兩種接口方法。
- 將學(xué)生注冊(cè)詳細(xì)信息插入數(shù)據(jù)庫(kù)
- 從數(shù)據(jù)庫(kù)驗(yàn)證學(xué)生登錄詳細(xì)信息
Hibernate實(shí)現(xiàn)支持save()方法,因此數(shù)據(jù)插入不需要單獨(dú)的SQL語(yǔ)句。
11.創(chuàng)建服務(wù)層的類
在包c(diǎn)om.github.elizabetht.service中創(chuàng)建一個(gè)名為StudentService.java的接口類,以支持服務(wù)層操作。
public interface StudentService {Student save(Student student);boolean findByLogin(String userName, String password);boolean findByUserName(String userName); }在包c(diǎn)om.github.elizabetht.service中創(chuàng)建一個(gè)名為StudentServiceImpl.java的服務(wù)層實(shí)現(xiàn)類(實(shí)際上是POJO)。 這就是應(yīng)用程序邏輯的用途–將學(xué)生的詳細(xì)信息保存到數(shù)據(jù)庫(kù)中,或者從數(shù)據(jù)庫(kù)中驗(yàn)證學(xué)生的(已保存)詳細(xì)信息。
@Service("studentService") public class StudentServiceImpl implements StudentService {@Autowiredprivate StudentRepository studentRepository;@Transactionalpublic Student save(Student student) {return studentRepository.save(student);}public boolean findByLogin(String userName, String password) { Student stud = studentRepository.findByUserName(userName);if(stud != null && stud.getPassword().equals(password)) {return true;} return false; }public boolean findByUserName(String userName) {Student stud = studentRepository.findByUserName(userName);if(stud != null) {return true;}return false;}}12.創(chuàng)建控制器層的類
在包c(diǎn)om.github.elizabetht.controller中創(chuàng)建一個(gè)名為StudentController.java的控制器層POJO類。 這就是應(yīng)用程序的路由邏輯的去向–無(wú)論是調(diào)用注冊(cè)還是登錄操作。
@Controller @SessionAttributes("student") public class StudentController {@Autowiredprivate StudentService studentService;@RequestMapping(value="/signup", method=RequestMethod.GET)public String signup(Model model) {Student student = new Student(); model.addAttribute("student", student); return "signup";}@RequestMapping(value="/signup", method=RequestMethod.POST)public String signup(@Valid @ModelAttribute("student") Student student, BindingResult result, Model model) { if(result.hasErrors()) {return "signup";} else if(studentService.findByUserName(student.getUserName())) {model.addAttribute("message", "User Name exists. Try another user name");return "signup";} else {studentService.save(student);model.addAttribute("message", "Saved student details");return "redirect:login.html";}}@RequestMapping(value="/login", method=RequestMethod.GET)public String login(Model model) { StudentLogin studentLogin = new StudentLogin(); model.addAttribute("studentLogin", studentLogin);return "login";}@RequestMapping(value="/login", method=RequestMethod.POST)public String login(@Valid @ModelAttribute("studentLogin") StudentLogin studentLogin, BindingResult result) {if (result.hasErrors()) {return "login";} else {boolean found = studentService.findByLogin(studentLogin.getUserName(), studentLogin.getPassword());if (found) { return "success";} else { return "failure";}}} }13.創(chuàng)建messages.properties文件
如上所示,@ Valid批注用于驗(yàn)證到達(dá)方法的表單的輸入?yún)?shù),并將驗(yàn)證結(jié)果存儲(chǔ)在BindingResult對(duì)象中。 為了驗(yàn)證特定字段(請(qǐng)參閱為模型層創(chuàng)建的類– https://github.com/elizabetht/StudentEnrollmentWithSpring/tree/master/src/main/java/com/github/elizabetht/model ),請(qǐng)使用注釋像@ NotEmpty,@ Size,@ Email和@NotNull,它們來(lái)自Hibernate Validator的各種驗(yàn)證。
在messages.properties文件中指定了當(dāng)上述任何一個(gè)驗(yàn)證器失敗時(shí)應(yīng)顯示的定制消息。 在src / main / resources文件夾下創(chuàng)建一個(gè)名為messages.properties的文件,并包含以下內(nèi)容
NotEmpty=Field cannot be blank NotNull=Field cannot be blankEmail=Email Address not valid/well-formed Past=Date of Birth must be in the past Size={0} must be between {2} and {1} characters long typeMismatch=Invalid format14.在MYSQL數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)模式
連接到將用于此應(yīng)用程序的MySQL數(shù)據(jù)庫(kù),并使用MySQL Workbench創(chuàng)建一個(gè)名為StudentEnrollment的新數(shù)據(jù)庫(kù)架構(gòu)。 這是必需的,因?yàn)樵趈paContext.xml的dataSource bean中指定了StudentEnrollment的數(shù)據(jù)庫(kù)模式名稱。
一旦創(chuàng)建了StudentEnrollment DB Schema,就可以使用CREATE TABLE語(yǔ)句在DB Schema中創(chuàng)建一個(gè)名為Student的表,如下所示:
CREATE TABLE `student` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`dateOfBirth` datetime NOT NULL,`emailAddress` varchar(255) NOT NULL,`firstName` varchar(255) NOT NULL,`lastName` varchar(255) NOT NULL,`password` varchar(8) NOT NULL,`userName` varchar(20) NOT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=latin1;15.在Tomcat服務(wù)器上部署應(yīng)用程序
完成上述步驟并成功構(gòu)建項(xiàng)目后,即可準(zhǔn)備將Java Web應(yīng)用程序部署在Tomcat Server 7上。
右鍵單擊項(xiàng)目,然后選擇“運(yùn)行方式->在服務(wù)器上運(yùn)行”選項(xiàng),可以將Java Web應(yīng)用程序本地部署。
通過(guò)將WAR文件(右鍵單擊項(xiàng)目并選擇“導(dǎo)出為WAR文件”選項(xiàng))復(fù)制到/ var / lib / tomcat7文件夾(或適當(dāng)?shù)膖omcat目錄),然后重新啟動(dòng)tomcat,可以在支持Tomcat的任何本機(jī)服務(wù)器上遠(yuǎn)程部署該文件。服務(wù)器。
此應(yīng)用程序可在此處進(jìn)行演示: http : //ec2-23-20-137-135.compute-1.amazonaws.com : 8080/StudentEnrollmentWithSpring/
16.克隆或下載代碼
如果使用git,請(qǐng)?jiān)诖颂幙寺≡擁?xiàng)目的副本: https : //github.com/elizabetht/StudentEnrollmentWithSpring.git
如果不使用git,請(qǐng)?jiān)诖颂幰訸IP或tar.gz文件下載項(xiàng)目: https : //github.com/elizabetht/StudentEnrollmentWithSpring/releases/tag/1.6
翻譯自: https://www.javacodegeeks.com/2014/03/building-java-web-application-using-hibernate-with-spring.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的使用Spring的Hibernate构建Java Web应用程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 进口品备案查询(进口品备案)
- 下一篇: 使用不可序列化的属性序列化Java对象