在创建之前确定电脑都安装了eclipse、maven及eclipse插件:
1.eclipse
2.maven
输入 mvn -version 如果成功安装 显示下列信息:
3.maven插件 地址:http://download.eclipse.org/technology/m2e/releases
安装成功之后再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层实现类
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();
}
}
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;
}
}
在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数据源等等,这些内容会在接下来的文章中陆续讲到。
如需转载,请注明出处! 谢谢各位的支持!