maven项目整合SSM框架实现crud案例

  1. 创建一个maven工程
  2. 引入项目依赖的jar包:spring、springmvc、mybatis、数据库连接池驱动包、其他(jstl、servlet-api、junit)
  3. 引入bootstrap前端框架
  4. 编写ssm整合关键配置文件:web.xml、spring、springmvc、mybatis,使用mybatis逆向工程生成对应的bean和mapper
  5. 测试mapper
    /**
     * 1.PageHelper的使用:
     *      引入依赖
     *      在mybatis配置文件中注册该插件
     * 2.每个方法中注解的具体含义
     * 3.Model/Map 请求域
     * 4.注意@Controller
     * 5.添加员工,模态框中的信息,使用js的serialize()方法,将表单中的内容序列为字符串,用于ajax请求
     * 6.查询员工信息从url取id,使用@PathVariable
     * 7.ajax发送put请求:
     *      Tomcat会将请求体中的数据封装成一个map对象。
     *      但Tomcat一看是PUT请求,就不会把请求体中的数据封装成map,只有POST会
     *      在web.xml中配置一个HttpPutFormContentFilter
     */

     

1.创建一个maven项目

新创建的maven项目如果没有web.xml,可以右击项目——>properties——>Project Facets,把Dynamic Web Module的勾去掉,然后再勾中来创建

项目结构如上,src/main/java中放主要代码,src/main/resources中放配置文件,mapper中放mapper映射文件,webapp中的static放页面需要的一些素材等

2.引入项目依赖的jar包

在pom.xml中导入依赖,相关依赖可从maven repository中查

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.atguigu</groupId>
  <artifactId>ssm-crud</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

	<!-- 引入项目依赖的jar包 -->
	<dependencies>
		<!-- SpringMVC、Spring -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-webmvc</artifactId>
		    <version>4.3.7.RELEASE</version>
		</dependency>
		<!-- jackson,返回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数据校验 -->
		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
		<dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-validator</artifactId>
		    <version>5.4.1.Final</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/com.mchange/c3p0 -->
		<dependency>
		    <groupId>c3p0</groupId>
		    <artifactId>c3p0</artifactId>
		    <version>0.9.1</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.11</version>
		</dependency>
		<!-- jstl -->
		<!-- https://mvnrepository.com/artifact/jstl/jstl -->
		<dependency>
		    <groupId>jstl</groupId>
		    <artifactId>jstl</artifactId>
		    <version>1.2</version>
		</dependency>
		<!-- servlet-api -->
		<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>javax.servlet-api</artifactId>
		    <version>3.0.1</version>
		    <!-- 服务器本身有这个包,在发布时会被剔除 -->
		    <scope>provided</scope>
		</dependency>
		<!-- junit -->
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
		    <groupId>junit</groupId>
		    <artifactId>junit</artifactId>
		    <version>4.12</version>
		    <scope>test</scope>
		</dependency>
		<!-- 逆向工程 -->
		<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
		<dependency>
		    <groupId>org.mybatis.generator</groupId>
		    <artifactId>mybatis-generator-core</artifactId>
		    <version>1.3.7</version>
		</dependency>
		<!-- Mybatis分页PageHelper -->
		<dependency>
		    <groupId>com.github.pagehelper</groupId>
		    <artifactId>pagehelper</artifactId>
		    <version>5.0.0</version>
		</dependency>
	</dependencies>
</project>

3.引入bootstrap前端框架

使用bootstrap,导入所需文件并在相应页面中引入

<!-- 引入jquery -->
<script type="text/javascript" src="static/js/jquery.min.js"></script>
<!-- 引入样式 -->
<link href="static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

4.编写ssm整合的配置文件

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_2_5.xsd" 
	id="WebApp_ID" version="2.5">

	<!-- 1.启动spring容器 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	
	<!-- 2.springmvc的前端控制器,拦截所有请求 -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置servlet的初始化参数,告知servlet springmvc的配置文件位置 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
  	</servlet>
  	<servlet-mapping>
  		<servlet-name>dispatcherServlet</servlet-name>
  		<url-pattern>/</url-pattern>
  	</servlet-mapping>
  	
  	<!-- 3.字符编码过滤器,一定要放到所有过滤器之前 -->
  	<filter>
  		<filter-name>CharacterEncodingFilter</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>forceRequestEncoding</param-name>
  			<param-value>true</param-value>
  		</init-param>
  		<init-param>
  			<param-name>forceResponseEncoding</param-name>
  			<param-value>true</param-value>
  		</init-param>
  	</filter>
  	<filter-mapping>
  		<filter-name>CharacterEncodingFilter</filter-name>
  		<url-pattern>/*</url-pattern>
  	</filter-mapping>
  	
  	<!-- 4.使用REST风格URI -->
  	<filter>
  		<filter-name>HiddenHttpMethodFilter</filter-name>
  		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  	</filter>
  	<filter-mapping>
  		<filter-name>HiddenHttpMethodFilter</filter-name>
  		<url-pattern>/*</url-pattern>
  	</filter-mapping>
</web-app>

spring的applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns: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.数据源
    	2.与mybatis整合
    	3.事务控制
     -->
    
  	<!-- spring的配置文件,主要配置和业务逻辑有关的 -->
  	<context:property-placeholder location="classpath:dbconfig.properties"/>
  	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
  		<property name="driverClass" value="${jdbc.driverClass}"></property>
  		<property name="user" value="${jdbc.user}"></property>
  		<property name="password" value="${jdbc.password}"></property>
  	</bean>
  	
  	<!-- spring扫描组件不扫描控制器 -->
  	<context:component-scan base-package="com.atguigu">
  		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  	</context:component-scan>
  	
  	<!-- 与mybatis整合的配置 -->
  	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  		<!-- 指定mybatis全局配置文件路径 -->
  		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
  		<property name="dataSource" ref="dataSource"></property>
  		<!-- 指定mybatis的mapper文件位置 -->
  		<property name="mapperLocations" value="classpath:mapper/*.xml"></property>
  	</bean>
  	<!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 -->
  	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  		<!-- 扫描所有dao接口实现,加入到ioc -->
  		<property name="basePackage" value="com.atguigu.crud.dao"></property>
  	</bean>
  	
  	<!-- 事务控制配置 -->
  	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  		<!-- 控制数据源 -->
  		<property name="dataSource" ref="dataSource"></property>
  	</bean>
  	<!-- 使用xml配置文件形式配置事务 -->
  	<aop:config>
  		<!-- 切入点表达式 -->
  		<aop:pointcut expression="execution(* com.atguigu.crud.service..*(..))" id="txPoint"/>
  		<!-- 配置事务增强 -->
  		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
  	</aop:config>
  	<!-- 配置事务增强,事务如何切入 -->
  	<tx:advice id="txAdvice" transaction-manager="transactionManager">
  		<tx:attributes>
  			<!-- 所有方法都是事务方法 -->
  			<tx:method name="*"/>
  			<!-- 以get开始的所有方法 -->
  			<tx:method name="get*" read-only="true"/>
  		</tx:attributes>
  	</tx:advice>
  	
</beans>

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"    
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     
		xmlns:context="http://www.springframework.org/schema/context"       
		xmlns:mvc="http://www.springframework.org/schema/mvc"    
		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">
		
	<!-- springmvc配置文件,包含网站跳转逻辑的控制 -->
	<!-- <context:component-scan base-package="com.atguigu" use-default-filters="false">
		只扫描控制器
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
	</context:component-scan> -->
	<context:component-scan base-package="com.atguigu.crud.controller"></context:component-scan>
	
	<!-- 配置springmvc 注解驱动 -->
	<mvc:annotation-driven>
		
	</mvc:annotation-driven>
	
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 两个标准配置 -->
	<!-- 1.将springmvc不能处理的请求交给tomcat -->
	<mvc:default-servlet-handler/>
	<!-- 2.支持springmvc更高级的一些功能,如jsr303校验、快捷的ajax -->
</beans>

mybatis-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.atguigu.crud.bean"/>
	</typeAliases>
</configuration>

5.使用逆向工程生成bean和mapper映射文件

mbg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

  <context id="DB2Tables" targetRuntime="MyBatis3">
  
  	<!-- 不生成注释 -->
	<commentGenerator>
		<property name="suppressAllComments" value="true"/>
	</commentGenerator>
	
  	<!-- 配置数据库连接 -->
    <jdbcConnection 
    	driverClass="com.mysql.cj.jdbc.Driver"
        connectionURL="jdbc:mysql://localhost:3306/crm?&amp;userSSL=false&amp;serverTimezone=UTC"
        userId="root"
        password="123">
    </jdbcConnection>

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

	<!-- 指定JavaBean生成的位置 -->
    <javaModelGenerator targetPackage="com.atguigu.crud.bean" targetProject=".\src\main\java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

	<!-- 指定sql映射文件生成的位置 -->
    <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>


	<!-- 指定dao接口(mapper)接口生成位置 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.crud.dao"  targetProject=".\src\main\java">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    
	<!-- 指定每个表的生成策略 -->
	<table tableName="tbl_emp" domainObjectName="Employee"></table>
	<table tableName="tbl_dept" domainObjectName="Department"></table>

  </context>
</generatorConfiguration>

运行代码执行逆向工程

public class MBGTest {
	public static void main(String[] args) throws Exception {
		List<String> warnings = new ArrayList<String>();
		boolean overwrite = true;
		File configFile = new File("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);
	}
}

6.测试自动生成的mapper

在test包里创建一个测试类

/**
 * Spring项目可以使用Spring的单元测试
 * 1.导入spring-test jar
 * 2.@ContextConfiguration指定spring配置文件
 * 3.@RunWith指定使用Spring单元测试模块
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class MapperTest {
	@Autowired
	DepartmentMapper departmentMapper;
	
	@Autowired
	EmployeeMapper employMapper;
	
	@Autowired
	SqlSession sqlSession;
	
	@Test
	public void testCRUD(){
		//1.创建容器
		//ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.获取mapper
		//DepartmentMapper departmentMapper = ioc.getBean(DepartmentMapper.class);
		//departmentMapper.insertSelective(new Department(null, "公关部"));
		//插入部门数据
		//departmentMapper.insertSelective(new Department(null, "开发部"));
		//departmentMapper.insertSelective(new Department(null, "测试部"));
		//插入员工数据
		//employMapper.insertSelective(new Employee(null, "BZZB", "M", "HXB@LENLEN.COM", 1));
		//批量插入员工
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		for (int i = 0; i < 100; i++) {
			String uuid = UUID.randomUUID().toString().substring(0, 5);
			employeeMapper.insertSelective(new Employee(null, uuid, "M", uuid+"@xx.com", 1));
		}
	}
}

批量生成测试数据需要在spring的配置文件中配置一个sqlSession

  	<!-- 配置一个可以执行批量操作的sqlSession -->
  	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
  		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
  		<constructor-arg name="executorType" value="BATCH"></constructor-arg>
  	</bean>

完成CRUD

一、数据显示

  1. 访问index.jsp页面
  2. index.jsp页面发送出查询员工列表请求
  3. EmployeeController接收请求,查出员工数据
  4. 来到list.jsp页面进行展示

使用PageHelper,需要在pom.xml中导入依赖

<!-- Mybatis分页PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>5.0.0</version>
</dependency>

在mybatis-config.xml中引入插件

<!-- 引入分页插件 -->
	<plugins>
		<plugin interceptor="com.github.pagehelper.PageInterceptor">
			
		</plugin>
	</plugins>

1.index.jsp中

<jsp:forward page="/emps"></jsp:forward>

2.EmployeeController.java

@Controller
public class EmployeeController {
	
	@Autowired
	EmployeeService employeeService;
	
	@RequestMapping("/emps")
	public String getAllEmp(@RequestParam(value="pn",defaultValue="1")Integer pn, Model model){
		//调用分页查询插件,传入页码和每页数据条数
		PageHelper.startPage(pn, 5);
		//分页查询
		List<Employee> emps = employeeService.getAllEmp();
		//封装分页信息并传递给页面
		PageInfo page = new PageInfo(emps,5);
		model.addAttribute("pageInfo",page);
		return "list";
	}
}

3.EmployeeService.java

@Service
public class EmployeeService {
	//逆向工程生成的Mapper
	@Autowired
	EmployeeMapper employeeMapper;

	public List<Employee> getAllEmp() {
		return employeeMapper.selectByExampleWithDept(null);
	}
	
}

4.list.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());
%>
<!-- 引入jquery -->
<script type="text/javascript" src="${APP_PATH }/static/js/jquery.min.js"></script>
<!-- 引入样式 -->
<link href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<!-- 标题 -->
		<div class="row">
			<div class="col-md-12">
				<h1>SSM-CRUD</h1>
			</div>
		</div>
		<!-- 按钮 -->
		<div class="row">
			<div class="col-md-4 col-md-offset-8">
				<button class="btn btn-primary">新增</button>
				<button class="btn btn-danger">删除</button>
			</div>
		</div>
		<!-- 显示数据 -->
		<div class="row">
			<div class="col-md-12">
				<table class="table table-hover">
					<tr>
						<th>#</th>
						<th>empName</th>
						<th>gender</th>
						<th>email</th>
						<th>deptName</th>
						<th>操作</th>
					</tr>
					<c:forEach items="${pageInfo.list }" var="emp">
						<tr>
							<td>${emp.empId }</td>
							<td>${emp.empName }</td>
							<td>${emp.gender=='M'?"男":"女" }</td>
							<td>${emp.email }</td>
							<td>${emp.department.deptName }</td>
							<td>
								<button class="btn btn-primary btn-sm">
									<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> 新增
								</button>
								<button class="btn btn-danger btn-sm">
									<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> 删除
								</button>
							</td>
						</tr>
					</c:forEach>
				</table>
			</div>
		</div>
		<!-- 分页信息 -->
		<div class="row">
			<div class="col-md-6">
				当前${pageInfo.pageNum }页,共${pageInfo.pages }页,共${pageInfo.total }条记录
			</div>
			<div class="col-md-6">
				<nav aria-label="Page navigation">
					<ul class="pagination">
						<li><a href="${APP_PATH }/emps?pn=1">首页</a></li>
						<c:if test="${pageInfo.hasPreviousPage }">
							<li>
				    		<a href="${APP_PATH }/emps?pn=${pageInfo.pageNum-1 }" aria-label="Previous">
					        	<span aria-hidden="true">&laquo;</span>
					      	</a>
					    </li>
						</c:if>
					    <c:forEach items="${pageInfo.navigatepageNums }" var="page_Num">
					    	<c:if test="${page_Num == pageInfo.pageNum }">
					    		<li class="active"><a href="#">${page_Num }</a></li> 
					    	</c:if>
					    	<c:if test="${page_Num != pageInfo.pageNum }">
					    		<li><a href="${APP_PATH }/emps?pn=${page_Num }">${page_Num }</a></li>
					    	</c:if>
					    </c:forEach>
					    <c:if test="${pageInfo.hasNextPage }">
					    	<li>
				      		<a href="${APP_PATH }/emps?pn=${pageInfo.pageNum+1}" aria-label="Next">
				        		<span aria-hidden="true">&raquo;</span>
				      		</a>
				    	</li>
					    </c:if>
				    	<li><a href="${APP_PATH }/emps?pn=${pageInfo.pages}">末页</a></li>
				  	</ul>
				</nav>
			</div>
		</div>
	</div>
</body>
</html>

以上的查询是有index.jsp转发到emps请求,改造成ajax实现

1.index.jsp页面直接发送ajax请求

2.服务器将查出的数据以json字符串的形式返回给浏览器

3.浏览器使用js对json字符串进行解析,显示数据

创建一个Msg类,封装服务器返回给浏览器的信息

public class Msg {
	//状态码
	private int code;
	//提示信息
	private String msg;
	//用户要返回给浏览器的数据
	private Map<String, Object> extend = new HashMap<String, Object>();
	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 static Msg success(){
		Msg result = new Msg();
		result.setCode(100);
		result.setMsg("处理成功");
		return result;
	}
	//失败时的返回内容
	public static Msg failure(){
		Msg result = new Msg();
		result.setCode(200);
		result.setMsg("处理失败");
		return result;
	}
	//控制器中处理请求的方法返回一个Msg对象,这个对象通过下面方法添加内容
	public Msg add(String key, Object value){
		this.getExtend().put(key, value);
		return this;
	}
}

控制器方法

	/*
	 * json版
	 */
	@RequestMapping("/emps")
	@ResponseBody
	public Msg getEmpsWithJson(@RequestParam(value="pn",defaultValue="1")Integer pn){
		PageHelper.startPage(pn, 5);
		List<Employee> emps = employeeService.getAllEmp();
		PageInfo page = new PageInfo(emps,5);
		return Msg.success().add("pageInfo", page);
	}

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());
%>
<!-- 引入jquery -->
<script type="text/javascript" src="${APP_PATH }/static/js/jquery.min.js"></script>
<!-- 引入样式 -->
<link href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<!-- 标题 -->
		<div class="row">
			<div class="col-md-12">
				<h1>SSM-CRUD</h1>
			</div>
		</div>
		<!-- 按钮 -->
		<div class="row">
			<div class="col-md-4 col-md-offset-8">
				<button class="btn btn-primary">新增</button>
				<button class="btn btn-danger">删除</button>
			</div>
		</div>
		<!-- 显示数据 -->
		<div class="row">
			<div class="col-md-12">
				<table class="table table-hover" id="emps_table">
					<thead>
						<tr>
							<th>#</th>
							<th>empName</th>
							<th>gender</th>
							<th>email</th>
							<th>deptName</th>
							<th>操作</th>
						</tr>
					</thead>
					<tbody>
						<!-- jquery动态添加表格数据 -->
					</tbody>
				</table>
			</div>
		</div>
		<!-- 分页信息 -->
		<div class="row">
			<div class="col-md-6" id="page_info">
				<!-- jquery动态添加分页信息 -->
			</div>
			<div class="col-md-6" id="page_bar">			
				<!-- jquery动态添加分页条 -->
			</div>
		</div>
	</div>
	<script type="text/javascript">
		//页面加载完成后,发送一个请求分页数据的ajax请求
		$(function(){
			//去首页
			to_page(1)
		});
		//把ajax请求抽取成一个方法,点击分页条页码每次跳转页面时都会发送请求
		function to_page(pn){
			$.ajax({
				url:"${APP_PATH}/emps",
				data:"pn="+pn,
				type:"GET",
				success:function(result){ //这个result就是成功后服务器相应给浏览器的数据
					//1.解析并显示员工数据
					build_emps_table(result);
					//2.解析并显示分页信息
					build_page_info(result)
					//3.解析并显示分页条
					build_page_nav(result);
				}
			});
		}
		//构建表格内容,显示员工信息
		function build_emps_table(result){
			//构建表格前先清空,避免跳转到其他页面时所有元素直接append,而不是每页五条
			$("#emps_table tbody").empty();
			var emps = result.extend.pageInfo.list;
			//遍历员工集合并生成每个表格元素
			$.each(emps,function(index,item){
				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 editBtn = $("<button></button").addClass("btn btn-primary btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑");
				var delBtn = $("<button></button").addClass("btn btn-danger btn-sm").append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除");
				var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);
				$("<tr></tr>").append(empIdTd)
				.append(empNameTd)
				.append(genderTd)
				.append(emailTd)
				.append(deptNameTd)
				.append(btnTd)
				.appendTo("#emps_table tbody");		
			});
		}
		//构建分页信息
		function build_page_info(result){
			$("#page_info").empty();
			$("#page_info").append("当前"+result.extend.pageInfo.pageNum+"页,共"+result.extend.pageInfo.pages+"页,共"+result.extend.pageInfo.total+"条记录");
		}
		//构建分页条
		function build_page_nav(result){
			$("#page_bar").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);
				});
			}
			ul.append(firstPageLi).append(prePageLi);
			$.each(result.extend.pageInfo.navigatepageNums,function(index,item){
				var numLi = $("<li></li>").append($("<a></a>").append(item));
				if(result.extend.pageInfo.pageNum == item){
					numLi.addClass("active");
				}
				numLi.click(function(){
					to_page(item);
				});
				ul.append(numLi);
			});
			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); 
				});
			}
			ul.append(nextPageLi).append(lastPageLi);
			var navEle = $("<nav></nav>").append(ul);
			navEle.appendTo("#page_bar");
		}
	</script>
</body>
</html>

二、新增员工

1.在index.jsp点击新增

2.弹出新增对话框

3.去数据库查询部门列表,显示在对话框中

4.输入员工信息,校验信息是否正确(格式、用户名重复(给员工姓名控件绑定一个change事件,一旦改变,发送ajax请求查询数据库是否已有同名))jquery前端校验、ajax用户名重复校验、重要数据后端校验(针对绕过前端校验,比如直接发送添加员工请求,而不是通过点击保存按钮)(springmvc的jsr303)

使用JSR303方法:

(1).在pom.xml中引入依赖

        <!-- JSR303数据校验 -->
		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
		<dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-validator</artifactId>
		    <version>5.4.1.Final</version>
		</dependency>

 (2).在实体类需要校验的属性上面加注解

(3).在控制器的方法上给形参加上注解,并把校验可能出现的错误返回给浏览器

    /**
	 * 员工保存
	 * 添加后端校验
	 */
	@RequestMapping(value="/emp",method=RequestMethod.POST)
	@ResponseBody
	public Msg saveEmp(@Valid Employee employee,BindingResult result){
		if(result.hasErrors()){
			Map<String,Object> map = new HashMap<String,Object>();
			List<FieldError> fieldErrors = result.getFieldErrors();
			for (FieldError fieldError : fieldErrors) {
				//错误字段名与错误信息
				map.put(fieldError.getField(), fieldError.getDefaultMessage());
			}
			return Msg.failure().add("errorFields", map);
		}else{
			employeeService.saveEmp(employee);
			return Msg.success();
		}
	}

5.保存

 

 

 

 

1.员工修改id绑定;ajax使用put请求需要使用HttpPutFormContentFilter过滤器;

 

 

 

<%@ 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());
%>
<!-- 引入jquery -->
<script type="text/javascript" src="${APP_PATH }/static/js/jquery.min.js"></script>
<!-- 引入样式 -->
<link href="${APP_PATH }/static/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script src="${APP_PATH }/static/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
</head>
<body>

	<!-- 员工修改模态框 -->
	<div class="modal fade" id="empEditModal" 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">员工姓名</label>
			    <div class="col-sm-10">
			      <p class="form-control-static" id="empname_edit"></p>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">电子邮件</label>
			    <div class="col-sm-10">
			      <input type="text" name="email" class="form-control" id="email_edit" placeholder="email@atguigu.com">
			      <span class="help-block"></span>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">性别</label>
			    <div class="col-sm-10">
			      <label class="radio-inline">
				  	<input type="radio" name="gender" id="gender_edit" value="M" checked="checked"> 男
				  </label>
			      <label class="radio-inline">
				  	<input type="radio" name="gender" id="gender_edit" value="F"> 女
				  </label>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">所属部门</label>
			    <div class="col-sm-4">
			      <select class="form-control" name="dId" id="deptName">
					  
				  </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_edit">更新</button>
	      </div>
	    </div>
	  </div>
	</div>



	<!-- 员工添加模态框 -->
	<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" id="empInfo_add">
			  <div class="form-group">
			    <label class="col-sm-2 control-label">员工姓名</label>
			    <div class="col-sm-10">
			      <input type="text" name="empName" class="form-control" id="empname_add" placeholder="姓名">
			      <span class="help-block"></span>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">电子邮件</label>
			    <div class="col-sm-10">
			      <input type="text" name="email" class="form-control" id="email_add" placeholder="email@atguigu.com">
			      <span class="help-block"></span>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">性别</label>
			    <div class="col-sm-10">
			      <label class="radio-inline">
				  	<input type="radio" name="gender" id="gender_add" value="M" checked="checked"> 男
				  </label>
			      <label class="radio-inline">
				  	<input type="radio" name="gender" id="gender_add" value="F"> 女
				  </label>
			    </div>
			  </div>
			  <div class="form-group">
			    <label class="col-sm-2 control-label">所属部门</label>
			    <div class="col-sm-4">
			      <select class="form-control" name="dId" id="deptName">
					  
				  </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">保存</button>
	      </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-4 col-md-offset-8">
				<button class="btn btn-primary" id="emp_add_modal">新增</button>
				<button class="btn btn-danger" id="emp_delete_all">删除</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>
						<!-- jquery动态添加表格数据 -->
					</tbody>
				</table>
			</div>
		</div>
		<!-- 分页信息 -->
		<div class="row">
			<div class="col-md-6" id="page_info">
				<!-- jquery动态添加分页信息 -->
			</div>
			<div class="col-md-6" id="page_bar">			
				<!-- jquery动态添加分页条 -->
			</div>
		</div>
	</div>
	<script type="text/javascript">
		//总记录条数
		var totalRecord;
		//当前页码
		var currentPageNum;
		//页面加载完成后,发送一个请求分页数据的ajax请求
		$(function(){
			//去首页
			to_page(1)
		});
		//把ajax请求抽取成一个方法,点击分页条页码每次跳转页面时都会发送请求
		function to_page(pn){
			$.ajax({
				url:"${APP_PATH}/emps",
				data:"pn="+pn,
				type:"GET",
				success:function(result){ //这个result就是成功后服务器相应给浏览器的数据
					//1.解析并显示员工数据
					build_emps_table(result);
					//2.解析并显示分页信息
					build_page_info(result)
					//3.解析并显示分页条
					build_page_nav(result);
				}
			});
		}
		//构建表格内容,显示员工信息
		function build_emps_table(result){
			//构建表格前先清空,避免跳转到其他页面时所有元素直接append,而不是每页五条
			$("#emps_table tbody").empty();
			var emps = result.extend.pageInfo.list;
			//遍历员工集合并生成每个表格元素
			$.each(emps,function(index,item){
				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 editBtn = $("<button></button").addClass("btn btn-primary btn-sm edit_btn").append($("<span></span>").addClass("glyphicon glyphicon-pencil")).append("编辑");
				//给编辑按钮绑定对应员工id
				editBtn.attr("edit-id",item.empId);
				var delBtn = $("<button></button").addClass("btn btn-danger btn-sm delete_btn").append($("<span></span>").addClass("glyphicon glyphicon-trash")).append("删除");
				delBtn.attr("delete-id",item.empId);
				var btnTd = $("<td></td>").append(editBtn).append(" ").append(delBtn);
				$("<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").empty();
			$("#page_info").append("当前"+result.extend.pageInfo.pageNum+"页,共"+result.extend.pageInfo.pages+"页,共"+result.extend.pageInfo.total+"条记录");
			totalRecord = result.extend.pageInfo.total;
			currentPageNum = result.extend.pageInfo.pageNum;
		}
		//构建分页条
		function build_page_nav(result){
			$("#page_bar").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);
				});
			}
			ul.append(firstPageLi).append(prePageLi);
			$.each(result.extend.pageInfo.navigatepageNums,function(index,item){
				var numLi = $("<li></li>").append($("<a></a>").append(item));
				if(result.extend.pageInfo.pageNum == item){
					numLi.addClass("active");
				}
				numLi.click(function(){
					to_page(item);
				});
				ul.append(numLi);
			});
			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); 
				});
			}
			ul.append(nextPageLi).append(lastPageLi);
			var navEle = $("<nav></nav>").append(ul);
			navEle.appendTo("#page_bar");
		}
		
		//点击新增按钮,向数据库查询部门信息,弹出模态框
		$("#emp_add_modal").click(function(){
			//模态框弹出之前,清除表单数据
			//也可以在模态框关闭时清空,下面写了
			//$("#empInfo")[0].reset();
			reset_form("#empInfo_add")
			//发送查询数据库的ajax请求
			getDepts("#empAddModal select");
			//弹出模态框
			$("#empAddModal").modal({
				backdrop:"static"
			});
		});
		
		//清空表单样式及内容
		function reset_form(ele){
			$(ele)[0].reset();
			$(ele).find("*").removeClass("has-error has-success");
			$(ele).find(".help-block").text("");
		}
		
		//查出所有部门信息
		function getDepts(ele){
			//每次获取数据之前先清空上一次已经
			$(ele).empty();
			$.ajax({
				url:"${APP_PATH}/depts",
				type:"GET",
				success:function(result){
					//成功之后,result中都是部门信息,添加到模态框的下拉列表中
					$.each(result.extend.depts,function(){
						var optionEle = $("<option></option>").append(this.deptName).attr("value",this.deptId);
						optionEle.appendTo(ele);
					});
				}
			});
		}
		$("#emp_save").click(function(){
			//先前端校验填写的数据
			if(!validate_empInfo_form()){
				return false;
			}  
			//1.判断用户名校验结果
			if($(this).attr("ajax-va")=="error"){
				return false;
			}
			//2.将模态框中填写的员工数据提交
			$.ajax({
				url:"${APP_PATH}/emp",
				type:"POST",
				//jquery提供serialize()方法序列化表单内容为字符串,用于ajax请求
				data:$("#empInfo_add").serialize(),
				success:function(result){
					//alert(result.msg);
					if(result.code == 100){
						//员工保存成功
						//1.关闭模态框
						$("#empAddModal").modal("hide");
						//关闭模态框时清空表单数据
						/* $('#empAddModal').on('hidden.bs.modal', function (){
							document.getElementById("empInfo_add").reset();
						}); */
						//2.显示最新添加的数据
						//发送ajax请求显示最后一页即可
						//PageHelper插件有一个功能:跳转到比最大页码还大的页,就跳转到最后一页
						//保险起见,可以把记录条数当成要跳转的页码,全局定义一个记录条数变量
						to_page(totalRecord); 
					}else{
						//显示失败信息
						//如果字段正确,为undefined
						//邮箱错误
						if(undefined != result.extend.errorFields.email){
							show_validate_msg("#email_add", "error", result.extend.errorFields.email);
						}
						//名称错误
						if(undefined != result.extend.errorFields.empName){
							show_validate_msg("#empname_add", "error", result.extend.errorFields.empName);						
						}
					}
				}
			});
		});
		
		//校验模态框中员工姓名与email
		function validate_empInfo_form(){
			//使用正则
			var empName = $("#empname_add").val();
			var regName = /(^[a-zA-Z0-9_-]{6,16}$)|(^[\u2E80-\u9FFF]{2,5}$)/;
			if(!regName.test(empName)){
				show_validate_msg("#empname_add", "error", "6~16位字母数字组合或2~5位汉字");
				return false;
			}else{
				show_validate_msg("#empname_add", "success", "");
			}
			var email = $("#email_add").val();
			var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
			if(!regEmail.test(email)){
				show_validate_msg("#email_add", "error", "请输入正确邮箱地址");
				return false;
			}else{
				show_validate_msg("#email_add", "success", "");
			}
			return true;
		}
		//抽取表单验证结果显示
		function show_validate_msg(ele,status,msg){
			//每次校验之前,都要清除样式
			//以免第一次失败为has-error,更改之后再has-error基础上加上has-success
			$(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);
			}
		}
		//校验用户名是否重复
		$("#empname_add").change(function(){
			var empName = this.value;
			//发送ajax请求
			$.ajax({
				url:"${APP_PATH}/ifExist",
				data:"empName="+empName,
				type:"POST",
				success:function(result){
					if(result.code == 100){
						show_validate_msg("#empname_add","success","用户名可用");
						//如果可用,给保存按钮添加一个属性,能进行保存
						$("#emp_save").attr("ajax-va","success");
					}else{
						show_validate_msg("#empname_add","error",result.extend.va_msg);
						//如果不可用,不能进行保存
						$("#emp_save").attr("ajax-va","error");
					}
				}
			});
		});
		
		//如何给这个编辑按钮绑定点击事件?
		//页面是先执行js,然后再ajax请求把表格内容显示出来
		//如果用.click方法,执行这个绑定事件时,还没生成表格
		//所以用on方法
		//如何获取这个id值呢?可以在生成编辑按钮的时候给它绑定一个值
		$(document).on("click",".edit_btn",function(){
			//1.查出员工信息
			getEmp($(this).attr("edit-id"));
			//2.查出部门信息
			getDepts("#empEditModal select");
			//3.把员工id绑定到模态框的更新按钮上
			$("#emp_edit").attr("edit-id",$(this).attr("edit-id"));
			$("#empEditModal").modal({
				backdrop:"static"
			});
		});
		
		//编辑功能,获取对应员工的信息
		function getEmp(id){
			$.ajax({
				url:"${APP_PATH}/emp/"+id,
				type:"GET",
				success:function(result){
					$("#empEditModal p").text(result.extend.employee.empName);
					$("#email_edit").val(result.extend.employee.email);
					$("#empEditModal input[name=gender]").val([result.extend.employee.gender]);
					$("#empEditModal select").val([result.extend.employee.dId]);
				}
			});
		}
		
		$("#emp_edit").click(function(){
			//1.验证邮箱是否合法
			var email = $("#email_edit").val();
			var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
			if(!regEmail.test(email)){
				show_validate_msg("#email_edit", "error", "请输入正确邮箱地址");
				return false;
			}else{
				show_validate_msg("#email_edit", "success", "");
			}
			//2.发送ajax请求保存更新的数据
			$.ajax({
				url:"${APP_PATH}/emp/"+$(this).attr("edit-id"),
				type:"PUT",
				data:$("#empEditModal form").serialize(),
				success:function(result){
					//1.关闭模态框
					$("#empEditModal").modal("hide");
					//2.回到对应页面
					to_page(currentPageNum);
				}
			});
		});
		
		//单个删除	
		$(document).on("click",".delete_btn",function(){
			//1.弹出确认删除对话框
			var empName = $(this).parents("tr").find("td:eq(2)").text();
			if(confirm("确认删除["+empName+"]吗?")){
				$.ajax({
					url:"${APP_PATH}/emp/"+$(this).attr("delete-id"),
					type:"DELETE",
					success:function(){
						to_page(currentPageNum);
					}
				});
			}	
		});
		
		//点击全选按钮,每条数据前的复选框的选中状态
		$("#check_all").click(function(){
			$(".check_item").prop("checked",$(this).prop("checked"));
		});
		//每条数据前复选框的选中状态,决定全选框的选中状态
		$(document).on("click",".check_item",function(){
			var flag = $(".check_item:checked").length == $(".check_item").length;
			$("#check_all").prop("checked",flag);  
		});
		//全部删除按钮点击事件
		$("#emp_delete_all").click(function(){
			var empNames = "";
			var del_ids = "";
			$.each($(".check_item:checked"),function(){
				//组装员工名称字符串
				empNames += $(this).parents("tr").find("td:eq(2)").text()+",";
				//组装员工id字符串
				del_ids += $(this).parents("tr").find("td:eq(1)").text()+"-";
			});
			empNames = empNames.substring(0,empNames.length-1);
			del_ids = del_ids.substring(0,del_ids.length-1);
			if(confirm("确认删除["+empNames+"]吗?")){
				$.ajax({
					url:"${APP_PATH}/emp/"+del_ids,
					type:"DELETE",
					success:function(result){
						to_page(currentPageNum);
					}
				}); 
			}
		});
	</script>
</body>
</html>

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值