1 删除学生的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>
<script type="text/javascript">
function doDelete(sid){
// 如果这里弹出的对话框,用户点击的是确定,就删除
// 如何知道确定,如何调用Servlet
var flag = confirm("是否确定删除?");
if(flag){
//表明确定,访问Servlet,
window.location.href="DeleteServlet?sid="+sid;
}
}
</script> </head>
<body>
<table border="1px">
<tr >
<td colspan="8">
<a href="add.jsp">添加</a>
</td>
</tr>
<tr align="center">
<td>编号</td>
<td>姓名</td>
<td>性别</td>
<td>电话</td>
<td>生日</td>
<td>爱好</td>
<td>简介</td>
<td>操作</td>
</tr>
<c:forEach var="stu" items="${list }" >
<tr align="center">
<td>${stu.sid }</td>
<td>${stu.sname }</td>
<td>${stu.gender }</td>
<td>${stu.phone }</td>
<td>${stu.birthday }</td>
<td>${stu.hobby }</td>
<td>${stu.info }</td>
<td><a href="#">更新</a> <a href="#" onclick="doDelete(${stu.sid})">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>

2 更新学生保留单选框复选框的JSP实现:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!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>
</head>
<body>
<h3>更新学生</h3>
<form action="UpdateServlet" method="post" >
<table border="1px" width="600px">
<tr >
<td>姓名</td>
<td><input type="text" name="sname" value="${stu.sname }"></td>
</tr>
<tr>
<td>性别</td>
<!-- 如果是男的,就在男的input里面加上checked,否则在女的里面加上checked -->
<td>
<input type="radio" name="gender" value="男" <c:if test="${stu.gender == '男' }">checked</c:if>>男
<input type="radio" name="gender" value="女" <c:if test="${stu.gender == '女' }">checked</c:if>>女
</td> </tr>
<tr>
<td>电话</td>
<td><input type="text" name="phone" value="${stu.phone }"></td>
</tr>
<tr>
<td>生日</td>
<td><input type="text" name="birthday" value="${stu.birthday }"></td>
</tr>
<tr>
<td>爱好</td>
<td>
<!-- 判断是否包含 -->
<input type="checkbox" name="hobby" value="游泳" <c:if test="${fn:contains(stu.hobby,'游泳') }">checked</c:if>>游泳
<input type="checkbox" name="hobby" value="篮球" <c:if test="${fn:contains(stu.hobby,'篮球') }">checked</c:if>>篮球
<input type="checkbox" name="hobby" value="足球" <c:if test="${fn:contains(stu.hobby,'足球') }">checked</c:if>>足球
<input type="checkbox" name="hobby" value="看书" <c:if test="${fn:contains(stu.hobby,'看书') }">checked</c:if>>看书
<input type="checkbox" name="hobby" value="写字" <c:if test="${fn:contains(stu.hobby,'写字') }">checked</c:if>>写字
</td>
</tr>
<tr>
<td>简介</td>
<td>
<textarea name="info" rows="7" cols="40">
${ stu.info}
</textarea>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="更新">
</td>
</tr>
</table>
</form>
</body>
</html>

3 模糊查询的DAO层实现

   /**
* 模糊查询的DAO层实现
*/
@Override
public List<Student> SearchStident(String sname, String sgender) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
/*
* select * from stu where sname like ? and gender = ?
*
* 如果两个都没有就查询所有
*/
List<String> l = new ArrayList<String>();
String sql = "select * from students where 1 = 1";
if(!TextUtils.isEmpty(sname)){
sql = sql + "and sname like ?";
l.add("%"+sname+"%");
}
if(!TextUtils.isEmpty(sgender)){
sql = sql + "and gender = ?";
l.add(sgender);
}
return runner.query(sql, new BeanListHandler<Student>(Student.class),l.toArray());
}

4 分页查询

物理分页:来数据库查询的时候,只查一页的数据就返回了

好处:内存中的数据量不会太大(域内存)

缺点:对数据库的访问比较频繁

 逻辑分页:

一口气把所有的数据全部查询出来,然后放在内存中

优点:访问速度快

缺点:数据量大,内存可能溢出

步骤:

1. index.jsp:  分页查询入口

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
</head>
<body> <h3><a href="StuListServlet">显示所有学生列表</a></h3> <h3><a href="StuListPageServlet?currentPage=1">分页显示所有学生</a></h3> </body>
</html>

 

2   PageBean实体类封装分页需要的对象

/*
* 这是一个用于封装分页的数据
* 里面包含:
* 该页的学生集合数据
* 总的记录数
* 总的页数
* 当前页
* 每页显示的记录数
*/
public class PageBean<T> { private int currentPage;//当前页
private int pageSize;//每页显示的记录数
private int totalPage;//总的页数
private int totalSize;//总的记录数
private List<T> list; //该页的学生集合数据 //此处省略getset方法以及构造

3 DaoImpl交互数据库,通过limit和offset偏移量实现查询当前页的学生数据功能,拿到当前页的学生List集合; 通过查询数据库获得总记录数count

    @Override
/**
* 分页查询,查询当前页的学生数据并封装成集合
*/
public List<Student> findStudentByPage(int currentPage) throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
//第一个?返回记录数量,第二个?偏移量
//第n页 : 5,5*n-1
return runner.query("select * from students limit ? offset ?",new BeanListHandler<Student>(Student.class),PAGE_SIZE,PAGE_SIZE*(currentPage-1));
} @Override
/**
* 查询学生记录数
*/
public int findCount() throws SQLException {
QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
//用于处理平均值,总个数
Long result = (Long)runner.query("select count(*) from students", new ScalarHandler());
return result.intValue();
}

4 ServiceImpl业务层处理分页业务,拿到所有的分页业务对象,封装到PageBean,交给Servlet

@Override
public PageBean findStudentByPage(int currentPage) throws SQLException {
int pageSize = StudentDao.PAGE_SIZE;
//封装分页的该页数据
PageBean<Student> pageBean = new PageBean<>();
pageBean.setCurrentPage(currentPage);//当前页数
pageBean.setPageSize(pageSize);//每页记录数
pageBean.setList(new StudentDaoImpl().findStudentByPage(currentPage));//学生集合
//总记录数
int count = new StudentDaoImpl().findCount();
pageBean.setTotalSize(count);
//总页数,不能整除则页数+1
pageBean.setTotalPage(count % pageSize == 0 ? count/pageSize : count/pageSize + 1 );
return pageBean;
}

5 Servlet将PageBean里面的交互给页面;获取页面的分页数据

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        try {
request.setCharacterEncoding("utf-8");
//1 获取需要显示的页面数
int currentPage = Integer.parseInt(request.getParameter("currentPage"));
//2 根据指定的页数获取该页的数据
StudentService service = new StudentServiceImpl();
PageBean pageBean = service.findStudentByPage(currentPage);
request.setAttribute("pageBean", pageBean);
//3 跳转页面
request.getRequestDispatcher("list_page.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}

6 前端JSP实现分页功能,通过currentPage的更换达到动态分页效果:

<tr>
<td colspan="8">
第${pageBean.currentPage }/${pageBean.totalPage }
每页显示${pageBean.pageSize }条 &nbsp;&nbsp;&nbsp;
总记录数${pageBean.totalSize }&nbsp;&nbsp;&nbsp;
<c:if test="${pageBean.currentPage !=1 }">
<a href="StuListPageServlet?currentPage=1">首页</a>|<a href="StuListPageServlet?currentPage=${pageBean.currentPage-1}">上一页</a>
</c:if> <c:if test="${pageBean.currentPage != pageBean.totalPage }">
<a href="StuListPageServlet?currentPage=${pageBean.currentPage+1 }">下一页</a>|<a href="StuListPageServlet?currentPage=${pageBean.totalPage}">尾页</a>
</c:if>
</td>
</tr>

十六 StudentManagerSystem的一些业务实现的更多相关文章

  1. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  2. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  3. 十六款值得关注的NoSQL与NewSQL数据库--转载

    原文地址:http://tech.it168.com/a2014/0929/1670/000001670840_all.shtml [IT168 评论]传统关系型数据库在诞生之时并未考虑到如今如火如荼 ...

  4. Nodejs学习笔记(十六)--- Pomelo介绍&入门

    目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...

  5. ng机器学习视频笔记(十六) ——从图像处理谈机器学习项目流程

    ng机器学习视频笔记(十六) --从图像处理谈机器学习项目流程 (转载请附上本文链接--linhxx) 一.概述 这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流程.采用的业务示例是O ...

  6. Nodejs学习笔记(十六)—Pomelo介绍&入门

    前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...

  7. centos linux系统日常管理3 服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,curl,ping ,telnet,traceroute ,dig ,nc,nmap,host,nethogs 第十六节课

    centos linux系统日常管理3  服务管理ntsysv,chkconfig,系统日志rsyslog,last ,lastb ,exec,xargs,dmesg,screen,nohup,cur ...

  8. 二十六个月Android学习工作总结【转】

    原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.     2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...

  9. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

随机推荐

  1. socket中文奇数个出现乱码的解决办法

    用MyEclipse试了一下JAVA获取系统正在运行进程代码,结果Console输出的时候中文部分输出为乱码,在网上找了很多办法,都没有解决问题.后来发现一个方法,解决了问题,特此分享. 下面成功解决 ...

  2. Http 状态码总结

    HTTP 状态码列表 一. 1 开头 (继续执行) 服务器收到请求,需要请求者继续执行操作 100:(continue) 客户端继续请求 101:(Switching Protocols) 切换协议, ...

  3. Jmeter_用户定义的变量

    1.线程组->添加->配置原件->用户定义的变量 2.自定义变量引用: ${ }

  4. 第一节:Vuejs入门之各种指令

    一. 简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上 ...

  5. Faster-RCNN Pytorch实现的minibatch包装

    实际上faster-rcnn对于输入的图片是有resize操作的,在resize的图片基础上提取feature map,而后generate一定数量的RoI. 我想首先去掉这个resize的操作,对每 ...

  6. 19年读100本书之第二本--《OKR工作法》-克里斯蒂娜 沃特克

    0,一句话概括书的内容? OKR(objective key result),即目标与关键结果. 1,我从这本书能得到什么? 2,核心内容是什么? 3,我要怎么做?

  7. Lesson 15 Secrecy in industry

    Why is secrecy particularly important in the chemical industries? Two factors weigh heavily against ...

  8. linux jar 启动shell 脚本

    #!/bin/bash APP_NAME=/data/wwwroot/app.jar #使用说明,用来提示输入参数 usage() { echo "Usage: sh app.sh [sta ...

  9. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:多行代码带有滚动条

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. linux 环境下安装jdk

    参考:https://blog.csdn.net/qq_30788949/article/details/81975954 安装 参考: https://www.cnblogs.com/shihaim ...