条件查询+分页查询的组合。
复习:
jsp: java server page:java服务器页面
必须在服务器端执行的页面。
jsp:执行过程,servlet类。
1、在servlet服务器中先转义,变成.java文件(是一个servlet类)
2、编译 变成.class文件
3、service();它的存在主要是把程序员从繁琐的out.println();out.write()中解脱出来,把jsp中的内容直接进行输出,
因此jsp要比servlet强大。
jsp:组成部分:
1、静态 主要是指html 和css 部分。
2、动态 主要指: 指令 脚本 注释 动作元素,EL 和 JSTL(需要导入jar)
page:使用大量的属性,来说明这个jsp页面中都可以干啥。比如之前说过的flush,isELignore, errorpage 等等。还有导入啊 语言啊~这些部分。
include:静态包含,生成一个.jsp文件
taglib:引入jstl标签库的形式,(处理程序,tld(描述符文件)),jsp页面引入某一个库
<%! %> <% %> <%= %>
<%-- --%> <!-- -->
jsp 内置对象(隐式对象):request response out session application pageContext page config exception
jsp 四大作用域: page request response application (pageContext服务器上下文环境可以取得四个域)
el:可以取值,自动类型转换, 输出语句,赋值标签的属性,计算
可以取值,取作用域中任何类型的值,javabean变量名,get方法。
参数:param
Empty
jstl: c:
set remove out
if choose
foreach
1、增 删 改 查 (全部查询和分页查询)
2、登录成功以后展现所有的图书,分页展现,还可以借书还书
3、查看所有读者所借过的书
4、条件查询
部分实现分页的工具类:
对四个属性进行封装:
package com.letben.util.bean; public class PageBean { int pageSize = 2; int count = 0; int totalPage = 0; int currentPage = 1; public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public int getTotalPage() { return count%pageSize == 0?count/pageSize:count/pageSize+1; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(String page) { if(page!=null){ this.currentPage = Integer.parseInt(page); } } public PageBean(int pageSize, int count, int totalPage, int currentPage) { super(); this.pageSize = pageSize; this.count = count; this.totalPage = totalPage; this.currentPage = currentPage; } public PageBean() { super(); } @Override public String toString() { return "PageBean [pageSize=" + pageSize + ", count=" + count + ", totalPage=" + totalPage + ", currentPage=" + currentPage + "]"; } }
页面使用代码:
<p> <c:if test="${pageBean.currentPage ==1 }"> 首页 上一页 </c:if> <c:if test="${pageBean.currentPage>1 }"> <a href="BookServlet.do?page=1">首页</a> <a href="BookServlet.do?page=${pageBean.currentPage - 1}">上一页</a> </c:if> <c:if test="${pageBean.currentPage==pageBean.totalPage }"> 下一页 尾页 </c:if> <c:if test="${pageBean.currentPage<pageBean.totalPage }"> <a href="BookServlet.do?page=${pageBean.currentPage + 1}">下一页</a> <a href="BookServlet.do?page=${pageBean.totalPage }">尾页</a> </c:if> </p>
分页的使用
/** * 利用另外一种方式,实现记录分组。从导航栏和查询毕竟要判断两次,如果是从首上下尾页进入,那么就记录此状态,否则不记录。 * @param request * @param response * @throws ServletException * @throws IOException */ private void conditionResearch(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ String flag = request.getParameter("historical"); Person p=null; if(flag==null){//说明是从非分页位置进来的。 //不应该记录p。所以: request.getSession().removeAttribute("p"); //移除后,应该开始记录p属性 String name = request.getParameter("name"); String phone = request.getParameter("phone"); String idcard = request.getParameter("idcard"); p = new Person(); p.setName(name); p.setPhone(phone); p.setIdcard(idcard); request.getSession().setAttribute("p", p); }else{//从分页位置进来的 Object obj = request.getSession().getAttribute("p"); if(obj!=null){ p = (Person) obj; }else{ //未得到分页 预存属性 System.out.println("未得到分页 预存属性"); } } PageBean pageBean = new PageBean(); pageBean.setPageSize(2); pageBean.setCount(readerService.researchCountByCondition(p)); pageBean.setCurrentPage(request.getParameter("page")); List<NormalReader> readers = readerService.reserachByCondition(p, pageBean); if(readers!=null){ request.setAttribute("pageBean", pageBean); request.setAttribute("readers", readers); request.getRequestDispatcher("readers.jsp").forward(request, response); }else{ //未查询到分组用户 System.out.println("未查询到分组用户"); } }
下面为老师原版判定方式:【麻烦】
private void conditionResearch(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ String flag = request.getParameter("flag"); Person p=null; if(flag!=null){//导航进来 request.getSession().removeAttribute("p"); }else{//不是从导航进来的 String flag2 = request.getParameter("flag2"); if(flag2!=null){//是从查询语句进来的。移除p属性 request.getSession().removeAttribute("p"); } Object obj = request.getSession().getAttribute("p"); if(obj==null){//如果没有取到的话,就创建 p= new Person(); String name = request.getParameter("name"); String phone = request.getParameter("phone"); String idcard = request.getParameter("idcard"); p.setName(name); p.setPhone(phone); p.setIdcard(idcard); request.getSession().setAttribute("p", p); }else {//取到的话,强制类型转换: p = (Person) obj; } } PageBean pageBean = new PageBean(); pageBean.setPageSize(2); pageBean.setCount(readerService.researchCountByCondition(p)); pageBean.setCurrentPage(request.getParameter("page")); List<NormalReader> readers = readerService.reserachByCondition(p, pageBean); if(readers!=null){ request.setAttribute("pageBean", pageBean); request.setAttribute("readers", readers); request.getRequestDispatcher("readers.jsp").forward(request, response); }else{ //未查询到分组用户 System.out.println("未查询到分组用户"); } }
跟老师当时的情况,多少也有关系,因为,当时检测的时候老师先写好了内层判断,这个时候一个不小心,从导航栏点了一下,这样的话,就要加一个在导航栏的判断,显得逻辑上,就很囧,可能未来进入的方式还有各种,但是如果是从上下页进来的,那么我们就牢牢记住这些个点,就很好。所以在我的方式没有出现bug之前,先按照我的方式记忆。
然后,这里面在 使用框架跟不适用框架的区别在于,自己写的东西,需要在每一次查询都要带着这个分页的条件,放在 session里面,然后 找到 合适的机会清楚,对于 框架来讲,这些条件一直都被保存着,在合适的时机清楚很重要。