CRUD
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>