增删改查
增删改查
注意点:
- 如果代码在运行过程报错,如sql语句可能会书写错误,我们还需要学会通过调试、或者打印自定义日志排查问题。
- 在写完每个接口,记得测试一下接口是否正常
提示:
如果文档里面有错误或者疑问,可以通过B站提醒我~
分页查询
PagerVO
/**
* 分页工具
*/
public class PagerVO<T> {
int current;
int size;
int total;
List<T> list;
//get set 函数略...
}
学生查询
StudentDao
public PagerVO<Student> page(int current, int size, String whereSql){
PagerVO<Student> pagerVO = new PagerVO<>();
pagerVO.setCurrent(current);
pagerVO.setSize(size);
JdbcHelper helper = new JdbcHelper();
if(whereSql == null){
whereSql = " ";
}
ResultSet resultSet;
try {
resultSet = helper.executeQuery("select count(1) from tb_student "+whereSql);
resultSet.next();
int total = resultSet.getInt(1);
pagerVO.setTotal(total);
resultSet = helper.executeQuery("select * from tb_student " + whereSql + " limit " + ((current-1)*size) + "," + size);
List<Student> list = new ArrayList<>();
while (resultSet.next()){
Student e = toEntity(resultSet);
list.add(e);
}
pagerVO.setList(list);
return pagerVO;
}catch (Exception e){
e.printStackTrace();
}finally {
helper.closeDB();
}
return null;
}
StudentService
public PagerVO<Student> page(int current, int size,String sno,String name,String gender,String clazzno) {
String whereSql = " where 1=1 ";
if(name!=null){
whereSql += " and name like '%" + name + "%'";
}
if(sno!=null){
whereSql += " and sno like '%" + sno + "%'";
}
if(gender!=null){
whereSql += " and gender = '" + gender + "'";
}
if(clazzno!=null){
whereSql += " and clazzno = '" + clazzno + "'";
}
return dao.page(current,size,whereSql);
}
班级查询
ClazzDao
public PagerVO<Clazz> page(int current, int size, String whereSql){
PagerVO<Clazz> pagerVO = new PagerVO<>();
pagerVO.setCurrent(current);
pagerVO.setSize(size);
JdbcHelper helper = new JdbcHelper();
if(whereSql == null){
whereSql = " ";
}
ResultSet resultSet;
try {
resultSet = helper.executeQuery("select count(1) from tb_clazz "+whereSql);
resultSet.next();
int total = resultSet.getInt(1);
pagerVO.setTotal(total);
resultSet = helper.executeQuery("select * from tb_clazz " + whereSql + " limit " + ((current-1)*size) + "," + size);
List<Clazz> list = new ArrayList<>();
while (resultSet.next()){
Clazz e = new Clazz();
e.setClazzno(resultSet.getString("clazzno"));
e.setName(resultSet.getString("name"));
list.add(e);
}
pagerVO.setList(list);
return pagerVO;
}catch (Exception e){
e.printStackTrace();
}finally {
helper.closeDB();
}
return null;
}
ClazzService
public PagerVO<Clazz> page(int current, int size, String clazzno, String name) {
String whereSql = " where 1=1 ";
if(name!=null){
whereSql += " and name like '%" + name + "%'";
}
if(clazzno!=null){
whereSql += " and clazzno like '%" + clazzno + "%'";
}
return dao.page(current,size,whereSql);
}
删除功能
删除学生
StudentDao
public int delete(String sno){
JdbcHelper helper = new JdbcHelper();
int res = helper.executeUpdate("delete from tb_student where sno = ?",sno);
helper.closeDB();
return res;
}
StudentService
public void delete(String sno){
dao.delete(sno);
}
删除班级
如果班级有学生,则不允许删除,并且提示。
- StudentDao添加count的重载方法,统计某个班级的人数
ClazzDao
public int delete(String clazzno){
JdbcHelper helper = new JdbcHelper();
int res = helper.executeUpdate("delete from tb_clazz where clazzno = ?",clazzno);
helper.closeDB();
return res;
}
ClazzService
StudentDao studentDao = new StudentDao();
public String delete(String clazzno){
int count = studentDao.count(" where clazzno = '" + clazzno + "'");
if(count>0){
return "删除失败,该班级已有"+count+"人";
}
dao.delete(clazzno);
return null;
}
新增、修改
写完每个功能记得测试一下
学生新增、修改
StudentDao
//新增学生
public int insert(Student student){
JdbcHelper helper = new JdbcHelper();
int res = helper.executeUpdate("insert into tb_student values(?,?,?,?,?,?,?,?,?)"
,student.getSno(),student.getPassword(),student.getName(),student.getTele()
,student.getEnterdate(),student.getAge(),student.getGender()
,student.getAddress(),student.getClazzno()
);
helper.closeDB();
return res;
}
//修改学生
public int update(Student student){
JdbcHelper helper = new JdbcHelper();
int res = 0;
//为null的属性不做更新
String sql = "update tb_student set ";
List<Object> params = new ArrayList<>();
if(student.getPassword()!=null){
sql += "password = ?,";
params.add(student.getPassword());
}
if(student.getName()!=null){
sql += "name = ?,";
params.add(student.getName());
}
if(student.getTele()!=null){
sql += "tele = ?,";
params.add(student.getTele());
}
if(student.getEnterdate()!=null){
sql += "enterdate = ?,";
params.add(student.getEnterdate());
}
if(student.getAge()!=null){
sql += "age = ?,";
params.add(student.getAge());
}
if(student.getGender()!=null){
sql += "gender = ?,";
params.add(student.getGender());
}if(student.getAddress()!=null){
sql += "address = ?,";
params.add(student.getAddress());
}
if(student.getClazzno()!=null){
sql += "clazzno = ?,";
params.add(student.getClazzno());
}
sql = sql.substring(0,sql.length()-1);
sql+=" where sno = '" + student.getSno() + "'";
res = helper.executeUpdate(sql,params.toArray());
helper.closeDB();
return res;
}
StudentService
//新增学生
public String insert(Student student){
if(student.getSno() == null || student.getSno().equals("")){
return "学生学号不可为空!";
}if(student.getPassword() == null || student.getPassword().equals("")){
return "密码不可为空!";
}if(student.getName() == null || student.getName().equals("")){
return "姓名不可为空!";
}if(student.getClazzno() == null || student.getClazzno().equals("")){
return "班级不可为空!";
}
//检查
Student exists = dao.getBySno(student.getSno());
if(exists!=null){
return "学号已存在!";
}
dao.insert(student);
return null;
}
//修改学生
public String update(Student student){
if(student.getSno() == null || student.getSno().equals("")){
return "被修改学生学号不可为空!";
}
dao.update(student);
return null;
}
班级新增、修改
ClazzDao
public int insert(Clazz clazz){
JdbcHelper helper = new JdbcHelper();
int res = helper.executeUpdate("insert into tb_clazz values(?,?)",clazz.getClazzno(),clazz.getName());
helper.closeDB();
return res;
}
public int update(Clazz clazz){
JdbcHelper helper = new JdbcHelper();
int res = 0;
//为null的属性不做更新
String sql = "update tb_clazz set name = ? where clazzno = ? ";
res = helper.executeUpdate(sql,clazz.getName(),clazz.getClazzno());
helper.closeDB();
return res;
}
public Clazz getByClazzno(String clazzno){
JdbcHelper helper = new JdbcHelper();
ResultSet resultSet = helper.executeQuery("select * from tb_clazz where clazzno = ?",clazzno);
try {
if(resultSet.next()){
Clazz clazz = new Clazz();
clazz.setName(resultSet.getString("name"));
clazz.setClazzno(resultSet.getString("clazzno"));
return clazz;
}
}catch (Exception e){
e.printStackTrace();
}finally {
helper.closeDB();
}
return null;
}
ClazzService
public String insert(Clazz clazz){
if(clazz.getClazzno() == null || clazz.getClazzno().equals("")){
return "班级编号不可为空!";
}
if(clazz.getName() == null || clazz.getName().equals("")){
return "班级名不可为空!";
}
//检查
Clazz exists = dao.getByClazzno(clazz.getClazzno());
if(exists!=null){
return "班级编号已存在!";
}
dao.insert(clazz);
return null;
}
public String update(Clazz clazz){
if(clazz.getClazzno() == null || clazz.getClazzno().equals("")){
return "班级编号不可为空!";
}
dao.update(clazz);
return null;
}
班级管理实现
权限问题咱们后面再管!先把功能实现了再说!
先创建一个ClazzServlet,然后创建clazz-list.jsp页面
ClazzServlet
import com.hello.entity.Clazz;
import com.hello.utils.vo.PagerVO;
import com.hello.service.ClazzService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/clazz")
public class ClazzServlet extends HttpServlet {
ClazzService clazzService = new ClazzService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");// 设置前端获取参数编码
//查询
String current = req.getParameter("current");
if(current == null){
current = "1";
}
String clazzno = req.getParameter("clazzno");
String name = req.getParameter("name");
PagerVO<Clazz> pagerVO = clazzService.page(Integer.parseInt(current),10,clazzno,name);
req.setAttribute("clazzno",clazzno);
req.setAttribute("name",name);
req.setAttribute("pagerVO",pagerVO);
req.getRequestDispatcher("/WEB-INF/views/clazz-list.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
修改左侧栏导航地址
现在我们已经知道了班级页面访问地址,还有首页的地址,可以先写上去了
${pageContext.request.contextPath}/index.jsp
${pageContext.request.contextPath}/clazz
${pageContext.request.contextPath}/student
clazz-list.jsp
接下来来构建一个班级列表页
- 1 创建clazz-list.jsp,把index.jsp的框架复制过来
- 2 在笔下光年的lyear_ui_tables.html里面找一个table表格的样式,复制过来
- 3 查询条件:lyear_forms_elements里面有个内联表单,很适合用来做列表页的查询条件
- 4 渲染数据 , 能显示数据就算本步骤成功完成
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>班级列表</title>
<link rel="icon" href="${pageContext.request.contextPath}/assets/favicon.ico" type="image/ico">
<link href="${pageContext.request.contextPath}/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/materialdesignicons.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/style.min.css" rel="stylesheet">
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<jsp:include page="_aside_header.jsp"></jsp:include>
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-body">
<form style="margin-bottom: 15px" class="form-inline" action="${pageContext.request.contextPath}/clazz" method="get">
<input type="hidden" name="current" id="current" value="1">
<div class="form-group">
<label>班级编号</label>
<input class="form-control" type="text" value="${clazzno}" name="clazzno" placeholder="请输入班级编号">
</div>
<div class="form-group">
<label>班级名</label>
<input class="form-control" type="text" value="${name}" name="name" placeholder="请输入班级名">
</div>
<div class="form-group">
<button class="btn btn-purple btn-round" type="submit">查询</button>
</div>
</form>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>#</th>
<th>班级编号</th>
<th>班级名称</th>
</tr>
</thead>
<tbody>
<c:forEach items="${ pagerVO.list }" var="i" varStatus="s">
<tr>
<th scope="row">${s.count}</th>
<td>${i.clazzno}</td>
<td>${i.name}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/perfect-scrollbar.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/main.min.js"></script>
<script type="text/javascript">
$(document).ready(function(e) {
});
</script>
</body>
</html>
前端分页功能
在笔下光年的lyear_ui_pagination.html
里面找一个分页组件复制过来,然后结合后端渲染页码
要渲染页码内容,需要知道当前是第几页、一共有几页、是否可以点击上一页和下一页,这些可以在后端进行计算。
分页组件PagerVO添加功能并测试,测试完毕记得在Servlet里面调用!
int totalPages;
boolean showLeft;
boolean showRight;
int[] pageNums;
public void init(){
//计算页数
totalPages = total / size;
if(total % size > 0){
totalPages ++;
}
//向左向右
if(current == 1){
showLeft = false;
}else{
showLeft = true;
}
if(current == totalPages){
showRight = false;
}else{
showRight = true;
}
//计算起始页码和结束页码
int min = current - 5;
int max = current + 5;
if(min < 1){
min = 1;
}
if (max > totalPages){
max = totalPages;
}
int length = max - min + 1;
pageNums = new int[length];
for (int i = 0; i < length; i++) {
pageNums[i] = i + min;
}
}
渲染分页组件
<nav style="width: 100%;height: 80px">
<ul class="pagination" style="float: right">
<li id="pagesTip">
<a style="border: none">共${pagerVO.total}条、${pagerVO.totalPages}页</a>
</li>
<li <c:if test="${pagerVO.showLeft}">class="disabled"</c:if> >
<a href="javascript:gotoPage(${pagerVO.current-1})">
<span><i class="mdi mdi-chevron-left"></i></span>
</a>
</li>
<c:forEach items="${ pagerVO.pageNums }" var="i" varStatus="s">
<li <c:if test="${i == pagerVO.current}">class="active"</c:if> >
<a href="javascript:gotoPage(${i})">${i}</a>
</li>
</c:forEach>
<li <c:if test="${pagerVO.showRight}">class="disabled"</c:if>>
<a href="javascript:gotoPage(${pagerVO.current+1})">
<span><i class="mdi mdi-chevron-right"></i></span>
</a>
</li>
</ul>
</nav>
<!--头部加上点击事件,记得给form表单加上 id="form" -->
<script>
function gotoPage(page) {
$("#current").val(page)
$("#form").submit()
}
</script>
抽取分页组件,让学生页面也能用 _pager.jsp
班级增删改-servlet
ClazzServlet的doPost方法实现如下,实现了增删改的接口功能
别忘了doGet方法还要加请求新增页、编辑页的get请求!
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");// 设置编码,否则从前端获取参数乱码
resp.setContentType("application/json; charset=utf-8");
//请求类型
String r = req.getParameter("r");
if("add".equals(r) || "edit".equals(r)){
String clazzno = req.getParameter("clazzno");
String name = req.getParameter("name");
Clazz clazz = new Clazz();
clazz.setName(name);
clazz.setClazzno(clazzno);
if("add".equals(r)){
String msg = clazzService.insert(clazz);
if(msg!=null){
resp.getWriter().write(ApiResult.json(false,msg));
return;
}else{
resp.getWriter().write(ApiResult.json(true,"保存成功"));
return;
}
}else{
String msg = clazzService.update(clazz);
if(msg!=null){
resp.getWriter().write(ApiResult.json(false,msg));
return;
}else{
resp.getWriter().write(ApiResult.json(true,"保存成功"));
return;
}
}
}
if("del".equals(r)){
//删除
String clazzno = req.getParameter("clazzno");
String msg = clazzService.delete(clazzno);
if(msg!=null){
resp.getWriter().write(ApiResult.json(false,msg));
return;
}else{
resp.getWriter().write(ApiResult.json(true,"删除成功"));
return;
}
}
}
班级增删改-页面
clazz-add.jsp核心代码
<div class="card">
<div class="card-header"><h4>新增班级</h4></div>
<div class="card-body">
<form id="myForm" action="${pageContext.request.contextPath}/clazz?r=add" method="post">
<div class="form-group">
<label >班级编号</label>
<input class="form-control" type="text" name="clazzno">
</div>
<div class="form-group">
<label >班级名</label>
<input class="form-control" type="text" name="name">
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">提交</button>
</div>
</form>
</div>
</div>
为了防止提交表单后,提示不够友好,我们应该使用ajax去提交数据
<!--消息提示-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-notify.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/lightyear.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#myForm').on('submit', function(event) {
// 阻止表单的默认提交行为
event.preventDefault();
lightyear.loading('show');
// 序列化表单数据
var formData = $(this).serialize();
// 使用AJAX发送数据
$.ajax({
type: 'POST',
url: $(this).attr("action"),
data: formData,
success: function(response) {
// 处理返回结果
if(response.success){
//成功
lightyear.loading('hide');
lightyear.url('clazz');
lightyear.notify(response.message, 'success', 500);
}else{
lightyear.loading('hide');
lightyear.notify(response.message, 'danger', 5000);
}
},
error: function(xhr, status, error) {
lightyear.loading('hide');
lightyear.notify("请求失败", 'danger', 5000);
}
});
});
});
</script>
在list.jsp里面添加操作列,添加编辑和删除按钮
编辑功能和新增功能非常相似,创建clazz-edit.jsp,修改表单内的几个关键代码,包括请求路径,被修改的数据渲染
删除功能核心代码
<!--消息提示-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-notify.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/lightyear.js"></script>
<script type="text/javascript">
function del(clazzno) {
$.ajax({
type: 'POST',
url: 'clazz?r=del',
data: {clazzno},
success: function(response) {
// 处理返回结果
if(response.success){
//成功
lightyear.loading('hide');
lightyear.url('clazz');
lightyear.notify(response.message, 'success', 500);
}else{
lightyear.loading('hide');
lightyear.notify(response.message, 'danger', 5000);
}
},
error: function(xhr, status, error) {
lightyear.loading('hide');
lightyear.notify("请求失败", 'danger', 5000);
}
});
}
</script>
学生管理实现
有了班级管理的经验,学生信息管理的操作大都和班级管理差不多,都可以直接copy过来,让我们一起化身CRUD工程师吧!
首先创建时间操作工具MyUtils,在获取入学时间的参数的转换需要用到
package com.hello.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 时间操作工具
*/
public class MyUtils {
/**
* 字符串转日期
*/
public static Date strToDate(String str){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
return format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
StudentServlet
package com.hello.servlet;
import com.hello.entity.Student;
import com.hello.service.StudentService;
import com.hello.utils.ApiResult;
import com.hello.utils.MyUtils;
import com.hello.utils.vo.PagerVO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/student")
public class StudentServlet extends HttpServlet {
StudentService studentService = new StudentService();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");// 设置编码,否则从前端获取参数乱码
//查询
String r = req.getParameter("r");
if(r == null){
String current = req.getParameter("current");
if(current == null){
current = "1";
}
String sno = req.getParameter("sno");
String gender = req.getParameter("gender");
String name = req.getParameter("name");
String clazzno = req.getParameter("clazzno");
PagerVO<Student> pagerVO = studentService.page(Integer.parseInt(current),10,sno,name,gender,clazzno);
pagerVO.init();
req.setAttribute("sno",sno);
req.setAttribute("gender",gender);
req.setAttribute("clazzno",clazzno);
req.setAttribute("name",name);
req.setAttribute("pagerVO",pagerVO);
req.getRequestDispatcher("/WEB-INF/views/student-list.jsp").forward(req, resp);
return;
}
if("add".equals(r)){
req.getRequestDispatcher("/WEB-INF/views/student-add.jsp").forward(req, resp);
return;
}
if("edit".equals(r)){
String sno = req.getParameter("sno");
Student student = studentService.getBySno(sno);
req.setAttribute("entity",student);
req.getRequestDispatcher("/WEB-INF/views/student-edit.jsp").forward(req, resp);
return;
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");// 设置编码,否则从前端获取参数乱码
resp.setContentType("application/json; charset=utf-8");
//请求类型
String r = req.getParameter("r");
if("add".equals(r) || "edit".equals(r)){
Student student = new Student();
student.setSno(req.getParameter("sno"));
student.setPassword(req.getParameter("password"));
student.setName(req.getParameter("name"));
student.setTele(req.getParameter("tele"));
student.setGender(req.getParameter("gender"));
student.setAddress(req.getParameter("address"));
student.setClazzno(req.getParameter("clazzno"));
String enterdate = req.getParameter("enterdate");
student.setEnterdate(MyUtils.strToDate(enterdate));
String age = req.getParameter("age");
student.setAge(Integer.parseInt(age));
if("add".equals(r)){
String msg = studentService.insert(student);
if(msg!=null){
resp.getWriter().write(ApiResult.json(false,msg));
return;
}else{
resp.getWriter().write(ApiResult.json(true,"保存成功"));
return;
}
}else{
String msg = studentService.update(student);
if(msg!=null){
resp.getWriter().write(ApiResult.json(false,msg));
return;
}else{
resp.getWriter().write(ApiResult.json(true,"保存成功"));
return;
}
}
}
if("del".equals(r)){
//删除
String sno = req.getParameter("sno");
studentService.delete(sno);
resp.getWriter().write(ApiResult.json(true,"删除成功"));
return;
}
}
}
student-list.jsp
复制clazz-list.jsp,修改查询条件、请求地址,总之和clazz相关的都要改成学生的。
写完代码不要忘记测试一下!
student-list.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>学生列表</title>
<link rel="icon" href="${pageContext.request.contextPath}/assets/favicon.ico" type="image/ico">
<link href="${pageContext.request.contextPath}/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/materialdesignicons.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/style.min.css" rel="stylesheet">
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<jsp:include page="_aside_header.jsp"></jsp:include>
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-body">
<form id="form" style="margin-bottom: 15px" class="form-inline" action="${pageContext.request.contextPath}/student" method="get">
<input type="hidden" name="current" id="current" value="1">
<div class="form-group">
<label>学号</label>
<input class="form-control" type="text" value="${sno}" name="sno" placeholder="">
</div>
<div class="form-group">
<label>性别</label>
<select class="form-control" name="gender" size="1">
<option value="">请选择</option>
<option <c:if test="${gender == 'm'}">selected</c:if> value="m">男</option>
<option <c:if test="${gender == 'w'}">selected</c:if> value="w">女</option>
</select>
</div>
<div class="form-group">
<label>班级编号</label>
<input class="form-control" type="text" value="${clazzno}" name="clazzno" placeholder="请输入班级编号">
</div>
<div class="form-group">
<label>姓名</label>
<input class="form-control" type="text" value="${name}" name="name" placeholder="">
</div>
<div class="form-group">
<button class="btn btn-purple btn-round" type="submit">查询</button>
<button class="btn btn-success btn-round"
onclick="location.href='${pageContext.request.contextPath}/student?r=add'"
type="button">新增</button>
</div>
</form>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th>#</th>
<th>学号</th>
<th>姓名</th>
<th>电话</th>
<th>性别</th>
<th>入学时间</th>
<th>年龄</th>
<th>电话</th>
<th>班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${ pagerVO.list }" var="i" varStatus="s">
<tr>
<th scope="row">${s.count}</th>
<td>${i.sno}</td>
<td>${i.name}</td>
<td>${i.tele}</td>
<td>${i.gender == 'm' ? '男' : (i.gender == 'w'?'女':'')}</td>
<td><fmt:formatDate value="${i.enterdate}" pattern="yyyy-MM-dd" /></td>
<td>${i.age}</td>
<td>${i.tele}</td>
<td>${i.clazzno}</td>
<td>
<a class="btn btn-xs btn-purple" href="student?r=edit&sno=${i.sno}">编辑</a>
<button class="btn btn-xs btn-danger" onclick="del('${i.sno}')">删除</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<jsp:include page="_pager.jsp"></jsp:include>
</div>
</div>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/perfect-scrollbar.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/main.min.js"></script>
<!--消息提示-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-notify.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/lightyear.js"></script>
<script type="text/javascript">
function del(sno) {
$.ajax({
type: 'POST',
url: 'student?r=del',
data: {sno},
success: function(response) {
// 处理返回结果
if(response.success){
//成功
lightyear.loading('hide');
lightyear.url('student');
lightyear.notify(response.message, 'success', 500);
}else{
lightyear.loading('hide');
lightyear.notify(response.message, 'danger', 5000);
}
},
error: function(xhr, status, error) {
lightyear.loading('hide');
lightyear.notify("请求失败", 'danger', 5000);
}
});
}
</script>
</body>
</html>
student-add.jsp
新增学生时候要为学生设置班级,那肯定不可能手动输入班级编号,需要在进入新增页面之前,从后端查询出班级数据,然后用下拉框去选择班级
在StudentServlet里面,改造一下新增编辑页的内容:
if("add".equals(r)){
List<Clazz> clazzes = clazzService.listAll();
req.setAttribute("clazzes",clazzes);
req.getRequestDispatcher("/WEB-INF/views/student-add.jsp").forward(req, resp);
return;
}
if("edit".equals(r)){
List<Clazz> clazzes = clazzService.listAll();
String sno = req.getParameter("sno");
Student student = studentService.getBySno(sno);
req.setAttribute("entity",student);
req.setAttribute("clazzes",clazzes);
req.getRequestDispatcher("/WEB-INF/views/student-edit.jsp").forward(req, resp);
return;
}
student-add.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>新增学生</title>
<link rel="icon" href="${pageContext.request.contextPath}/assets/favicon.ico" type="image/ico">
<link href="${pageContext.request.contextPath}/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/materialdesignicons.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/style.min.css" rel="stylesheet">
<!--日期选择插件-->
<link rel="stylesheet" href="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/bootstrap-datepicker3.min.css">
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<jsp:include page="_aside_header.jsp"></jsp:include>
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="card">
<div class="card-header"><h4>新增学生</h4></div>
<div class="card-body">
<form id="myForm" action="${pageContext.request.contextPath}/student?r=add" method="post">
<div class="form-group">
<label >学号</label>
<input required class="form-control" type="text" name="sno">
</div>
<div class="form-group">
<label >密码</label>
<input required class="form-control" type="text" name="password">
</div>
<div class="form-group">
<label >姓名</label>
<input required class="form-control" type="text" name="name">
</div>
<div class="form-group">
<label >电话</label>
<input maxlength="11" class="form-control" type="number" name="tele">
</div>
<div class="form-group">
<label >入学时间</label>
<input class="form-control js-datepicker m-b-10" type="text" name="enterdate" placeholder="yyyy-mm-dd"
value="" data-date-format="yyyy-mm-dd" />
</div>
<div class="form-group">
<label >年龄</label>
<input class="form-control" type="number" name="age">
</div>
<div class="form-group">
<label >性别</label>
<div class="col-xs-12">
<div class="radio">
<label for="example-radio1">
<input type="radio" id="example-radio1" name="gender" value="m">男
</label>
</div>
<div class="radio">
<label for="example-radio2">
<input type="radio" id="example-radio2" name="gender" value="w">女
</label>
</div>
</div>
</div>
<div class="form-group">
<label >班级编号</label>
<select class="form-control" name="clazzno" size="1">
<option value="">请选择</option>
<c:forEach items="${ clazzes }" var="i" varStatus="s">
<option value="${i.clazzno}">${i.clazzno} / ${i.name}</option>
</c:forEach>
</select>
</div>
<div class="form-group">
<label >详细地址</label>
<textarea class="form-control" name="address"></textarea>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">提交</button>
</div>
</form>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/perfect-scrollbar.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/main.min.js"></script>
<!--日期选择插件-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js"></script>
<!--消息提示-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-notify.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/lightyear.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#myForm').on('submit', function(event) {
// 阻止表单的默认提交行为
event.preventDefault();
lightyear.loading('show');
// 序列化表单数据
var formData = $(this).serialize();
// 使用AJAX发送数据
$.ajax({
type: 'POST',
url: $(this).attr("action"),
data: formData,
success: function(response) {
// 处理返回结果
if(response.success){
//成功
lightyear.loading('hide');
lightyear.url('student');
lightyear.notify(response.message, 'success', 500);
}else{
lightyear.loading('hide');
lightyear.notify(response.message, 'danger', 5000);
}
},
error: function(xhr, status, error) {
lightyear.loading('hide');
lightyear.notify("请求失败", 'danger', 5000);
}
});
});
});
</script>
</body>
</html>
student-edit.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>编辑学生</title>
<link rel="icon" href="${pageContext.request.contextPath}/assets/favicon.ico" type="image/ico">
<link href="${pageContext.request.contextPath}/assets/css/bootstrap.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/materialdesignicons.min.css" rel="stylesheet">
<link href="${pageContext.request.contextPath}/assets/css/style.min.css" rel="stylesheet">
<!--日期选择插件-->
<link rel="stylesheet" href="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/bootstrap-datepicker3.min.css">
</head>
<body>
<div class="lyear-layout-web">
<div class="lyear-layout-container">
<jsp:include page="_aside_header.jsp"></jsp:include>
<!--页面主要内容-->
<main class="lyear-layout-content">
<div class="container-fluid">
<div class="card">
<div class="card-header"><h4>编辑学生</h4></div>
<div class="card-body">
<form id="myForm" action="${pageContext.request.contextPath}/student?r=edit" method="post">
<div class="form-group">
<label >学号</label>
<input required readonly class="form-control" type="text" name="sno" value="${entity.sno}">
</div>
<div class="form-group">
<label >密码</label>
<input required class="form-control" type="password" name="password" value="${entity.password}">
</div>
<div class="form-group">
<label >姓名</label>
<input required class="form-control" type="text" name="name" value="${entity.name}">
</div>
<div class="form-group">
<label >电话</label>
<input maxlength="11" class="form-control" type="number" name="tele" value="${entity.tele}">
</div>
<div class="form-group">
<label >入学时间</label>
<input class="form-control js-datepicker m-b-10" type="text" name="enterdate" placeholder="yyyy-mm-dd"
value="${entity.enterdate}" data-date-format="yyyy-mm-dd" />
</div>
<div class="form-group">
<label >年龄</label>
<input class="form-control" type="number" name="age" value="${entity.age}">
</div>
<div class="form-group">
<label >性别</label>
<div class="col-xs-12">
<div class="radio">
<label for="example-radio1">
<input <c:if test="${entity.gender=='m'}">checked</c:if> type="radio" id="example-radio1" name="gender" value="m">男
</label>
</div>
<div class="radio">
<label for="example-radio2">
<input <c:if test="${entity.gender=='w'}">checked</c:if> type="radio" id="example-radio2" name="gender" value="w">女
</label>
</div>
</div>
</div>
<div class="form-group">
<label >班级编号</label>
<select class="form-control" name="clazzno" size="1">
<option value="">请选择</option>
<c:forEach items="${ clazzes }" var="i" varStatus="s">
<option <c:if test="${entity.clazzno== i.clazzno}">selected</c:if> value="${i.clazzno}">${i.clazzno} / ${i.name}</option>
</c:forEach>
</select>
</div>
<div class="form-group">
<label >详细地址</label>
<textarea class="form-control" name="address">${entity.address}</textarea>
</div>
<div class="form-group">
<button class="btn btn-primary" type="submit">提交</button>
</div>
</form>
</div>
</div>
</div>
</main>
<!--End 页面主要内容-->
</div>
</div>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/bootstrap.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/perfect-scrollbar.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/main.min.js"></script>
<!--日期选择插件-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.min.js"></script>
<!--消息提示-->
<script src="${pageContext.request.contextPath}/assets/js/bootstrap-notify.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/assets/js/lightyear.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#myForm').on('submit', function(event) {
// 阻止表单的默认提交行为
event.preventDefault();
lightyear.loading('show');
// 序列化表单数据
var formData = $(this).serialize();
// 使用AJAX发送数据
$.ajax({
type: 'POST',
url: $(this).attr("action"),
data: formData,
success: function(response) {
// 处理返回结果
if(response.success){
//成功
lightyear.loading('hide');
lightyear.url('student');
lightyear.notify(response.message, 'success', 500);
}else{
lightyear.loading('hide');
lightyear.notify(response.message, 'danger', 5000);
}
},
error: function(xhr, status, error) {
lightyear.loading('hide');
lightyear.notify("请求失败", 'danger', 5000);
}
});
});
});
</script>
</body>
</html>