十六 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 | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
随机推荐
- T4 多文件生成说明
1.安装T4,自动生成文件 Manager.ttinclude <#@ assembly name="System.Core"#> <#@ assembly na ...
- The Last Puzzle ZOJ - 3541
题目链接 本题也是区间dp,贪心可证,每一次出发必定是从端点,否则必然有重复,不会是最小值,那我们可以设dpi,j,0/1,0代表从左端点出发,1代表从右端点,因为每次都是从端点出发,状态方程为 dp ...
- Spring Boot 项目本地运行无异常,部署到 Linux 服务器运行报错:java.lang.ClassNotFoundException
一 背景 最近在用 Springboot 开发项目 A,引了小伙伴开发的模块 B,本地起服务,运行的好好的,等部署到服务器上,一运行就报错:Caused by: java.lang.ClassNotF ...
- extractvalue报错注入
查看源码 $uagent = $_SERVER['HTTP_USER_AGENT']; ………… $uname = check_input($_POST['uname']); $passwd = ch ...
- 二十一 Struts的数据校验两种方式:手动编码和xml校验
数据的校验: 一.前台校验:JS校验 JS的校验不是必须的,JS可以被绕行,可以提升用户体验 二.后台校验:编码校验 必须的校验 三.校验的方式: 手动编码(不建议使用) 配置文件(支持) 手动编码的 ...
- 多线程server与多client通信
鉴于ServerSocket的accept方法是阻塞的,那么只能通过多线程的方式实现多客户端连接与服务器连接 基本步骤: 1,服务端创建ServerSocket绑定端口号,循环调用accept()方法 ...
- Java--输入与输入
输入 java.util.Scanner java.lang.System java.io.Console ``` Scanner in = new Scanner(System.in); // 新建 ...
- 2019暑期集训第二讲 - 组合数学&概率&数学期望
A - 容斥原理(CodeForces - 451E) 二进制状态压缩暴力枚举哪几个花选的个数超过了总个数,卢卡斯定理求组合数,容斥原理求答案 可以先把每个花的数量当成无限个,这样就是一个多重集的组合 ...
- Educational Codeforces Round 72 (Rated for Div. 2)C(暴力)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[200007];int a[20 ...
- jsp 页面使用标签遍历
<tbody> <c:forEach items="${page.list}" var="exhiMain"> <c:set va ...