- 创建一个maven工程
- 引入项目依赖的jar包:spring、springmvc、mybatis、数据库连接池驱动包、其他(jstl、servlet-api、junit)
- 引入bootstrap前端框架
- 编写ssm整合关键配置文件:web.xml、spring、springmvc、mybatis,使用mybatis逆向工程生成对应的bean和mapper
- 测试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?&userSSL=false&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
一、数据显示
- 访问index.jsp页面
- index.jsp页面发送出查询员工列表请求
- EmployeeController接收请求,查出员工数据
- 来到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">«</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">»</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("«"));
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("»"));
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">×</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">×</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("«"));
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("»"));
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>