第一步:新建Web Project
1.勾选Add Maven support,添加Maven的支持
2.点击两次Next,勾选Generate web.xml,生成web.xml配置文件。
3.点击一次Next,选择Standard Maven JEE,标准的JEEMaven工程。
4.点击Finish完成工程的创建,工程的目录如下。
第二步:添加pom.xml文件的maven依赖包
1. properties节点下,定义三大框架以及其他一些jar包的版本属性
<commons.version>1.2</commons.version>
<mysql.version>5.1.39</mysql.version>
<c3p0.version>0.9.2.1</c3p0.version>
<hibernate.version>5.2.10.Final</hibernate.version>
<hibernate.validator.version>5.4.0.Final</hibernate.validator.version>
<spring.version>4.3.3.RELEASE</spring.version>
<log.version>1.2.17</log.version>
<junit.version>4.12</junit.version>
2. dependencies节点下,添加三大框架以及其他jar包的依赖,除了三大框架以为,其他jar包根据自己的需要添加。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>${commons.version}</version>
</dependency>
<!-- Hibernate start -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.validator.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Hibernate end -->
<!-- 引用c3p0 依赖 start -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<!-- 引用c3p0 依赖 end -->
<!-- Mysql start -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- Mysql end -->
<!-- Spring start -->
<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-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring end -->
<!-- Log4j start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log.version}</version>
</dependency>
<!-- Log4j end -->
注意:添加依赖包的时候切勿覆盖了之前工程中已经有的依赖,否则会出现其他错误。
修改完pom.xml文件之后,点击左边工程目录,右键找到Maven,点击选择Update Projetct,更新一下依赖包,如果依赖包本地不存在则会去云端下载,耐心等待下载完成即可。
第三步:配置框架的配置文件
1. 在src/main/resources目录下新建applicationContext.xml文件,配置以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- 自动扫描与装配bean -->
<context:component-scan base-package="{实际的包名}"></context:component-scan>
<!-- 读取properties配置文件 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.properties</value>
</list>
</property>
</bean>
<!-- 配置数据源c3p0 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${username}"></property>
<property name="password" value="${password}"></property>
<property name="jdbcUrl" value="${url}"></property>
<property name="driverClass" value="${driver_class}"></property>
<!-- 初始化池子大小 -->
<property name="initialPoolSize" value="${initPoolSize}"></property>
<!-- 池子最大数 -->
<property name="maxPoolSize" value="${maxPoolSize}"></property>
</bean>
<!-- Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- //加载实体类的映射文件位置及名称 -->
<property name="mappingLocations">
<list>
<value>classpath:{实际路径}/*.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
<prop key="hibernate.enable_lazy_load_no_trans">${hibernate.enable_lazy_load_no_trans}</prop>
</props>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 事务扫描开始(开启@Tranctional) -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
</beans>
2. 在src/main/resources目录下新建db.properties文件,配置以下内容:
#Mysql
driver_class=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/{数据库名}?characterEncoding=UTF-8
username=root
password={密码}
initPoolSize=5
maxPoolSize=10
#Hibernate config
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=false
#hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
hibernate.current_session_context_class=thread
hibernate.jdbc.batch_size=50
hibernate.enable_lazy_load_no_trans=true
3. 在src/main/resources目录下新建spring-mvc.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"
>
<!-- 开启MVC注解,表示SpringMVC支持注解功能 做了很多事情,不包括添加自己定义的拦截器 -->
<mvc:annotation-driven />
<context:component-scan base-package="{实际包名}" />
<!-- <context:component-scan /> -->
<!-- 扫描指定的包中的类上的注解,常用的注解有: -->
<!-- @Controller 声明Action组件 -->
<!-- @Service 声明Service组件 @Service("xxxService") -->
<!-- @Repository 声明Dao组件 -->
<!-- @Component 泛指组件, 当不好归类时. -->
<!-- @RequestMapping("/menu") 请求映射 -->
<!-- @Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") -->
<!-- @Autowired 用于注入,(spring提供的) 默认按类型装配 -->
<!-- @Transactional( rollbackFor={Exception.class}) 事务管理 -->
<!-- @ResponseBody将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流 -->
<!-- @Scope("prototype") 设定bean的作用域 -->
<!-- 通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器 -->
<!-- 设置不过滤内容,比如:css,jquery,img 等资源文件 -->
<mvc:resources location="/*.html" mapping="/**.html" />
<mvc:resources location="/css/*" mapping="/css/**" />
<mvc:resources location="/js/*" mapping="/js/**" />
<mvc:resources location="/images/*" mapping="/images/**" />
<!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" /> <!-- 前缀 -->
<property name="suffix" value=".jsp" /> <!-- 后缀 -->
</bean>
</beans>
4. 打开src/main/webapp/WEB-INF/web.xml,添加以下配置:
<!-- 配置web.xml,使其具有springmvc特性,主要配置两处,一个是ContextLoaderListener,一个是DispatcherServlet -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置ContextLoaderListener表示,该工程要以spring的方式启动。启动时会默认在/WEB-INF目录下查找applicationContext.xml
作为spring容器的配置文件,该文件里可以初始化一些bean -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spring mvc 配置 -->
<!-- 配置DispatcherServlet表示,该工程将采用springmvc的方式。启动时也会默认在/WEB-INF目录下查找XXX-servlet.xml作为配置文件,
XXX就是DispatcherServlet的名字,该文件中将配置两项重要的mvc特性:HandlerMapping,负责为DispatcherServlet这个前端控制器的请求查找Controller;
ViewResolver,负责为DispatcherServlet查找ModelAndView的视图解析器。 此处使用指定的配置文件spring-mvc.xml -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--<param-value>/WEB-INF/classes/spring-mvc-servlet.xml</param-value> -->
<param-value>classpath*:/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>SpringOpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SpringOpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 字符集过滤器 -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. 添加log4j的配置文件,在src/main/resources目录下新建log4j.propertise,配置以下内容
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d\:\\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
### fatal error warn info debug trace
log4j.rootLogger=debug, stdout
至此,整个基础配置就算是完成了,项目右键运行,看看是否正常运行并访问根目录,出错则查出原因。
以下内容为测试:
一、测试springmvc
1. 新建一个Controller类,使用注解注册。
package ssh.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping(value="Demo")
public class DemoController {
@RequestMapping(value="demo")
public String demo(){
System.out.println("demo");
return "index";
}
}
控制台打印demo则证明正常,如果出错:
1.1检查apoplicatonContext.xml的
<context:component-scan base-package="{实际包名}"></context:component-scan>
是否正确配置。
1.2检查spring-mvc.xml的
<context:component-scan base-package="{实际包名}" />
是否正确配置。
二、测试Hibernate,通过一个完成的业务流程来测试Hibernate
假定需求:通过id查询用户表,已有数据库表user,字段id,name,age
1.通过Hibernate reverse engine生成POJO类以及对应的映射xml
User.java
package com.shuidi168.server.entity;
import java.io.Serializable;
/**
* User entity. @author MyEclipse Persistence Tools
*/
public class User implements Serializable {
// Fields
private Integer id;
private String name;
private Integer age;
// Constructors
/** default constructor */
public User() {
}
/** full constructor */
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
// Property accessors
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
}
User.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="{完整包名}" table="user">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="name" type="java.lang.String">
<column name="name" length="10" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</class>
</hibernate-mapping>
2.新建IBaseDao接口,定义基础的增删改查,并实现BaseDaoImpl
package com.shuidi168.server.Dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
public interface IBaseDao<T> {
void save(T t);
void delete(T t);
void delete(Serializable id);
void update(T t);
T getById(Serializable id);
}
package com.shuidi168.server.Dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.shuidi168.server.Dao.IBaseDao;
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
private Class clazz;//用于接收运行时的泛型类型
public BaseDaoImpl() {
//获得当前类型的带有泛型类型的父类
ParameterizedType ptClass = (ParameterizedType) this.getClass().getGenericSuperclass();
//获得运行期的泛型类型
clazz = (Class) ptClass.getActualTypeArguments()[0];
}
@Resource
public void setMySessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
@Override
public void save(T t) {
getHibernateTemplate().save(t);
}
@Override
public void delete(T t) {
getHibernateTemplate().delete(t);
}
@Override
public void delete(Serializable id) {
T t = this.getById(id);
delete(t);
}
@Override
public void update(T t) {
getHibernateTemplate().update(t);
}
@Override
public T getById(Serializable id) {
return (T)getHibernateTemplate().get(clazz, id);
}
}
3. 新建IUserDao接口继承IBaseDao,并新建实现类,继承BaseDaoImpl并实现IUserDao
package com.shuidi168.server.Dao;
import com.shuidi168.server.entity.User;
public interface IUserDao extends IBaseDao<User> {
}
package com.shuidi168.server.Dao.impl;
import org.springframework.stereotype.Repository;
import com.shuidi168.server.Dao.IUserDao;
import com.shuidi168.server.entity.User;
@Repository
public class UserDaoImpl extends BaseDaoImpl<User> implements IUserDao{
}
3.新建IUserService接口,并实现UserServiceImpl
package com.shuidi168.server.service;
import com.shuidi168.server.entity.User;
public interface IUserService {
User getById(Integer id);
}
package com.shuidi168.server.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.shuidi168.server.Dao.IUserDao;
import com.shuidi168.server.entity.User;
import com.shuidi168.server.service.IUserService;
@Service
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public User getById(Integer id) {
return userDao.getById(id);
}
}
4.在DemoController类中测试
package com.shuidi168.server.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.shuidi168.server.entity.User;
import com.shuidi168.server.service.IUserService;
@Controller
@RequestMapping(value="Demo")
public class DemoController {
@Autowired
private IUserService userService;
@RequestMapping(value="getUser")
public String demo(){
User user = userService.getById(1);
System.out.println(user.getName());
return "index";
}
}
如果表中存在数据,则成功取出。至此测试完成。