十六 StudentManagerSystem的一些业务实现
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 }条
总记录数${pageBean.totalSize }
<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的一些业务实现的更多相关文章
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- 十六款值得关注的NoSQL与NewSQL数据库--转载
原文地址:http://tech.it168.com/a2014/0929/1670/000001670840_all.shtml [IT168 评论]传统关系型数据库在诞生之时并未考虑到如今如火如荼 ...
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...
- ng机器学习视频笔记(十六) ——从图像处理谈机器学习项目流程
ng机器学习视频笔记(十六) --从图像处理谈机器学习项目流程 (转载请附上本文链接--linhxx) 一.概述 这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流程.采用的业务示例是O ...
- Nodejs学习笔记(十六)—Pomelo介绍&入门
前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...
- 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 ...
- 二十六个月Android学习工作总结【转】
原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...
- SpringBoot | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
随机推荐
- office 2016
Excel 2016: F4 : 重复上一步操作. 例子: 如果上一步是合并单元格, 则 再次选中其他几个单元格, F4即再次完成合并. 单元格中插入对角线: 选中单元格, 右键--设置单元格格式- ...
- Python语言——列表生成式
生成[1x1, 2x2, 3x3, ..., 10x10]列表: >>> L = [] >>> for x in range(1, 11):... >> ...
- leetcode菜鸡斗智斗勇系列(6)--- 检查一个string里面有几个对称的字段
1.原题: https://leetcode.com/problems/split-a-string-in-balanced-strings/ Split a String in Balanced S ...
- Mybatis笔记一
课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 mybatis框架原理 (掌握) myb ...
- 从零构建以太坊(Ethereum)智能合约到项目实战——第23章 从零构建和部署去中心化投票App,decentralization Voting Dapp
P90 .1-从零构建和部署去中心化投票App-01 P91 .2-从零构建和部署去中心化投票App-02 P92 .3-从零构建和部署去中心化投票App-03 参考博文:http://liyuech ...
- python3升级pip报错ImportError: cannot import name 'main'
把系统的python版本从默认的2切换到3后,使用pip3安装依赖报错,如下: Traceback (most recent call last): File , in <module> ...
- JavaScript 数字
数字(Number)也称为数值或数. 数值直接量 当数字直接出现在程序中时,被称为数值直接量.在 JavaScript 程序中,直接输入的任何数字都被视为数值直接量. 示例1 数值直接量可以细分为整型 ...
- springboot 模板
参考:https://blog.csdn.net/wangb_java/article/details/71775637
- 【原】python异步学习
https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 https://www.jianshu.com/p/b5e347b ...
- word无法切换中文输入法的解决方法
问题: 在word编辑文字的时候,莫名其妙地出现只能输入英文字母无法输入中文的现象,输入法状态条也不显示,而输入法是正常的(在其他编辑器中可正常输入汉字) 解决方法如下:word 2003:菜单工具- ...