1. 程式人生 > >搭建SpringMVC+Spring3+Hibernate4框架的maven專案

搭建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.jsp

16 建立控制層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資料來源等等,這些內容會在接下來的文章中陸續講到。

如需轉載,請註明出處! 謝謝各位的支援!