基于ssm框架整合的员工系统

写在前边:这是一个基于ssm框架的员工管理系统,代码上传到gitee托管,需要私信我。
公众号:小白编码

介绍

简单的整合ssm_crud汇总

软件架构

后台:
Mybatis
SpringMVC
Spring
Mybatis逆向工程
Mybatis的分页插件
JSR303校验
Jackson
Maven
C3P0

前台:
Bootstrap
数据校验
Ajax

测试使用

https://codewhite.cn/ssm_crud/

页面建设:

首页:
基于ssm框架整合的员工系统_第1张图片
添加:
基于ssm框架整合的员工系统_第2张图片
修改:基于ssm框架整合的员工系统_第3张图片

逆向工程:

依赖:

  
        
        <dependency>
            <groupId>org.mybatis.generatorgroupId>
            <artifactId>mybatis-generator-coreartifactId>
            <version>1.3.7version>
        dependency>

配置:




<generatorConfiguration>

    
    <context id="DB2Tables" targetRuntime="MyBatis3">
        
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:2001/ssm_crud?allowMultiQueries=true"
                        userId="root"
                        password="20010303">
        jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        javaTypeResolver>

        
        <javaModelGenerator targetPackage="cn.codewhite.pojo"
                            targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        javaModelGenerator>


        
        <sqlMapGenerator targetPackage="cn\codewhite\dao"
                         targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true"/>
        sqlMapGenerator>

        
        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.codewhite.dao"
                             targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true"/>
        javaClientGenerator>

        
        <table tableName="tbl_emp" domainObjectName="Employee">table>
        <table tableName="tbl_dep" domainObjectName="Department">table>
    context>
generatorConfiguration>

生成:

    @Test
    public void test() throws Exception{
     

        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("src/main/resources/mbg.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate(null);
    }

批量插入:使用以下配置:

spring配置:

   
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <constructor-arg name="executorType" value="BATCH"/>
    bean>

分页插件:

依赖:

  
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelperartifactId>
            <version>5.1.2version>
        dependency>
        <dependency>

mybatis配置文件:

<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			
			<property name="reasonable" value="true"/>
		plugin>
	plugins>

使用分页:pageinfo封装了详细的分页信息,以及分页数据,

    /**
     * 分页查询员工数据
     *
     * @return
     */
    @RequestMapping("/emps")
    public String getEmps(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, Model model) {
     
        // 这不是一个分页查询;
        // 引入PageHelper分页插件
        // 在查询之前只需要调用,传入页码,以及每页的大小
        //开启分页
        PageHelper.startPage(pageNo, 5);
        // startPage后面紧跟的这个查询就是一个分页查询
        List<Employee> emps = employeeService.getAll();

        // 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。
        // 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数(总共每个页面设置5个分页):1 , 2, 3 ,4 ,5页
        PageInfo pageInfo = new PageInfo(emps,5);

        model.addAttribute("pageInfo",pageInfo);


        return "list";
    }

MockMvc

springmvc的junit:使用Spring4测试的时候,需要servlet3.0的支持

package cn.codewhite.test;

import cn.codewhite.pojo.Employee;
import com.github.pagehelper.PageInfo;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import java.util.List;

/**
 * 使用Spring测试模块提供的测试请求功能,测试curd请求的正确性
 * Spring4测试的时候,需要servlet3.0的支持
 *
 * @author JUNSHI [email protected]
 * @create 2020-06-16 22:05
 */
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration//注入自身的ioc容器
@ContextConfiguration(locations = {
     "classpath:spring/applicationContext.xml","classpath:spring/springmvc.xml"})
public class MvcTest {
     

    // 传入Springmvc的ioc
    @Autowired//自动注入
    private WebApplicationContext context;
    // 虚拟mvc请求,获取到处理结果。
    private MockMvc mockMvc;

    /**
     * 初始化mockMvc
     */
    @Before//每次使用都创建
    public void initMockMvc() {
     
        //创建实例

        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();

    }

    @Test
    public void testPage() throws Exception {
     

        //模拟请求拿到返回值
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pageNo", "1")).andReturn();

        //请求成功以后,请求域中会有pageInfo;我们可以取出pageInfo进行验证
        MockHttpServletRequest request = result.getRequest();
        PageInfo pi = (PageInfo) request.getAttribute("pageInfo");


        System.out.println("当前页码:" + pi.getPageNum());
        System.out.println("总页码:" + pi.getPages());
        System.out.println("总记录数:" + pi.getTotal());
        System.out.println("在页面需要连续显示的页码");
        int[] nums = pi.getNavigatepageNums();
        for (int i : nums) {
     
            System.out.println(" " + i);
        }
        //获取员工数据
        List<Employee> list = pi.getList();
        for (Employee employee : list) {
     
            System.out.println("ID:"+employee.getEmpId()+"==>Name:"+employee.getEmpName());
        }

    }


    @Test
    public void testPage1() throws Exception {
     
        //模拟请求拿到返回值
        MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/emps").param("pageNo", "5"))
                .andReturn();

        //请求成功以后,请求域中会有pageInfo;我们可以取出pageInfo进行验证
        MockHttpServletRequest request = result.getRequest();
        PageInfo pi = (PageInfo) request.getAttribute("pageInfo");
        System.out.println("当前页码:"+pi.getPageNum());
        System.out.println("总页码:"+pi.getPages());
        System.out.println("总记录数:"+pi.getTotal());
        System.out.println("在页面需要连续显示的页码");
        int[] nums = pi.getNavigatepageNums();
        for (int i : nums) {
     
            System.out.print(" "+i);
        }

        //获取员工数据
        List<Employee> list = pi.getList();
        for (Employee employee : list) {
     
            System.out.println("ID:"+employee.getEmpId()+"==>Name:"+employee.getEmpName());
        }

    }
}

空指针注意package,以及实例化问题等

jsp分页+pageHleper:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: JUN
  Date: 2020/6/16
  Time: 21:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    
    
    
    
    员工列表
    <%--    当前工程的路径--%>
    <%
        pageContext.setAttribute("basePath", request.getContextPath());
    %>


    
    
    <%--    JQUERY--%>
    
    
    









改造查询-ajax

Msg统一返回类:

package cn.codewhite.pojo;

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

/**
 * 通用的返回的类
 *
 * @author JUNSHI [email protected]
 * @create 2020-06-17 15:37
 */
public class Msg {
     

    /**
     * 返回的状态码  100表示返回成功 200表示失败
     */
    private Integer code;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 用户要返回给浏览器的数据
     */
    private Map<String, Object> extend = new HashMap<>();


    /**
     * 表示成功
     * @return
     */
    public static Msg success() {
     

        Msg result = new Msg();
        result.setCode(100);
        result.setMsg("处理成功!");
        return result;
    }

    /**
     * 表示失败
     * @return
     */
    public static Msg fail() {
     

        Msg result = new Msg();
        result.setCode(200);
        result.setMsg("处理失败!");
        return result;
    }

    /**
     * 添加返回参数
     * @param key
     * @param value
     * @return
     */
    public Msg add(String key,Object value){
     
        this.getExtend().put(key,value);
        return this;
    }


    public Integer getCode() {
     
        return code;
    }

    public void setCode(Integer 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;
    }
}

jackson:

        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-coreartifactId>
            <version>2.9.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-annotationsartifactId>
            <version>2.9.0version>
        dependency>

controller:

  /**
     * 返回分页的统一JSON(需要jackson包)
     * @ResponseBody 返回json,
     */
    @RequestMapping(value = "/emps",method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmps(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo) {
     
        // 这不是一个分页查询;
        // 引入PageHelper分页插件
        // 在查询之前只需要调用,传入页码,以及每页的大小
        //开启分页
        PageHelper.startPage(pageNo, 5);
        // startPage后面紧跟的这个查询就是一个分页查询
        List<Employee> emps = employeeService.getAll();

        // 使用pageInfo包装查询后的结果,只需要将pageInfo交给页面就行了。
        // 封装了详细的分页信息,包括有我们查询出来的数据,传入连续显示的页数(总共每个页面设置5个分页)
        PageInfo page = new PageInfo(emps, 5);

        return Msg.success().add("pageInfo",page);
    }

窗口表单

<script type="text/javascript">

    //页面加载开始,直接发送ajax请求,获取分页数据
    $(function () {
      

        //点击新增按钮弹出模态框。
        $("#emp_add_modal_btn").click(function () {
      
            //清除表单数据(表单完整重置(表单的数据,表单的样式))
            // reset_form("#empAddModal form");
            //s$("")[0].reset();
            //发送ajax请求,查出部门信息,显示在下拉列表中
            // getDepts("#empAddModal select");
            //弹出模态框
            $("#empAddModal").modal({
      
                backdrop: "static"
            });
        });

    });
    script>

<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">×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" name="empName" class="form-control" id="empName_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 protected]">
                            <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_add_input" value="M" checked="checked">label>
                            <label class="radio-inline">
                                <input type="radio" name="gender" id="gender2_add_input" value="F">label>
                        div>
                    div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">deptName:label>
                        <div class="col-sm-4">
                            
                            <select class="form-control" name="dId">
                            select>
                        div>
                    div>
                form>
                <%--员工添加的表单结束--%>
            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>
            <%--按钮结束--%>


        div>
    div>
div>

jsr303校验

java中\是转义字符,需要加多一个\

导入依赖包:

    
        
      <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-validatorartifactId>
            <version>6.1.5.Finalversion>
        dependency>

1.引言

参数校验是我们程序开发中必不可少的过程。用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验。后端参数校验最简单的做法是直接在业务方法里面进行判断,当判断成功之后再继续往下执行。但这样带给我们的是代码的耦合,冗余。当我们多个地方需要校验时,我们就需要在每一个地方调用校验程序,导致代码很冗余,且不美观。

那么如何优雅的对参数进行校验呢?JSR303就是为了解决这个问题出现的,本篇文章主要是介绍 JSR303,Hibernate Validator 等校验工具的使用,以及自定义校验注解的使用。

2.校验框架介绍

JSR303 是一套JavaBean参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们JavaBean的属性上面,就可以在需要校验的时候进行校验了。注解如下:

@NotNull 注解元素必须是非空

@Null 注解元素必须是空

@Digits 验证数字构成是否合法

@Future 验证是否在当前系统时间之后

@Past 验证是否在当前系统时间之前

@Max 验证值是否小于等于最大指定整数值

@Min 验证值是否大于等于最小指定整数值

@Pattern 验证字符串是否匹配指定的正则表达式

@Size 验证元素大小是否在指定范围内

@DecimalMax 验证值是否小于等于最大指定小数值

@DecimalMin 验证值是否大于等于最小指定小数值

@AssertTrue 被注释的元素必须为true

@AssertFalse 被注释的元素必须为false

Hibernate validator 在JSR303的基础上对校验注解进行了扩展,扩展注解如下:

@Email 被注释的元素必须是电子邮箱地址

@Length 被注释的字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串的必须非空

@Range 被注释的元素必须在合适的范围内

例子:在bean中:

@Pattern(regexp="(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5})"
        ,message="用户名必须是2-5位中文或者6-16位英文和数字的组合")
private String empName;

@Pattern(regexp="^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$",
        message="邮箱格式不正确")
private String email;

控制器中:

  @RequestMapping(value = "/emp", method = RequestMethod.POST)
    @ResponseBody
    public Msg saveEmp(@Valid Employee employee, BindingResult result) {
     
        if(result.hasErrors()){
     
            //校验失败,应该返回失败,在模态框中显示校验失败的错误信息
            Map<String, Object> map = new HashMap<>();
            List<FieldError> errors = result.getFieldErrors();
            for (FieldError fieldError : errors){
     
                System.out.println("错误的字段名:"+fieldError.getField());
                System.out.println("错误信息:"+fieldError.getDefaultMessage());
                map.put(fieldError.getField(), fieldError.getDefaultMessage());
            }
            return Msg.fail().add("errorFields", map);
        }else {
     
            //若成功,返回success
            employeeService.saveEmp(employee);
            return Msg.success();
        }

    }

Restful接口(使用query参数)

新增员工POST:加上数据校验

@RequestMapping(value = "/emp", method = RequestMethod.POST)
@ResponseBody
public Msg saveEmp(@Valid Employee employee, BindingResult result) {
     
    if (result.hasErrors()) {
     
        //校验失败,应该返回失败,在模态框中显示校验失败的错误信息
        Map<String, Object> map = new HashMap<>();
        List<FieldError> errors = result.getFieldErrors();
        for (FieldError fieldError : errors) {
     
            System.out.println("错误的字段名:" + fieldError.getField());
            System.out.println("错误信息:" + fieldError.getDefaultMessage());
            map.put(fieldError.getField(), fieldError.getDefaultMessage());
        }
        return Msg.fail().add("errorFields", map);
    } else {
     
        //若成功,返回success
        employeeService.saveEmp(employee);
        return Msg.success();
    }

}

删除员工:DELETE:

@ResponseBody
@RequestMapping(value = "/emp/{id}",method = RequestMethod.DELETE)
public Msg deleteEmp(@PathVariable("id") Integer id){
     

    employeeService.deleteEmp(id);

    return Msg.success();
}

获取员工GET:

 /**
     * 获取员工信息
     * Restful风格
     */
    @RequestMapping(value = "/emp/{id}", method = RequestMethod.GET)
    @ResponseBody
    public Msg getEmp(@PathVariable("id") Integer id) {
     

        return Msg.success().add("emp", employeeService.getEmp(id));

    }

更新员工、问题PUT:

请求体中有数据;

但是Employee对象封装不上;

update tbl_emp where emp_id = 1014;

原因:

Tomcat:

1、将请求体中的数据,封装一个map。

2、request.getParameter(“empName”)就会从这个map中取值。

3、SpringMVC封装POJO对象的时候。

会把POJO中每个属性的值,request.getParamter(“email”);

AJAX发送PUT请求引发的血案:

PUT请求,请求体中的数据,request.getParameter(“empName”)拿不到

Tomcat一看是PUT不会封装请求体中的数据为map,只有POST形式的请求才封装请求体为map

解决方案;

  • 我们要能支持直接发送PUT之类的请求还要封装请求体中的数据
  • 1、配置上HttpPutFormContentFilter;
  • 2、他的作用;将请求体中的数据解析包装成一个map。
  • 3、request被重新包装,request.getParameter()被重写,就会从自己封装的map中取数据

web.xml配置:

  	
    <filter>
        <filter-name>hiddenHttpMethodFilterfilter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>
    <filter>
        
        <filter-name>HttpPutFormContentFilterfilter-name>
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>HttpPutFormContentFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

控制器:

 @RequestMapping(value = "/emp/{empId}",method = RequestMethod.PUT)
    @ResponseBody
    public Msg saveEmp(Employee employee){
     

        employeeService.update(employee);
        return Msg.success();
    }

总结:

API,控制器中需要添加@CrossOrigin(origins = “*”, maxAge = 3600),否则没有 权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68O127Y8-1594696943077)(C:\Users\JUN\AppData\Roaming\Typora\typora-user-images\image-20200626012554768.png)]

依赖文件:pom.xml:


    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>1.8maven.compiler.source>
        <maven.compiler.target>1.8maven.compiler.target>
        
        <spring.version>5.0.2.RELEASEspring.version>
        <slf4j.version>1.6.6slf4j.version>
        
        <log4j.version>1.2.12log4j.version>
        
        <mysql.version>5.1.6mysql.version>
        
        <mybatis.version>3.4.5mybatis.version>

    properties>

    <dependencies>


        
        
        <dependency>
            <groupId>org.mybatis.generatorgroupId>
            <artifactId>mybatis-generator-coreartifactId>
            <version>1.3.7version>
        dependency>

        
        
      <dependency>
            <groupId>org.hibernategroupId>
            <artifactId>hibernate-validatorartifactId>
            <version>6.1.5.Finalversion>
        dependency>

        
        <dependency>
            
            <groupId>org.aspectjgroupId>
            <artifactId>aspectjweaverartifactId>
            <version>1.6.8version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-webmvcartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>${spring.version}version>
        dependency>

        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-txartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>${spring.version}version>
        dependency>

        <dependency>
            
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
            <scope>testscope>
        dependency>
        <dependency>
            
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>${mysql.version}version>
        dependency>

        
        
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>javax.servlet-apiartifactId>
            <version>3.1.0version>
            <scope>providedscope>
        dependency>
        <dependency>
            
            <groupId>javax.servlet.jspgroupId>
            <artifactId>jsp-apiartifactId>
            <version>2.0version>
            <scope>providedscope>
        dependency>
        <dependency>
            
            <groupId>jstlgroupId>
            <artifactId>jstlartifactId>
            <version>1.2version>
        dependency>

        
        <dependency>
            <groupId>log4jgroupId>
            <artifactId>log4jartifactId>
            <version>${log4j.version}version>
        dependency>
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-apiartifactId>
            <version>${slf4j.version}version>
        dependency>
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-log4j12artifactId>
            <version>${slf4j.version}version>
        dependency>
        

        <dependency>
            
            <groupId>org.mybatisgroupId>
            <artifactId>mybatisartifactId>
            <version>${mybatis.version}version>
        dependency>
        
        <dependency>
            <groupId>com.github.pagehelpergroupId>
            <artifactId>pagehelperartifactId>
            <version>5.1.2version>
        dependency>
        <dependency>
            
            <groupId>org.mybatisgroupId>
            <artifactId>mybatis-springartifactId>
            <version>1.3.0version>
        dependency>
        <dependency>
            
            <groupId>c3p0groupId>
            <artifactId>c3p0artifactId>
            <version>0.9.1.2version>
            <type>jartype>
            <scope>compilescope>
        dependency>
        
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.12version>
        dependency>

        
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
            <version>2.9.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-coreartifactId>
            <version>2.9.0version>
        dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-annotationsartifactId>
            <version>2.9.0version>
        dependency>

    dependencies>

web.xml:


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <display-name>Archetype Created Web Applicationdisplay-name>

    <servlet-mapping>
        
        <servlet-name>defaultservlet-name>
        <url-pattern>*.jpgurl-pattern>
        <url-pattern>*.pngurl-pattern>
        <url-pattern>*.cssurl-pattern>
        <url-pattern>*.htmlurl-pattern>
        <url-pattern>*.jsurl-pattern>
        <url-pattern>*.*.jsurl-pattern>
        <url-pattern>*.iocurl-pattern>
    servlet-mapping>


    
    
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring/applicationContext.xmlparam-value>
    context-param>
    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

    
    <servlet>
        <servlet-name>dispatcherServletservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            
            <param-value>classpath:spring/springmvc.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
    servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServletservlet-name>
        
        <url-pattern>/url-pattern>
    servlet-mapping>


    
    <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        
        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
        <init-param>
            <param-name>forceRequestEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
        <init-param>
            <param-name>forceResponseEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>

    
    <filter>
        <filter-name>hiddenHttpMethodFilterfilter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilterfilter-name>
        
        <url-pattern>/*url-pattern>
    filter-mapping>
    <filter>
        
        <filter-name>HttpPutFormContentFilterfilter-name>
        <filter-class>org.springframework.web.filter.HttpPutFormContentFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>HttpPutFormContentFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

web-app>

applicationContext.xml:


<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: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">

    
    <context:component-scan base-package="cn.codewhite" use-default-filters="false">
        
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
        
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

    context:component-scan>


    
    <context:property-placeholder location="classpath:mybatis/jdbc.properties"/>

    
    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    bean>

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        
        <property name="dataSource" ref="dataSource"/>
        
        <property name="configLocation" value="classpath:mybatis/sqlMapperContext.xml"/>
        
        <property name="mapperLocations" value="classpath:cn/codewhite/dao/*.xml"/>
    bean>

    
    <bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        
        <property name="basePackage" value="cn.codewhite.dao"/>
    bean>

    
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
        <constructor-arg name="executorType" value="BATCH"/>
    bean>
    

    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        
        <property name="dataSource" ref="dataSource"/>
    bean>


    
    <aop:config>
        
        <aop:pointcut id="txPoint" expression="execution(* cn.codewhite.service.impl.*.*(..))"/>
        
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
    aop:config>

    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            
            <tx:method name="*" read-only="false"/>
            
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
        tx:attributes>
    tx:advice>

    
beans>

springmvc.xml:


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

    
    <context:component-scan base-package="cn.codewhite" use-default-filters="false">
        
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    context:component-scan>

    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/pages/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>

    <mvc:resources location="/js/" mapping="/js/**"/>


    
    
    <mvc:default-servlet-handler/>
    
    
    <mvc:annotation-driven/>

beans>

sqlMapperContext.xml




<configuration>

    <settings>
        
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="jdbcTypeForNull" value="NULL"/>
        
        
        <setting name="cacheEnabled" value="false"/>
        
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    settings>
    
    <typeAliases>
        <package name="cn.codewhite.pojo"/>
    typeAliases>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            
            <property name="reasonable" value="true"/>
        plugin>
    plugins>

configuration>

你可能感兴趣的:(Java框架,JavaEE,数据库,java,bootstrap,restful,java,spring,mybatis,mybatis3.3.0)