搭建SpringMVC+Spring3+Hibernate4框架的maven專案
在建立之前確定電腦都安裝了eclipse、maven及eclipse外掛:
1.eclipse
2.maven
輸入 mvn -version 如果成功安裝 顯示下列資訊:
安裝成功之後再eclipse中顯示:
確定上述條件之後,開始建立專案:
1.首先建立一個maven型別的project
2.我們勾選上Create a simple project (不使用骨架) 我選擇的是預設的工作空間(可自行修改) next>>
3.填寫專案引數,Group Id : 專案id (com.pengtu) , Artifact Id:專案名稱 (SpringMvc) , version:版本號,預設值就可以了,packaging:打包的格式,有jar、war等格式,我一般選擇war形式
4.建立好之後的專案結構圖如下,由於packing選擇的是war包 所以建立的專案中會有 webapp資料夾
5.由於我們的專案要使用eclipse釋出到tomcat下面,這裡我們需要先把專案轉成dynamic web project
在我們的專案上點選右鍵,選擇properties 並找到 Project Facets ,並點選Convert to faceted form… 如下圖:
然後勾選Dynamic Web Module 並點選ok 如下圖:(3.0只有tomcat7才支援)
點選ok之後 專案結構中會多出來一個web
content目錄,沒有出現也屬於正常,影響不大;
雖然此時專案可以釋出到tomcat中,但是不符合maven的結構,我們還需要做修改。如果上面有webcontent資料夾,把WebContent下面兩個目錄 META-INF ,WEB-INF 直接剪下到src/main/webapp目錄下,如果沒有該資料夾,直接在webapp資料夾下建立 WEB-INF資料夾,META-INF 可以不建立
然後我們要修改釋出規則,右鍵點選專案, 選擇 Deployment Assembly
選擇WebContent,把它remove掉,測試類我們也不需要釋出,test的兩個目錄頁可以remove
接著重新指定一個web的路徑,點選add,選擇Folder -- 〉 next
在src下找到webapp目錄,然後finish
最後一步,我們要把當前的build path 指向 Maven Dependency, 直接點選add,選擇Java Build Path Entries 然後next
最後的結構為:
至此一個基於maven的webapp就建立好了,並可以直接從eclipse中釋出到tomcat中
6.、完成以上步驟,我們的工程就是一個Web專案了,編寫pom.xml檔案,引入所需的包依賴,我這裡就將所需的全部的映入,maven會自動下載裡面定義的jar包及其所依賴的包 這就是maven的好處,如果下載完之後專案上有紅色的叉叉,右鍵專案,mavne》》 updae project 就ok了
<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>com.pengtu</groupId>
<artifactId>SpringMvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.compiler>1.7</java.compiler>
<slf4j.version>1.6.4</slf4j.version>
<logback.version>1.0.1</logback.version>
<log4j.version>1.2.17</log4j.version>
<jackson.version>2.5.0</jackson.version>
<jdbc.driver.groupId>mysql</jdbc.driver.groupId>
<jdbc.driver.artifactId>mysql-connector-java</jdbc.driver.artifactId>
<jdbc.driver.version>5.1.19</jdbc.driver.version>
<spring.version>3.2.3.RELEASE</spring.version>
<spring-asm.version>3.1.4.RELEASE</spring-asm.version>
<hibernate.version>4.2.5.Final</hibernate.version>
<aspectj.version>1.6.8</aspectj.version>
<cglib.version>2.2</cglib.version>
<servlet.version>2.5</servlet.version>
<jsp.version>2.1</jsp.version>
<jstl.version>1.2</jstl.version>
<taglibs-standard.version>1.1.2</taglibs-standard.version>
<maven.compiler.plugin>2.3.2</maven.compiler.plugin>
<maven.failsafe.plugin>2.4.3-alpha-1</maven.failsafe.plugin>
</properties>
<dependencies>
<dependency>
<groupId>junit </groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- WEB START -->
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${taglibs-standard.version}</version>
</dependency>
<!-- WEB END -->
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 檔案上傳 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<!-- fastJson json陣列有關的 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
<!-- json -->
<!-- 使用 Jackson 把 Java 物件轉換成 JSON 字串 -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>jackson-module-hibernate</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.1.1</version>
</dependency>
<dependency>
<groupId>org.json.simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20080701</version>
<scope>compile</scope>
</dependency>
<!-- oracle 資料庫驅動 -->
<dependency>
<groupId>${jdbc.driver.groupId}</groupId>
<artifactId>${jdbc.driver.artifactId}</artifactId>
<version>${jdbc.driver.version}</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
<!-- aspectjweaver.jar這是Spring AOP所要用到的包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.1</version>
</dependency>
<!-- hibernate4 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<!-- <dependency> -->
<!-- <groupId>net.sf.ehcache</groupId> -->
<!-- <artifactId>ehcache</artifactId> -->
<!-- <version>2.10.2</version> -->
<!-- </dependency> -->
<!-- spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring3 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring security begin 安全框架 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0</version>
</dependency>
<!-- spring security end -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.12</version>
</dependency>
<!-- utils begin 一些基本的幫助類 -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
<!-- excel 功能 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-core</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>net.sf.jxls</groupId>
<artifactId>jxls-reader</artifactId>
<version>1.0</version>
</dependency>
<!-- excel 功能 -->
<dependency>
<groupId>jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>jfree</groupId>
<artifactId>jcommon</artifactId>
<version>1.0.16</version>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
<!-- pdf功能 -->
<dependency>
<groupId>com.jacob</groupId>
<artifactId>com-jacob</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>2.4.2</version>
</dependency>
<!-- zip -->
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin}</version>
<configuration>
<source>${java.compiler}</source>
<target>${java.compiler}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>failsafe-maven-plugin</artifactId>
<version>${maven.failsafe.plugin}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0-beta-1</version>
<configuration>
<uriEncoding>utf-8</uriEncoding>
<port>8085</port>
<path>/gsj</path>
<server>tomcat</server>
</configuration>
</plugin>
</plugins>
</build>
</project>
7.引入Spring配置
編寫配置檔案,配置檔案放在src/main/resources資源目錄下(下同)。
專案所需的配置資訊config.properties和hibernate.properties
config.properties:
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
driverClassName=com.mysql.jdbc.Driver
validationQuery=SELECT 1 FROM DUAL
jdbc_url=jdbc:mysql://*****:3306/springMvc?useUnicode=true&characterEncoding=utf-8
jdbc_username=***
jdbc_password=******
hibernate.properties:hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.format_sql=true
sessionInfoName=sessionInfo
uploadFieldName=filedata
uploadFileMaxSize=20971520
uploadFileExts=txt,rar,zip,doc,docx,xls,xlsx,jpg,jpeg,gif,png,swf,wmv,avi,wma,mp3,mid
uploadDirectory=attached
spring配置
<?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" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<!-- 引入屬性檔案 -->
<context:property-placeholder location="classpath:config.properties,classpath:hibernate.properties" />
<!-- 自動掃描dao和service包(自動注入) -->
<context:component-scan base-package="com.pengtu.springMvc.dao,com.pengtu.springMvc.service" />
</beans>
上面spring配置了對應包下元件bean自動注入管理,我們需要將dao,service的實現類交由spring管理,如(@Repository,@Service)8.引入日誌檔案配置Log4j:
log4j.rootLogger=DEBUG,console,FILE
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.Append=true
log4j.appender.FILE.File=E\:/SpringMvclogs/springMvc.log
log4j.appender.FILE.Threshold=INFO
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.FILE.MaxFileSize=10MB
Hibernate配置
Hibernate的配置主要包括:配置資料來源Druid,配置SessionFactory,配置事務管理器,配置事務管理,其spring-hibernate.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:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!-- JNDI(通過Tomcat)方式配置資料來源 -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndiName}"></property> </bean> -->
<!-- 配置資料來源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_username}" />
<property name="password" value="${jdbc_password}" />
<!-- 初始化連線大小 -->
<property name="initialSize" value="0" />
<!-- 連線池最大使用連線數量 -->
<property name="maxActive" value="20" />
<!-- 連線池最小空閒 -->
<property name="minIdle" value="0" />
<!-- 獲取連線最大等待時間 -->
<property name="maxWait" value="60000" />
<!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> -->
<property name="validationQuery" value="${validationQuery}" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />
<!-- 開啟removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分鐘 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 關閉abanded連線時輸出錯誤日誌 -->
<property name="logAbandoned" value="true" />
<!-- 監控資料庫 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat" />
</bean>
<!-- 配置hibernate session工廠 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache/ehcache-hibernate-local.xml</prop>
<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>
<!-- 自動掃描註解方式配置的hibernate類檔案 -->
<property name="packagesToScan">
<list>
<value>com.pengtu.springMvc.entity</value>
</list>
</property>
</bean>
<!-- 配置事務管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 註解方式配置事務 -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
上面配置了二級快取,ehcache,相關的具體資訊檢視上一篇Hibernate二級快取以及ehcache的搭建配置,下面是二級快取的配置。10 生成業務entity實體 AcctUser.java 在這之前要建立好檔案目錄 如圖:
package com.pengtu.springMvc.entity;
// Generated 2015-2-3 10:43:00 by Hibernate Tools 4.0.0
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
/**
* AcctUser generated by hbm2java
*/
@Entity
@Table(name = "acct_user", catalog = "springMvc")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AcctUser implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 6980093847795726310L;
private String id;
private String nickName;
private String telephone;
private Date registerTime;
private Set<AcctRole> acctRoles = new HashSet<AcctRole>(0);
public AcctUser() {
}
public AcctUser(String id, String nickName) {
this.id = id;
this.nickName = nickName;
}
public AcctUser(String id, String nickName, String telephone,
Date registerTime, Set<AcctRole> acctRoles) {
this.id = id;
this.nickName = nickName;
this.telephone = telephone;
this.registerTime = registerTime;
this.acctRoles = acctRoles;
}
@Id
@Column(name = "id", unique = true, nullable = false, length = 36)
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
@Column(name = "nick_name", nullable = false)
public String getNickName() {
return this.nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Column(name = "telephone")
public String getTelephone() {
return this.telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "register_time", length = 19)
public Date getRegisterTime() {
return this.registerTime;
}
public void setRegisterTime(Date registerTime) {
this.registerTime = registerTime;
}
@JsonIgnoreProperties(value={"acctUsers", "acctAuthorities"})
@ManyToMany(fetch = FetchType.LAZY)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@JoinTable(name = "acct_user_role", catalog = "springMvc", joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
public Set<AcctRole> getAcctRoles() {
return this.acctRoles;
}
public void setAcctRoles(Set<AcctRole> acctRoles) {
this.acctRoles = acctRoles;
}
}
另外兩個實體類沒有寫出來。
11. 建立Dao層
Dao層和Service層我們肯定採用的是面相介面程式設計的思想,所以,我們先定義一個通用的Dao介面,GenericDao.java
package com.pengtu.springMvc.dao;
import java.io.Serializable;
import java.util.List;
/**
* 建立時間:2015-2-6 下午2:26:42
*
* @author andy
* @version 2.2
*
* Dao通用介面
*/
interface GenericDao<T, PK extends Serializable> {
T load(PK id);
T get(PK id);
List<T> findAll();
void persist(T entity);
PK save(T entity);
void saveOrUpdate(T entity);
void delete(PK id);
void flush();
}
在定義具體的UserDao.java介面package com.pengtu.springMvc.dao;
import com.pengtu.springMvc.entity.AcctUser;
/**
* 建立時間:2015-2-6 下午2:43:50
*
* @author andy
* @version 2.2
*
* 使用者Dao介面
*/
public interface UserDao extends GenericDao<AcctUser, String> {
}
Dao層實現類
我們需要將Dao層的實現類注入為bean,所以需要新增@Repository註解,UserDaoImpl如下package com.pengtu.springMvc.dao.impl;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.pengtu.springMvc.dao.UserDao;
import com.pengtu.springMvc.entity.AcctUser;
/**
* 建立時間:2015-2-6 下午2:45:14
*
* @author andy
* @version 2.2
*/
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession() {
return this.sessionFactory.getCurrentSession();
}
@Override
public AcctUser load(String id) {
return (AcctUser) this.getCurrentSession().load(AcctUser.class, id);
}
@Override
public AcctUser get(String id) {
return (AcctUser) this.getCurrentSession().get(AcctUser.class, id);
}
@SuppressWarnings("unchecked")
@Override
public List<AcctUser> findAll() {
List<AcctUser> acctUsers = this.getCurrentSession().createQuery("from AcctUser").setCacheable(true).list();
return acctUsers;
}
@Override
public void persist(AcctUser entity) {
this.getCurrentSession().persist(entity);
}
@Override
public String save(AcctUser entity) {
return (String) this.getCurrentSession().save(entity);
}
@Override
public void saveOrUpdate(AcctUser entity) {
this.getCurrentSession().saveOrUpdate(entity);
}
@Override
public void delete(String id) {
AcctUser entity = this.load(id);
this.getCurrentSession().delete(entity);
}
@Override
public void flush() {
this.getCurrentSession().flush();
}
}
12 建立Service層
Service層介面
package com.pengtu.springMvc.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pengtu.springMvc.dao.UserDao;
import com.pengtu.springMvc.entity.AcctUser;
import com.pengtu.springMvc.service.UserService;
/**
* 建立時間:2015-2-6 下午3:24:16
*
* @author andy
* @version 2.2 UserService 的實現
*/
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public AcctUser load(String id) {
return userDao.load(id);
}
@Override
public AcctUser get(String id) {
return userDao.get(id);
}
@Override
public List<AcctUser> findAll() {
return userDao.findAll();
}
@Override
public void persist(AcctUser entity) {
userDao.persist(entity);
}
@Override
public String save(AcctUser entity) {
return userDao.save(entity);
}
@Override
public void saveOrUpdate(AcctUser entity) {
userDao.saveOrUpdate(entity);
}
@Override
public void delete(String id) {
userDao.delete(id);
}
@Override
public void flush() {
userDao.flush();
}
}
service層實現類
package com.pengtu.springMvc.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.pengtu.springMvc.dao.UserDao;
import com.pengtu.springMvc.entity.AcctUser;
import com.pengtu.springMvc.service.UserService;
/**
* 建立時間:2015-2-6 下午3:24:16
*
* @author andy
* @version 2.2 UserService 的實現
*/
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public AcctUser load(String id) {
return userDao.load(id);
}
@Override
public AcctUser get(String id) {
return userDao.get(id);
}
@Override
public List<AcctUser> findAll() {
return userDao.findAll();
}
@Override
public void persist(AcctUser entity) {
userDao.persist(entity);
}
@Override
public String save(AcctUser entity) {
return userDao.save(entity);
}
@Override
public void saveOrUpdate(AcctUser entity) {
userDao.saveOrUpdate(entity);
}
@Override
public void delete(String id) {
userDao.delete(id);
}
@Override
public void flush() {
userDao.flush();
}
}
13.測試Spring和Hibernate的整合
我們可以在src/test/java編寫測試類,測試上面的配置,如果測試成功已經基本大功告成。
package com.pengtu.springMvc;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.fastjson.JSON;
import com.pengtu.springMvc.entity.AcctUser;
import com.pengtu.springMvc.service.UserService;
/**
* 建立時間:2015-2-6 下午3:31:07
*
* @author andy
* @version 2.2
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring.xml",
"classpath:spring-hibernate.xml" })
public class TestUserService {
private static final Logger LOGGER = Logger
.getLogger(TestUserService.class);
@Autowired
private UserService userService;
@Test
public void save() {
AcctUser acctUser = new AcctUser();
acctUser.setId(UUID.randomUUID().toString());
acctUser.setNickName("andy");
acctUser.setRegisterTime(new Date());
acctUser.setTelephone("13022221111111233");
String id = userService.save(acctUser);
LOGGER.info(JSON.toJSONString(id));
}
}
可以檢視資料庫的記錄 是否成功14.引入SpringMVC
根據配置檔案,要在WEB-INF下面建立views資料夾
新增spring-mvc.xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 註解掃描包 -->
<context:component-scan base-package="com.pengtu.springMvc.controller" />
<!-- 開啟mvc註解 -->
<mvc:annotation-driven />
<!-- JSP檢視解析器-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
<!-- prefix和suffix:查詢檢視頁面的字首和字尾(字首[邏輯檢視名]字尾),
比如傳進來的邏輯檢視名為hello,則該該jsp檢視頁面應該存放在“WEB-INF/views/hello.jsp” -->
</bean>
<!-- 上傳檔案時需要做的配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760000" />
<property name="maxInMemorySize" value="40960" />
</bean>
</beans>
15 配置web.xml容器
注意 web.xml中
版本號要與 Dynamic web module相對應 不然會報錯
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>springMvc</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml,classpath:spring-hibernate.xml</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- openSessionInView配置 作用是延遲session關閉到view層 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 監聽servletContext,啟動contextConfigLocation中的spring配置資訊 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止spring記憶體溢位監聽器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<servlet>
<description>spring mvc servlet</description>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 此處配置的是SpringMVC的配置檔案 -->
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>*.htmls</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.htmls</url-pattern>
</filter-mapping>
<!-- 配置session超時時間,單位分鐘 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
新增 index.jsp16 建立控制層Controller
控制層UserController
package com.pengtu.springMvc.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.pengtu.springMvc.entity.AcctUser;
import com.pengtu.springMvc.service.UserService;
/**
* @author zl
* @version 建立時間:2017年3月22日 下午6:19:04
* 類說明
*/
@Controller
@RequestMapping("/user")
public class UserController {
private static final Logger LOGGER = Logger.getLogger(UserController.class);
@Autowired
private UserService userService;
@RequestMapping("/showInfo")
public String showUserInfo(ModelMap modelMap,HttpServletRequest request){
String userId = request.getParameter("userId");
System.out.println("id:"+userId);
LOGGER.info("查詢使用者:" + userId);
AcctUser userInfo = userService.load(userId);
modelMap.addAttribute("nickName", "success.....");
return "/user/showInfo";
}
@RequestMapping("/showInfos")
public @ResponseBody List<AcctUser> showUserInfos(){
LOGGER.info("查詢使用者全部使用者");
List<AcctUser> userInfos = userService.findAll();
return userInfos;
}
}
17.建立檢視層
在src/main/webapp/WEB-INF/views下 建立user/showInfo.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
1111${nickName}
</body>
</html>
18 部署伺服器測試
訪問地址:http://localhost:9901/SpringMvc/user/showInfo.do?userId=24081003-9d82-4249-bcf8-3fcddfe12183
結果圖:
至此spring3+Hibernate+springMvc+maven專案框架的搭建就結束了,裡面還有很多細節需要各位自己去補,配置檔案的部分註解已經包含在裡面了,還是比較完善了,對於專案的原始碼 可以從我的網盤去下載 ,連結: https://pan.baidu.com/s/1nuQu7qx 密碼: mzx4
系統中還有很多東西需要整合 比如:安全框架:spring-security ;測試框架: mockMvc ; api介面規範: swaggger及swagger UI ; 裝飾器 ;durid資料來源等等,這些內容會在接下來的文章中陸續講到。
如需轉載,請註明出處! 謝謝各位的支援!