SSM基本整合

工程结构如图所示:


1.Spring系列配置文件

spring-core.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:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        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.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">
        
    <context:component-scan base-package="com.hsun">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <import resource="classpath:spring/spring-mybatis.xml" />
    
    <!-- 事务管理 -->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="poolDataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="txManager" />

</beans>


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.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <mvc:annotation-driven/>

    <context:component-scan base-package="com.hsun.controller" />
    <!-- 静态资源 -->
    <mvc:resources location="/static/" mapping="/static/**"></mvc:resources>
    <!-- 跨域 -->
    <mvc:cors>
        <mvc:mapping path="/**" allowed-origins="*" allow-credentials="true" max-age="1800" allowed-methods="GET"/>
    </mvc:cors>
    <!-- jsp视图解析器 -->
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.InternalResourceView" />
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
</beans>

spring-mybstis

<?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:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 1:加载jdbc.properties配置文件 -->
    <context:property-placeholder location="classpath:dbconfig.properties" />

    <!-- 2:配置数据库连接池 -->
    <bean id="poolDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClass}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.user}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    <!-- 配置和mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定mybatis全局配置文件的位置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!-- 扫描entity包,使用别名,多个包;隔开 -->
        <property name="typeAliasesPackage" value="com.hsun.bean" />
        <property name="dataSource" ref="poolDataSource" />
        <!-- 指定mybatis,mapper配置文件的位置 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>
    
    <!-- 配置扫描器,将mybatis接口的实现加入到IOC容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <!-- 扫描所有dao接口的实现,加入到IOC容器中 -->
        <property name="basePackage" value="com.hsun.dao" />
    </bean>

</beans>


2.mybatis系列配置文件

mybstis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
  
  <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
  <typeAliases>
    <package name="com.hsun.bean"/>
  </typeAliases>
  
  
  <!-- <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="org/mybatis/example/BlogMapper.xml"/>
  </mappers> -->
  
  <!-- 注册分页插件 -->
  <plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 配置参数合理化 -->
        <property name="reasonable" value="true"/>
    </plugin>
  </plugins>
  
  
</configuration>

EmployeeMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hsun.dao.EmployeeMapper">
    <resultMap id="BaseResultMap" type="com.hsun.bean.Employee">
        <id column="emp_id" jdbcType="INTEGER" property="empId" />
        <result column="emp_name" jdbcType="VARCHAR" property="empName" />
        <result column="gender" jdbcType="CHAR" property="gender" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="d_id" jdbcType="INTEGER" property="dId" />
    </resultMap>
    <!-- 指定联合查询出部门字段 -->
    <resultMap id="WithDeptResultMap" type="com.hsun.bean.Employee">
        <id column="emp_id" jdbcType="INTEGER" property="empId" />
        <result column="emp_name" jdbcType="VARCHAR" property="empName" />
        <result column="gender" jdbcType="CHAR" property="gender" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="d_id" jdbcType="INTEGER" property="dId" />
        <association property="department" javaType="com.hsun.bean.Department">
            <id column="dept_id" property="deptId"/>
            <result column="dept_name" property="deptName"/>
        </association>
    </resultMap>
    <sql id="Example_Where_Clause">
        <where>
            <foreach collection="oredCriteria" item="criteria" separator="or">
                <if test="criteria.valid">
                    <trim prefix="(" prefixOverrides="and" suffix=")">
                        <foreach collection="criteria.criteria" item="criterion">
                            <choose>
                                <when test="criterion.noValue">
                                    and ${criterion.condition}
                                </when>
                                <when test="criterion.singleValue">
                                    and ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.betweenValue">
                                    and ${criterion.condition} #{criterion.value} and
                                    #{criterion.secondValue}
                                </when>
                                <when test="criterion.listValue">
                                    and ${criterion.condition}
                                    <foreach close=")" collection="criterion.value" item="listItem"
                                        open="(" separator=",">
                                        #{listItem}
                                    </foreach>
                                </when>
                            </choose>
                        </foreach>
                    </trim>
                </if>
            </foreach>
        </where>
    </sql>
    <sql id="Update_By_Example_Where_Clause">
        <where>
            <foreach collection="example.oredCriteria" item="criteria"
                separator="or">
                <if test="criteria.valid">
                    <trim prefix="(" prefixOverrides="and" suffix=")">
                        <foreach collection="criteria.criteria" item="criterion">
                            <choose>
                                <when test="criterion.noValue">
                                    and ${criterion.condition}
                                </when>
                                <when test="criterion.singleValue">
                                    and ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.betweenValue">
                                    and ${criterion.condition} #{criterion.value} and
                                    #{criterion.secondValue}
                                </when>
                                <when test="criterion.listValue">
                                    and ${criterion.condition}
                                    <foreach close=")" collection="criterion.value" item="listItem"
                                        open="(" separator=",">
                                        #{listItem}
                                    </foreach>
                                </when>
                            </choose>
                        </foreach>
                    </trim>
                </if>
            </foreach>
        </where>
    </sql>
    <sql id="Base_Column_List">
        emp_id, emp_name, gender, email, d_id
    </sql>
    <sql id="WithDept_Column_List">
        e.emp_id, e.emp_name, e.gender, e.email, e.d_id,d.dept_id,d.dept_name
    </sql>
    <!-- 
         List<Employee> selectByExampleWithDept(EmployeeExample example); 
         Employee selectByPrimaryKeyWithDept(Integer empId);
    -->
    <!-- 查询员工同时带上部门的 -->
    <select id="selectByExampleWithDept" resultMap="WithDeptResultMap">
        select
        <if test="distinct">
            distinct
        </if>
        <include refid="WithDept_Column_List" />
        FROM tbl_emp e
        LEFT JOIN tbl_dept d ON e.`d_id`=d.`dept_id`
        <if test="_parameter != null">
            <include refid="Example_Where_Clause" />
        </if>
        <if test="orderByClause != null">
            order by ${orderByClause}
        </if>
    </select>
    <select id="selectByPrimaryKeyWithDept" resultMap="WithDeptResultMap">
            select
            <include refid="WithDept_Column_List" />
            FROM tbl_emp e
            LEFT JOIN tbl_dept d ON e.`d_id`=d.`dept_id`
            where emp_id = #{empId,jdbcType=INTEGER}
    </select>
    
    <!-- 查询员工不带上带上部门的 -->
    <select id="selectByExample" parameterType="com.hsun.bean.EmployeeExample"
        resultMap="BaseResultMap">
        select
        <if test="distinct">
            distinct
        </if>
        <include refid="Base_Column_List" />
        from tbl_emp
        <if test="_parameter != null">
            <include refid="Example_Where_Clause" />
        </if>
        <if test="orderByClause != null">
            order by ${orderByClause}
        </if>
    </select>
    <select id="selectByPrimaryKey" parameterType="java.lang.Integer"
        resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from tbl_emp
        where emp_id = #{empId,jdbcType=INTEGER}
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from tbl_emp
        where emp_id = #{empId,jdbcType=INTEGER}
    </delete>
    <delete id="deleteByExample" parameterType="com.hsun.bean.EmployeeExample">
        delete from tbl_emp
        <if test="_parameter != null">
            <include refid="Example_Where_Clause" />
        </if>
    </delete>
    <insert id="insert" parameterType="com.hsun.bean.Employee">
        insert into tbl_emp (emp_id, emp_name, gender,
        email, d_id)
        values (#{empId,jdbcType=INTEGER}, #{empName,jdbcType=VARCHAR},
        #{gender,jdbcType=CHAR},
        #{email,jdbcType=VARCHAR}, #{dId,jdbcType=INTEGER})
    </insert>
    <insert id="insertSelective" parameterType="com.hsun.bean.Employee">
        insert into tbl_emp
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="empId != null">
                emp_id,
            </if>
            <if test="empName != null">
                emp_name,
            </if>
            <if test="gender != null">
                gender,
            </if>
            <if test="email != null">
                email,
            </if>
            <if test="dId != null">
                d_id,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="empId != null">
                #{empId,jdbcType=INTEGER},
            </if>
            <if test="empName != null">
                #{empName,jdbcType=VARCHAR},
            </if>
            <if test="gender != null">
                #{gender,jdbcType=CHAR},
            </if>
            <if test="email != null">
                #{email,jdbcType=VARCHAR},
            </if>
            <if test="dId != null">
                #{dId,jdbcType=INTEGER},
            </if>
        </trim>
    </insert>
    <select id="countByExample" parameterType="com.hsun.bean.EmployeeExample"
        resultType="java.lang.Long">
        select count(*) from tbl_emp
        <if test="_parameter != null">
            <include refid="Example_Where_Clause" />
        </if>
    </select>
    <update id="updateByExampleSelective" parameterType="map">
        update tbl_emp
        <set>
            <if test="record.empId != null">
                emp_id = #{record.empId,jdbcType=INTEGER},
            </if>
            <if test="record.empName != null">
                emp_name = #{record.empName,jdbcType=VARCHAR},
            </if>
            <if test="record.gender != null">
                gender = #{record.gender,jdbcType=CHAR},
            </if>
            <if test="record.email != null">
                email = #{record.email,jdbcType=VARCHAR},
            </if>
            <if test="record.dId != null">
                d_id = #{record.dId,jdbcType=INTEGER},
            </if>
        </set>
        <if test="_parameter != null">
            <include refid="Update_By_Example_Where_Clause" />
        </if>
    </update>
    <update id="updateByExample" parameterType="map">
        update tbl_emp
        set emp_id = #{record.empId,jdbcType=INTEGER},
        emp_name = #{record.empName,jdbcType=VARCHAR},
        gender = #{record.gender,jdbcType=CHAR},
        email = #{record.email,jdbcType=VARCHAR},
        d_id = #{record.dId,jdbcType=INTEGER}
        <if test="_parameter != null">
            <include refid="Update_By_Example_Where_Clause" />
        </if>
    </update>
    <update id="updateByPrimaryKeySelective" parameterType="com.hsun.bean.Employee">
        update tbl_emp
        <set>
            <if test="empName != null">
                emp_name = #{empName,jdbcType=VARCHAR},
            </if>
            <if test="gender != null">
                gender = #{gender,jdbcType=CHAR},
            </if>
            <if test="email != null">
                email = #{email,jdbcType=VARCHAR},
            </if>
            <if test="dId != null">
                d_id = #{dId,jdbcType=INTEGER},
            </if>
        </set>
        where emp_id = #{empId,jdbcType=INTEGER}
    </update>
    <update id="updateByPrimaryKey" parameterType="com.hsun.bean.Employee">
        update tbl_emp
        set emp_name = #{empName,jdbcType=VARCHAR},
        gender = #{gender,jdbcType=CHAR},
        email = #{email,jdbcType=VARCHAR},
        d_id = #{dId,jdbcType=INTEGER}
        where emp_id = #{empId,jdbcType=INTEGER}
    </update>
</mapper>

DepartmentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hsun.dao.DepartmentMapper">
  <resultMap id="BaseResultMap" type="com.hsun.bean.Department">
    <id column="dept_id" jdbcType="INTEGER" property="deptId" />
    <result column="dept_name" jdbcType="VARCHAR" property="deptName" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    dept_id, dept_name
  </sql>
  <select id="selectByExample" parameterType="com.hsun.bean.DepartmentExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
    from tbl_dept
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from tbl_dept
    where dept_id = #{deptId,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from tbl_dept
    where dept_id = #{deptId,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="com.hsun.bean.DepartmentExample">
    delete from tbl_dept
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="com.hsun.bean.Department">
    insert into tbl_dept (dept_id, dept_name)
    values (#{deptId,jdbcType=INTEGER}, #{deptName,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.hsun.bean.Department">
    insert into tbl_dept
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="deptId != null">
        dept_id,
      </if>
      <if test="deptName != null">
        dept_name,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="deptId != null">
        #{deptId,jdbcType=INTEGER},
      </if>
      <if test="deptName != null">
        #{deptName,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <select id="countByExample" parameterType="com.hsun.bean.DepartmentExample" resultType="java.lang.Long">
    select count(*) from tbl_dept
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>
  <update id="updateByExampleSelective" parameterType="map">
    update tbl_dept
    <set>
      <if test="record.deptId != null">
        dept_id = #{record.deptId,jdbcType=INTEGER},
      </if>
      <if test="record.deptName != null">
        dept_name = #{record.deptName,jdbcType=VARCHAR},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    update tbl_dept
    set dept_id = #{record.deptId,jdbcType=INTEGER},
      dept_name = #{record.deptName,jdbcType=VARCHAR}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="com.hsun.bean.Department">
    update tbl_dept
    <set>
      <if test="deptName != null">
        dept_name = #{deptName,jdbcType=VARCHAR},
      </if>
    </set>
    where dept_id = #{deptId,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.hsun.bean.Department">
    update tbl_dept
    set dept_name = #{deptName,jdbcType=VARCHAR}
    where dept_id = #{deptId,jdbcType=INTEGER}
  </update>
</mapper>

3.数据源信息

db.properties

jdbc.url=jdbc:mysql://localhost:3306/ssm_crud
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root


4.日志

log4j.rootLogger=INFO,Console,File  
#\u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u7684\u5730\u4E3A\u63A7\u5236\u53F0
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.Target=System.out  
#\u53EF\u4EE5\u7075\u6D3B\u5730\u6307\u5B9A\u65E5\u5FD7\u8F93\u51FA\u683C\u5F0F\uFF0C\u4E0B\u9762\u4E00\u884C\u662F\u6307\u5B9A\u5177\u4F53\u7684\u683C\u5F0F
log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  

#\u6587\u4EF6\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6
log4j.appender.File = org.apache.log4j.RollingFileAppender  
#\u6307\u5B9A\u8F93\u51FA\u76EE\u5F55
log4j.appender.File.File = logs/ssm.log  
#\u5B9A\u4E49\u6587\u4EF6\u6700\u5927\u5927\u5C0F
log4j.appender.File.MaxFileSize = 10MB  
# \u8F93\u51FA\u6240\u4EE5\u65E5\u5FD7\uFF0C\u5982\u679C\u6362\u6210DEBUG\u8868\u793A\u8F93\u51FADEBUG\u4EE5\u4E0A\u7EA7\u522B\u65E5\u5FD7
log4j.appender.File.Threshold = ALL  
log4j.appender.File.layout = org.apache.log4j.PatternLayout  
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n  


5. web.xml


<?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"
 id="WebApp_ID" version="3.0">
 
 <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 <!-- spring核心的位置 -->
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:spring/spring-core.xml</param-value>
 </context-param>
 <!-- 统一编码filter -->
 <filter>
     <filter-name>charsetEncoding</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>
 

 <!-- 此监听器出用于主要为了解决java.beans.Introspector导致内存泄漏的问题. This listener should 
     be registered as the first one in web.xml, before any application listeners 
     such as Spring's ContextLoaderListener. -->
 <listener>
     <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
 </listener>
 <!-- 加载spring核心的listener -->
 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <!-- springmvc前端控制器配置 -->
 <servlet>
     <servlet-name>mvc</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:/spring/spring-mvc.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
     <servlet-name>mvc</servlet-name>
     <url-pattern>/</url-pattern>
 </servlet-mapping>
</web-app>


6. 通用返回类

package com.hsun.bean;

import java.util.HashMap;
import java.util.Map;



/**
 * 通用的返回类
 * @author 孙浩
 *
 */
public class Msg {
    //状态码100-成功 200-失败
    private int code;
    //提示信息
    private String msg;
    //要返回给浏览器的数据
    private Map<String, Object> extend = new HashMap<>();
    
    public static Msg success() {
        Msg result = new Msg();
        result.setCode(100);
        result.setMsg("处理成功");
        return result;
    }
    
    public static Msg fail() {
        Msg result = new Msg();
        result.setCode(200);
        result.setMsg("处理失败");
        return result;
    }
    
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public Map<String, Object> getExtend() {
        return extend;
    }
    public void setExtend(Map<String, Object> extend) {
        this.extend = extend;
    }

    public Msg add(String key, Object value) {
        this.getExtend().put(key, value);
        return this;
    }
    
}


7.首页展示

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>员工列表</title>
<%
    pageContext.setAttribute("APP_PATH", request.getContextPath());
%>
<!-- web的路径问题:
不以“/”开头的相对路径,找资源以当前路径为基准,经常容易出问题
以“/”开始的路径在找资源时,是以服务器的路径为标准,需要加上项目名
 -->
<!-- 引入Jquery -->
<script type="text/javascript"
    src="${APP_PATH }/static/js/jquery.min.js"></script>
<!-- Bootstrap -->
<link
    href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"
    rel="stylesheet">
<!-- 引入BootStrap js文件 -->
<script
    src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

<style type="text/css">
#dep_search {
    margin: 0px;
    border: 0px;
}
</style>
</head>
<body>
    <!-- 搭建显示页面 -->

    <!-- 员工添加模态框 -->
    <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
        aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                        aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="myModalLabel">员工添加</h4>
                </div>
                <div class="modal-body">
                    <form class="form-horizontal">
                        <div class="form-group">
                            <label class="col-sm-2 control-label">empName</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" name="empName"
                                    id="emp_add_input" placeholder="empName"> <span
                                    class="help-block"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">email</label>
                            <div class="col-sm-10">
                                <input type="text" name="email" class="form-control"
                                    id="email_add_input" placeholder="email@qq.com"> <span
                                    class="help-block"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">gender</label>
                            <div class="col-sm-10">
                                <label class="radio-inline"> <input type="radio"
                                    name="gender" id="inlineRadio1" value="M" checked> 男
                                </label> <label class="radio-inline"> <input type="radio"
                                    name="gender" id="inlineRadio2" value="F"> 女
                                </label>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">gender</label>
                            <div class="col-sm-4">
                                <select class="form-control" name="dId" id="dept_add_select">
                                </select>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default"
                                data-dismiss="modal">关闭</button>
                            <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
    <!-- 员工添加模态框结束 -->


    <!-- 员工修改模态框 -->
    <div class="modal fade" id="empUpdateModal" tabindex="-1" role="dialog"
        aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                        aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title">员工修改</h4>
                </div>
                <div class="modal-body">
                    <form class="form-horizontal" id="empUpdateModal">
                        <div class="form-group">
                            <label class="col-sm-2 control-label">empName</label>
                            <div class="col-sm-10">
                                <p class="form-control-static" id="empName_update_static"></p>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">email</label>
                            <div class="col-sm-10">
                                <input type="text" name="email" class="form-control"
                                    id="email_update_input" placeholder="email@qq.com"> <span
                                    class="help-block"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">gender</label>
                            <div class="col-sm-10">
                                <label class="radio-inline"> <input type="radio"
                                    name="gender" id="gender1_update_input" value="M" checked>
                                    男
                                </label> <label class="radio-inline"> <input type="radio"
                                    name="gender" id="gender2_update_input" value="F"> 女
                                </label>
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="col-sm-2 control-label">gender</label>
                            <div class="col-sm-4">
                                <select class="form-control" name="dId">
                                </select>
                            </div>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default"
                                data-dismiss="modal">关闭</button>
                            <button type="button" class="btn btn-primary" id="emp_update_btn">更新</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
    <!-- 员工修改模态框结束 -->


    <div class="container">
        <!-- 标题 -->
        <div class="row">
            <div class="col-md-12">
                <h1>SSM_CRUD</h1>
            </div>
        </div>

        <div class="row">
            <div class="col-md-8 col-md-offset-4">
                <input aria-describedby="basic-addon1" type="text" id="input_search"
                    placeholder="在此输入要检索的内容。。。">
                <button class="btn btn-primary btn-default" id="dep_search">
                    <span class="glyphicon glyphicon-search"></span>
                </button>
            </div>
        </div>
        <!-- 按钮 -->
        <div class="row">
            <div class="col-md-4 col-md-offset-8">
                <button class="btn btn-primary btn-sm" id="emp_add_modal_btn">新增</button>
                <button class="btn btn-danger btn-sm" id="emp_delete_all_btn">删除</button>
            </div>
        </div>
        <!-- 显示表格数据 -->
        <div class="row">
            <div class="col-md-12">
                <table class="table table-hover" id="emps_table">
                    <thead>
                        <tr>
                            <th><input type="checkbox" id="check_all"></th>
                            <th>#</th>
                            <th>empName</th>
                            <th>gender</th>
                            <th>email</th>
                            <th>deptName</th>
                            <th>操作</th>
                        </tr>
                    </thead>
                    <tbody>
                    </tbody>
                </table>
            </div>
        </div>
        <!-- 显示分页信息 -->
        <div class="row">
            <!-- 分页文字信息 -->
            <div class="col-md-6" id="page_info_area"></div>
            <!-- 分页条信息 -->
            <div class="col-md-6" id="page_nav_area"></div>
        </div>
    </div>
    <script type="text/javascript">
        var totalRecord, currentPage; //总记录数和当前页码

        $(function() {
            to_page(1);

        });

        function to_page(pn) {
            $.ajax({
                type : "GET",
                url : "${APP_PATH }/emps",
                data : "pn=" + pn,
                success : function(result) {
                    //alert(msg.code);
                    //console.log(result);
                    //1.解析并显示员工数据
                    build_emps_table(result);
                    //2.解析并显示分页信息
                    build_page_info(result);
                    //3.解析并显示分页条
                    build_page_nav(result);
                }
            });
        }

        function build_emps_table(result) {
            //每次添加数据之前清空表格
            $("#emps_table tbody").empty();
            var emps = result.extend.pageInfo.list;//取到所有查询到的封装到list中的员工
            $
                    .each(
                            emps,
                            function(index, item) {
                                //alert(item.empName);
                                var checkBoxTd = $("<td><input type='checkbox' class='check_item'></td>");
                                var empIdTd = $("<td></td>").append(item.empId);
                                var empNameTd = $("<td></td>").append(
                                        item.empName);
                                var genderTd = $("<td></td>").append(
                                        item.gender == 'M' ? "男" : "女");
                                var emailTd = $("<td></td>").append(item.email);
                                var deptNameTd = $("<td></td>").append(
                                        item.department.deptName);
                                var editBt = $("<button></button>").addClass(
                                        "btn btn-primary btn-sm edit_btn")
                                        .append("<span></span>").addClass(
                                                "glyphicon glyphicon-pencil")
                                        .append("编辑");
                                //为编辑按钮添加一个自定义属性
                                editBt.attr("edit-id", item.empId);
                                var delBt = $("<button></button>").addClass(
                                        "btn btn-danger btn-sm delete_btn")
                                        .append("<span></span>").addClass(
                                                "glyphicon glyphicon-trash")
                                        .append("删除");
                                //为删除按钮添加一个自定义属性来表示当前要删除员工的id
                                delBt.attr("del-id", item.empId);
                                var btnTd = $("<td></td>").append(editBt)
                                        .append(" ").append(delBt);
                                //append()方法每次执行完成之后还是返回原来的元素
                                $("<tr></tr>").append(checkBoxTd).append(
                                        empIdTd).append(empNameTd).append(
                                        genderTd).append(emailTd).append(
                                        deptNameTd).append(btnTd).appendTo(
                                        "#emps_table tbody");
                            });
        }

        //构构建分页信息
        function build_page_info(result) {
            $("#page_info_area").empty();
            $("#page_info_area").append(
                    "当前第" + result.extend.pageInfo.pageNum + "页,共"
                            + result.extend.pageInfo.pages + "页,共有"
                            + result.extend.pageInfo.total + "条记录");
            totalRecord = result.extend.pageInfo.total;
            currentPage = result.extend.pageInfo.pageNum;
        }
        //构建分页条,点击分页条要能去下一页等等           
        function build_page_nav(result) {
            //构建分页导航之前将页面清空
            $("#page_nav_area").empty();
            var ul = $("<ul></ul>").addClass("pagination");
            var firstPageLi = $("<li></li>").append(
                    $("<a></a>").append("首页").attr("href", "#"));
            var prePageLi = $("<li></li>").append(
                    $("<a></a>").append("&laquo;"));
            //如果没有上一页则给上一页和首页添加不可点击的效果
            if (result.extend.pageInfo.hasPreviousPage == false) {
                firstPageLi.addClass("disabled");
                prePageLi.addClass("disabled");
            } else {
                //为素添加点击翻页事件
                firstPageLi.click(function() {
                    to_page(1);
                });
                prePageLi.click(function() {
                    to_page(result.extend.pageInfo.pageNum - 1);
                });
            }

            var nextPageLi = $("<li></li>").append(
                    $("<a></a>").append("&raquo;"));
            var lastPageLi = $("<li></li>").append(
                    $("<a></a>").append("末页").attr("href", "#"));
            //如果没有下一页则给下一页和末页添加不可点击的效果
            if (result.extend.pageInfo.hasNextPage == false) {
                nextPageLi.addClass("disabled");
                lastPageLi.addClass("disabled");
            } else {
                nextPageLi.click(function() {
                    to_page(result.extend.pageInfo.pageNum + 1);
                });
                lastPageLi.click(function() {
                    to_page(result.extend.pageInfo.pages);
                });
            }

            //1.添加首页和前一页
            ul.append(firstPageLi).append(prePageLi);
            $.each(result.extend.pageInfo.navigatepageNums, function(index,
                    item) {
                var numLi = $("<li></li>").append(
                        $("<a></a>").append(item).attr("href", "#"));
                if (result.extend.pageInfo.pageNum == item) {
                    numLi.addClass("active");
                }
                //添加点击事件
                numLi.click(function() {
                    to_page(item);//点击以后发送Ajax请求到当前点击的页码
                });
                //2.遍历添加页码
                ul.append(numLi);
            });
            //3.遍历完成后添加下一页和末页
            ul.append(nextPageLi).append(lastPageLi);
            //4.吧ul加入到nav
            var navEle = $("<nav></nav>").append(ul);
            navEle.appendTo("#page_nav_area");
        }

        //该方法用于重置表单弹出时上一次输入的内容以及校验的状态
        function reset_form(ele) {
            $(ele)[0].reset();//重置表单内容
            //清空样式
            $(ele).find("*").removeClass("has-success has-error");
            $(ele).find(".help-block").text("");
        }
        //点击新增按钮弹出模态框
        $("#emp_add_modal_btn").click(function() {
            //表单完整重置(重置表单的样式和内容)
            reset_form("#empAddModal form");
            //发送Aajx请求查询部门信息,显示在下拉列表中
            getDepts("#empAddModal select");

            //弹出模态框
            $("#empAddModal").modal({
                backdrop : "static"
            });
        });

        //查出所有部门的信息并显示在下拉列表中
        function getDepts(ele) {
            $(ele).empty();
            $.ajax({
                type : "GET",
                url : "${APP_PATH }/depts",
                success : function(result) {
                    //alert(msg.code);
                    //console.log(result);
                    $.each(result.extend.depts, function() {
                        var optionEle = $("<option></option>").append(
                                this.deptName).attr("value", this.deptId);
                        optionEle.appendTo(ele);
                    });

                }
            });
        }

        /**
         *添加员工表单前端校验函数
         */
        function validate_add_form() {
            //1.首先获取输入框中输入的值
            var empName = $("#emp_add_input").val();
            var regName = /(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})/;
            if (!regName.test(empName)) {
                //alert("用户名可以是2-5位中文或者6-16位英文和数字的组合");
                show_validate_msg("#emp_add_input", "error",
                        "用户名可以是2-5位中文或者6-16位英文和数字的组合");
                return false;
            } else {
                show_validate_msg("#emp_add_input", "success", "");
            }
            ;

            //2.邮箱校验
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                //清空元素之前的样式
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                /* $("#email_add_input").parent().addClass("has-error");
                $("#email_add_input").next("span").text("邮箱格式不正确"); */
                return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
                /* $("#email_add_input").parent().addClass("has-success");
                $("#email_add_input").next("span").text(""); */
            }

            return true;
        }

        function show_validate_msg(ele, status, msg) {
            //清除当前元素状态
            $(ele).parent().removeClass("has-success has-error");
            $(ele).next("span").text("");
            if ("success" == status) {
                $(ele).parent().addClass("has-success");
                $(ele).next("span").text(msg);
            } else if ("error" == status) {
                $(ele).parent().addClass("has-error");
                $(ele).next("span").text(msg);
            }
        }

        /**
         *发送Ajax请求校验用户名是否重复
         **/
        $("#emp_add_input").change(
                function() {
                    //1.模态框中填写的表单数据验证后提交给服务器进行保存
                    var empName = this.value;
                    $.ajax({
                        url : "${APP_PATH}/checkuser",
                        type : "POST",
                        data : "empName=" + empName,
                        success : function(result) {
                            if (result.code == 100) {
                                show_validate_msg("#emp_add_input", "success",
                                        "用户名可用");
                                $("#emp_save_btn").attr("ajax-va", "success");
                            } else {
                                show_validate_msg("#emp_add_input", "error",
                                        result.extend.va_msg);
                                $("#emp_save_btn").attr("ajax-va", "error");
                            }
                        }
                    });

                });

        /**
         *点击保存按钮,保存员工
         **/
        $("#emp_save_btn").click(function() {
            //1.模态框中填写的表单数据验证后提交给服务器进行保存
            if (!validate_add_form()) {
                return false;
            }
            //判断之前的ajax用户名校验是否成功,如果不成功则直接返回false
            if ($(this).attr("ajax-va") == "error") {
                return false;
            }
            //2.发送AJax请求保存员工
            $.ajax({
                url : "${APP_PATH}/emp",
                type : "POST",
                data : $("#empAddModal form").serialize(),
                success : function(result) {
                    if (result.code == 100) {
                        //员工保存成功后:
                        //1.关闭模态框
                        $('#empAddModal').modal('hide');
                        //2.来到最后一页,显示插入的数据
                        //发送ajax请求显示最后一页数据即可
                        to_page(totalRecord);

                    } else {
                        //显示失败信息
                        //有那个字段得错误信息就显示那个字段的
                        alert(result.extend.errorFields.email);
                        alert(result.extend.errorFields.empName);
                    }

                }
            });

        });

        //给编辑按钮绑定事件(新版本得jquery中没有live方法转而替换得是on方法)
        $(document).on("click", ".edit_btn", function() {
            //0.查出部门信息并显示部门列表
            getDepts("#empUpdateModal select");
            //1.查出员工信息并显示员工信息
            getEmp($(this).attr("edit-id"));
            //2.把员工id的值传递给模态框的更新按钮
            $("#emp_update_btn").attr("edit-id", $(this).attr("edit-id"));
            //显示模态框
            $("#empUpdateModal").modal({
                backdrop : "static"
            });
        });

        function getEmp(id) {
            $.ajax({
                url : "${APP_PATH}/emp/" + id,
                type : "GET",
                success : function(result) {
                    var empData = result.extend.emp;
                    $("#empName_update_static").text(empData.empName);
                    $("#email_update_input").val(empData.email);
                    $("#empUpdateModal input[name=gender]").val(
                            [ empData.gender ]);
                    $("#empUpdateModal select").val([ empData.dId ]);
                }
            });
        }

        //为员工更新按钮绑定一个点击事件
        $("#emp_update_btn").click(function() {
            //0.首先校验邮箱
            var email = $("#email_update_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                show_validate_msg("#email_update_input", "error", "邮箱格式不正确");
                return false;
            } else {
                show_validate_msg("#email_update_input", "success", "");
            }
            //1.发送Ajax请求,保存更新后的员工数据
            $.ajax({
                url : "${APP_PATH}/emp/" + $(this).attr("edit-id"),
                type : "PUT",
                data : $("#empUpdateModal form").serialize(),//+"&_method=PUT" 表单序列话后加上该字符串的意思是,将普通的POST请求转换为PUT请求
                success : function(result) {
                    //alert(result.msg);
                    //1.关闭模态框
                    $("#empUpdateModal").modal("hide");
                    //2.回到本页面
                    to_page(currentPage);
                }
            });
        });

        //单个删除
        //为删除按钮绑定单击事件(类似于编辑按钮绑定事件)
        $(document).on("click", ".delete_btn", function() {
            //弹出是否删除确认对话框
            var empName = $(this).parents("tr").find("td:eq(2)").text();
            var empId = $(this).attr("del-id");
            //alert($(this).parents("tr").find("td:eq(1)").text());
            if (confirm("确认删除【" + empName + "】吗?")) {
                //确认,发送ajax请求删除即可
                $.ajax({
                    url : "${APP_PATH}/emp/" + empId,
                    type : "DELETE",
                    success : function(result) {
                        alert(result.msg);
                        //处理成功后回到本页
                        to_page(currentPage);
                    }
                });
            }
        });

        //完成全选/全不选功能
        $("#check_all").click(function() {
            //$(".check_item")
            $(".check_item").prop("checked", $(this).prop("checked"));
        });

        //check_item
        $(document)
                .on(
                        "click",
                        ".check_item",
                        function() {
                            var flag = $(".check_item:checked").length == $(".check_item").length;
                            $("#check_all").prop("checked", flag);
                        });

        //点击全部删除,批量删除
        $("#emp_delete_all_btn").click(
                function() {
                    var empNames = "";
                    var empIds = "";
                    //遍历选中的checkbox
                    $.each($(".check_item:checked"), function() {
                        empNames += $(this).parents("tr").find("td:eq(2)")
                                .text()
                                + ",";
                        empIds += $(this).parents("tr").find("td:eq(1)").text()
                                + "-";
                    });
                    empNames = empNames.substring(0, empNames.length - 1);
                    empIds = empIds.substring(0, empIds.length - 1);
                    if (confirm("确认删除【" + empNames + "】吗?")) {
                        //发送ajax请求删除
                        $.ajax({
                            url : "${APP_PATH}/emp/" + empIds,
                            type : "DELETE",
                            success : function(result) {
                                alert(result.msg);
                                //回到当前页
                                to_page(currentPage);
                            }
                        });
                    }

                });
        //点击全部删除,批量删除
        $("#dep_search").click(function() {
                
                var key=$("#input_search").val();
                
                if(key==null||key==""){
                    alert(key);
                
                }else{

                    //发送ajax请求删除
                    $.ajax({
                            url : "${APP_PATH}/emp/" + key,
                            type : "GET",
                            success : function(result) {
                                //1.解析并显示员工数据
                                build_emps_table(result);
                                //2.解析并显示分页信息
                                build_page_info(result);
                                //3.解析并显示分页条
                                build_page_nav(result);
                            }
                        });
                    }
        });

    
        
        </script>
</body>
</html>


8. pom.xml

<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>
    <parent>
        <groupId>com.hsun</groupId>
        <artifactId>spring</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>ssm-demo</artifactId>
    <packaging>war</packaging>


    <!-- 引入项目依赖的jar包 -->
    <dependencies>

        <!--日志 -->
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.14</version>
        </dependency>

        <!-- 引入pageHelper分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
        <!-- MBG -->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
        </dependency>

        <!-- 引入Spring SpringMVC -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!-- 引入Spring test -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.7.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!-- 引入spring-jdbc(事物控制) -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!-- Spring面向切面编程 -->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <!-- 引入mybatis -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.2</version>
        </dependency>


        <!-- 引入mybatis整合Spring的适配包 -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- 数据库连接池 -->
        <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <!-- mysql驱动 -->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.42</version>
        </dependency>


        <!-- jstl servlet-api junit -->
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- Json数据格式依赖包 -->
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.8</version>
        </dependency>
        <!-- JSR303数据校验支持,Tomcat7及以上的服务器直接在项目中导入jar包即可,tomcat及以下的 服务器需要额外的给服务器中的lib包中替换新标准的el表达jar包 -->
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

        <!-- commons -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>

    <!-- <build> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> 
        <version>3.0.0</version> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
        <failOnMissingWebXml>false</failOnMissingWebXml> </properties> <failOnMissingWebXml>false</failOnMissingWebXml> -->
</project>

源码查看

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容