使用c 语言建设网站优点,手机网站被自动跳转,cms网站模板套用教程,北京网站建设公司如何选一 分页概述
1 介绍 将大量数据分段显示#xff0c;避免一次性加载造成的内存溢出风险
2 真假分页
① 真分页 一次性查询出所有数据存到内存#xff0c;翻页从内存中获取数据#xff0c;性能高但易造成内存溢出 ② 假分页 每次翻页从数据库中查询数据#xff0c…一 分页概述
1 介绍 将大量数据分段显示避免一次性加载造成的内存溢出风险
2 真假分页
① 真分页 一次性查询出所有数据存到内存翻页从内存中获取数据性能高但易造成内存溢出 ② 假分页 每次翻页从数据库中查询数据性能低但不易造成内存溢出
二 分页设计
1 分页传递参数 – 需用户传入的参数 currentPage当前页跳转到第几页int类型设置默认值比如1 pageSize每页最多多少条数据int类型设置默认值比如 5
2 分页展示数据 – 分页依赖数据(分页条) beginPage首页 prevPage上一页 nextPage下一页 totalPage总页数末页 totalCountrows总条数 currentPage当前页 pageSize每页显示多少条数据
3 分页展示数据的来源
① 来源于用户传入 currentPage当前页int类型 pageSize每页显示多少条数据int类型 ② 来源于两条SQL查询 totalCountrows数据总条数int类型 datalist每一页的结果集数据List类型 ③ 来源于程序计算 totalPage总页数末页int类型 prevPage上一页int类型 nextPage下一页int类型
4 结果总条数与结果集 结果总数totalCountrows和结果集datalist来源于两条SQL
// 查询符合条件的结果总数totalCountrows
SELECT COUNTFROM 表名WHERE 条件// 第一个从哪一个索引的数据开始查询默认从0开始
// 第二个查询多少条数据
SELECTFROM 表名WHERE 条件LIMIT ?,? 第二条SQL中的两个参数第一个取值为currentPage-1* pageSize第二个取值为pageSize都来源于用户传递的参数
5 总页数与上下翻页 总页数与上下翻页来自程序计算
// 优先计算 totalPage
int totalPage rows % pagesize 0 ? rows / pagesize : rows / pagesize 1;
int prevpage currentPage -11 ? currentPage - 1:1;
int nextpage currentPage 1 totalpage ? currentPage 1: totalpage; 三 分页实现后台
1 流程 2 数据封装 为实现流程效果需将查询回的分页数据封装成一个对象传递给JSP这样只需要共享一个对象即可
3 封装对象 – PageResult
Setter
Getter
public class PageResultT {//上一页private Integer prevPage;//下一页private Integer nextPage;//总条数private Integer totalCount;//总页数private Integer totalPage;//当前页码private Integer currentPage;//每页显示条数private Integer pageSize;//查询的集合private ListT list;/*初始化分页对象有参构造*/public PageResult(Integer currentPage,Integer pageSize,Integer totalCount,ListT list){this.currentPagecurrentPage;this.pageSizepageSize;this.totalCounttotalCount;this.listlist;//总页数总条数/每页显示条数 当求模运算值不等于0的时候总页数加1this.totalPage(this.totalCount%this.pageSize0)?(this.totalCount/this.pageSize):(this.totalCount/this.pageSize1);//上一页this.prevPage(this.currentPage1)?(1):(this.currentPage-1);//下一页this.nextPage(this.currentPagethis.totalPage)?(this.totalPage):(this.currentPage1);}
}4 Dao层实现 为实现分页Dao层需增加两个方法一个是查询数据总量一个查询当前页的数据
// 数据总量
int queryCount(int currentPage,int pageSize);
// 结果集
ListEmployee queryPage(int currentPage,int pageSize);MyBatis提供的操作方法传入执行SQL的参数只能是1个此时两个参数需要传递两个分页实参可以使用Map封装参数或者使用JavaBean封装参数
5 封装分页参数 – QueryObject
Setter
Getter
public class QueryObject {private Integer currentPage1;private Integer pageSize3;public int getStart(){return (currentPage-1)*pageSize;//计算查询的起始索引}
}6 编辑对应的Dao接口 // EmployeeDao/*查询总条数*/int queryCount(QueryObject qo);/*分页查询*/ListEmployee queryPage(QueryObject qo);7 编辑Dao的实现类 Overridepublic int queryCount(QueryObject qo) {return sqlSession.selectOne(cn.tj.mapper.EmployeeMapper.queryCount,qo);}Overridepublic ListEmployee queryPage(QueryObject qo) {return sqlSession.selectList(cn.tj.mapper.EmployeeMapper.queryPage,qo);}8 编辑对应Mapper文件 !--查询总条数--select idqueryCount resultTypeintSELECT count(*) from employee/select!--分页查询--select idqueryPage resultTypeEmployeeSELECT * from employee limit #{start},#{pageSize}/select9 业务层实现 Servlet调用时返回分页查询的结果返回PageResult对象形参类型为QueryObject // service层接口/*分页查询*/PageResultEmployee queryByPage(QueryObject qo);// service层实现类/*分页查询*/Overridepublic PageResultEmployee queryByPage(QueryObject qo) {//查询总条数int totalCount employeeDao.queryCount(qo);if(totalCount0){return new PageResult(qo.getCurrentPage(),qo.getPageSize(),0, Collections.emptyList());}//查询分页集合ListEmployee list employeeDao.queryPage(qo);//创建分页对象PageResultEmployee pageResultnew PageResult(qo.getCurrentPage(),qo.getPageSize(),totalCount,list);return pageResult;}四 分页实现前台
1 流程 前台主要指Servlet及JSPServlet处理请求调用业务方法把查询到数据共享到JSP中展示给用户看。 浏览器发出分页请求参数去往第几页每页多少条数据在Servlet中接收这些参数并封装到QueryObject对象调用Service中分页查询方法query. 把得到的分页查询结果对象PageResult共享在请求作用域中跳转到JSP显示即可。 修改JSP页面编写出分页条信息分页条中的信息来源于PageResult 对象。
2 EmployeeServlet
// 获取页面传递的分页参数执行查询将结果共享到请求作用域请求转发回到list.jsp页面
WebServlet(/employee)
public class EmployeeServlet extends HttpServlet {private EmployeeService employeeServicenew EmployeeServiceImpl();Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//设置编码格式req.setCharacterEncoding(utf-8);resp.setContentType(text/html;charsetutf-8);// 登录权限判断 操作员工需要先登录HttpSession session req.getSession();Users users (Users) session.getAttribute(USER_IN_SESSION);if (usersnull){//如果没有登录跳转登录页面给出提示req.setAttribute(msg,请先登录再操作);req.getRequestDispatcher(/login.jsp).forward(req,resp);return;}//获取请求分发的参数String cmd req.getParameter(cmd);if (delete.equals(cmd)){//调用删除delete(req,resp);}else if(input.equals(cmd)){//跳转到增加或修改页面input(req,resp);} else if(saveOrUpdate.equals(cmd)){//保存增加或修改saveOrUpdate(req,resp);}else{//查询所有list(req,resp);}}/*增加修改保存*/private void saveOrUpdate(HttpServletRequest req, HttpServletResponse resp) {//封装员工对象Employee employeenew Employee();/*将参数的获取及封装对象过程抽取成一个方法*/req2employee(req,employee);/*根据请求中是否携带id判断执行增加或者修改操作*/String id req.getParameter(id);if (StringUtil.hasLength(id)){employee.setId(Long.valueOf(id));//执行修改employeeService.update(employee);}else{//调用dao方法执行增加保存操作employeeService.add(employee);}try {//跳转到查询resp.sendRedirect(/employee);} catch (IOException e) {e.printStackTrace();}}/*封装的获取请求参数的方法*/private void req2employee(HttpServletRequest req, Employee employee) {//获取请求中表单参数String name req.getParameter(name);//验证输入的表单参数不能为空if (StringUtil.hasLength(name)){//编辑员工姓名employee.setName(name);}String salary req.getParameter(salary);if (StringUtil.hasLength(salary)){employee.setSalary(Double.valueOf(salary));}}/*跳转到编辑页面*/private void input(HttpServletRequest req, HttpServletResponse resp) {//根据请求中是否携带id判断是增加或者修改操作String id req.getParameter(id);if (StringUtil.hasLength(id)){//请求中携带了id执行修改//根据id查询员工Employee employee employeeService.selectOne(Long.valueOf(id));//将查询的员工存储到作用域req.setAttribute(employee,employee);}try {//跳转到WEB-INF下面的页面input.jspreq.getRequestDispatcher(/WEB-INF/views/employee/input.jsp).forward(req,resp);} catch (Exception e) {e.printStackTrace();}}/*分页查询所有*/private void list(HttpServletRequest req, HttpServletResponse resp) {try {/*客户端如果传入了当前页码和每页显示条数则设置给qo对象如果没有传入则使用默认值*/String currentPage req.getParameter(currentPage);String pageSize req.getParameter(pageSize);QueryObject qonew QueryObject();if (StringUtil.hasLength(currentPage)){qo.setCurrentPage(Integer.valueOf(currentPage));}if (StringUtil.hasLength(pageSize)){qo.setPageSize(Integer.valueOf(pageSize));}//调用service分页查询的方法PageResultEmployee pageResult employeeService.queryByPage(qo);//将查询的结果存储到请求作用域req.setAttribute(pageResult,pageResult);//转发到列表页面req.getRequestDispatcher(/WEB-INF/views/employee/list.jsp).forward(req,resp);} catch (Exception e) {e.printStackTrace();}}/*删除*/private void delete(HttpServletRequest req, HttpServletResponse resp) {try {//获取目标idString id req.getParameter(id);//调用删除方法int row employeeService.delete(Long.valueOf(id));//删除完毕跳转到查询resp.sendRedirect(/employee);} catch (IOException e) {e.printStackTrace();}}
}3 list.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
%--引入核心标签库--%
%taglib prefixc urihttp://java.sun.com/jsp/jstl/core %
html
headtitle员工信息页面/title
/head
body
centerh3员工列表/h3p当前登录账号${sessionScope.USER_IN_SESSION.username}/pp%--点击跳转到上传头像的表单页面--%a href/headImg.jsp%--头像--%img src/upload/${sessionScope.USER_IN_SESSION.headImg} width100px height100pxp${sessionScope.USER_IN_SESSION.headImg}/p/a/ppa href/employee?cmdinput增加员工/a/ppa href/user?cmdlogout退出登录/a/p%--分页跳转的表单--%form action/employee methodposttable border1px cellpadding0 cellspacing0width800pxtheadtrth序号/thth姓名/thth工资/thth操作/th/tr/theadtbody%--动态展示员工列表数据--%c:forEach items${pageResult.list} varStatusvs varemployeetr classtrClasstd${vs.count}/tdtd${employee.name}/tdtd${employee.salary}/tdtda href/employee?cmdinputid${employee.id}修改员工信息/anbsp;nbsp;%-- a href/employee?cmddeleteid${employee.id}删除员工信息/a--%a href# onclickdeleteTr(${employee.id})删除员工信息/a/td/tr/c:forEach/tbodytfoottr aligncentertd colspan9a href/employee?currentPage1pageSize${pageResult.pageSize}首页/anbsp;nbsp;a href/employee?currentPage${pageResult.prevPage}pageSize${pageResult.pageSize}上一页/anbsp;nbsp;a href/employee?currentPage${pageResult.nextPage}pageSize${pageResult.pageSize}下一页/anbsp;nbsp;a href/employee?currentPage${pageResult.totalPage}pageSize${pageResult.pageSize}末页/anbsp;nbsp;当前是第 ${pageResult.currentPage}/${pageResult.totalPage}页nbsp;nbsp;一共${pageResult.totalCount}条数据nbsp;nbsp;跳转到第input typetext namecurrentPage value${pageResult.currentPage}onchangechangePagesize() stylewidth: 50px页nbsp;nbsp;每页select namepageSize onchangechangePagesize()option value3 ${pageResult.pageSize3?selected:}3/optionoption value6 ${pageResult.pageSize6?selected:}6/optionoption value9 ${pageResult.pageSize9?selected:}9/option/select条数据nbsp;nbsp;/td/tr/tfoot/table/form
/center%--鼠标移动到当前行实现背景颜色高亮显示--%
script//获取所有的行元素不包含表头var trs document.getElementsByClassName(trClass);//遍历行元素集合for(var i0;itrs.length;i){//鼠标移入当前行高亮背景变成灰色trs[i].onmouseoverfunction (){this.style.backgroundColorgray;}//鼠标移出恢复原来背景颜色trs[i].onmouseoutfunction (){this.style.backgroundColor;}}
/script%--删除确认表--%
scriptfunction deleteTr(id){//确认删除var b window.confirm(确定要删除选中的员工信息吗);if(b){//确定删除执行后台删除操作window.location/employee?cmddeleteidid;}}
/script%--分页表单提交函数--%
scriptfunction changePagesize(){document.forms[0].submit();}
/script
/body
/html