通用分页2
发布日期:2022-02-27 17:51:23 浏览次数:41 分类:技术文章

本文共 6773 字,大约阅读时间需要 22 分钟。

通用分页思路

通用分页核心思路:将上一次查询请求再发一次,只不过页码变了

分页是点击下一页时,查询的关键字是不变的,地址也是不变的。
具体思路:
1、补全servlet
2、页面展示
3、分页重要参数(page、rows、是否分页、上一次请求、上一次的表单参数)
4、自定义分页标签

如何将斗破查询关键字传到下一次请求?

将查询参数保存到pagebean中
Map paramMap 存储参数键值对

如何将上一次查询请求再发一次

在pagebean定义一个属性存放上一次的请求

PageBean

/** * 分页工具类 * */ public class PageBean { private int page = 1;// 页码 private int rows = 10;// 页大小 private int total = 0;// 总记录数 private boolean pagination = true;// 是否分页 private String url;//请求地址 private Map
paramMap = new HashMap<>();//携带的所有参数public void setRequest(HttpServletRequest req) { this.setPage(req.getParameter("page")); this.setRows(req.getParameter("rows")); this.setPagination(req.getParameter("pagination"));// getRequestURL获取到浏览器请求的全路径 this.setUrl(req.getRequestURL().toString()); // getParameterMap可以获取到一次url请求所携带的所有参数 this.setParamMap(req.getParameterMap());}public void setPagination(String pagination) { if (StringUtils.isNotBlank(pagination)) { this.setPagination(!"false".equals(pagination)); } } public void setRows(String rows) { if (StringUtils.isNotBlank(rows)) this.setRows(Integer.valueOf(rows)); } public void setPage(String page) { if (StringUtils.isNotBlank(page)) { this.setPage(Integer.valueOf(page)); } } public PageBean() { super(); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public void setUrl(String url) { this.url = url; } public Map
getParamMap() { return paramMap; }public void setParamMap(Map
paramMap) { this.paramMap = paramMap; }public int getPage() { return page; } public void setPage(int page) { this.page = page; }.......... public void setPagination(boolean pagination) { this.pagination = pagination; } /** * 获得起始记录的下标 * @return */ public int getStartIndex() { return (this.page - 1) * this.rows; } @Override public String toString() { return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]"; } /** * 获取到总页数 * @return */ public int getMaxPage() { return this.total % this.rows == 0 ? this.total / this.rows : (this.total / this.rows) + 1; } /** * 获取下一页页码 * @return */ public int getNextPage() { return this.page < this.getMaxPage() ? this.page+1 : this.page; } /** * 获取上一页页码 * @return */ public int getPreviousPage() { return this.page > 1 ? this.page-1 : this.page; } }

视图层:PageTag

将请求再发一次:

String contextPath = req.getContextPath();//根目录
String url = req.getServletPath();//请求的地址
req.getRequestURL() //获取请求全路径
Map<String, String[]> parameterMap = req.getParameterMap();//获得请求中的所有参数
注1:不能将分页表单嵌套到其它表单中,否则不能提交表单!!!
不能将分页表单嵌套到其它表单中,否则不能提交表单!!!
不能将分页表单嵌套到其它表单中,否则不能提交表单!!!

PageTag

/**视图层*/public class PageTag extends BodyTagSupport{ private static final long serialVersionUID = 1L; private PageBean pageBean; @Override public int doStartTag() throws JspException {  JspWriter out = pageContext.getOut();  try {   out.write(tiHTML());  } catch (IOException e) {   e.printStackTrace();  }  return super.doStartTag(); } public String tiHTML() {  StringBuffer sb = new StringBuffer();  //下一次请求提交到后台的表单html代码拼接  sb.append("
"); Map
paramMap = pageBean.getParamMap(); if(paramMap != null && paramMap.size()>0) { for(Entry
entrySet : paramMap.entrySet()){ if(!"page".equals(entrySet.getKey())) { for(String val:entrySet.getValue()) { sb.append("
"); } } } } sb.append("
"); sb.append(""); //分页html代码拼接 sb.append("
"); sb.append(" 每页"+pageBean.getRows()+"条,共"+pageBean.getTotal()+"条,第"+pageBean.getPage()+"页,共"+pageBean.getMaxPage()+"页  
首页  
上一页  
下一页  
尾页  
  
Go"); sb.append("
"); //分页所需要调用的js代码 sb.append("
"); return sb.toString(); } public PageBean getPageBean() { return pageBean; } public void setPageBean(PageBean pageBean) { this.pageBean = pageBean; } }

Servlet(业务逻辑处理层)

//controler  webpublic class BookServlet extends HttpServlet{ private BookDao bookdao = new BookDao(); private static final long serialVersionUID = 1L;@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  //接受表单提交过来的关键字  String bname = req.getParameter("bname");//  String page = req.getParameter("page");Book book = new Book();  book.setBname(bname);  PageBean pageBean = new PageBean();  //把再一次请求的地址存到pageBean  pageBean.setRequest(req);  try {   //查询出符合条件的某一页的记录数   List
list = bookdao.list(book, pageBean); //把值存到req里面 req.setAttribute("bookList", list); req.setAttribute("pagebean", pageBean); req.getRequestDispatcher("bookList.jsp").forward(req, resp);//转发的路径 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } }

然后我们会发现,servlet层接受的数据可能会出现乱码。所有我们封装一个过滤器。EncodingFiter

EncodingFiter

/** * 中文乱码处理 *  */public class EncodingFiter implements Filter {private String encoding = "UTF-8";// 默认字符集public EncodingFiter() {  super(); } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {  HttpServletRequest req = (HttpServletRequest) request;  HttpServletResponse res = (HttpServletResponse) response;  // 中文处理必须放到 chain.doFilter(request, response)方法前面  res.setContentType("text/html;charset=" + this.encoding);  if (req.getMethod().equalsIgnoreCase("post")) {   req.setCharacterEncoding(this.encoding);   } else {   Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合   Set set = map.keySet();// 取出所有参数名   Iterator it = set.iterator();   while (it.hasNext()) {   String name = (String) it.next();    String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]    for (int i = 0; i < values.length; i++) {     values[i] = new String(values[i].getBytes("ISO-8859-1"),       this.encoding);       }   }  }    chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException {  String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集  if (null != s && !s.trim().equals("")) {   this.encoding = s.trim();  } } }

配置

encodingFiter
com.tt.util.EncodingFiter
encodingFiter
/*

展示层bookList

小说目录

书名:
编号 名称 价格
${b.bid } ${b.bname } ${b.price }

我们运行的时候一定要运行BookServlet,不然会报空指针异常,因为PageBean里面没有值。

转载地址:https://blog.csdn.net/shaobina/article/details/93378638 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JSP自定义标签
下一篇:自定义mvc框架1

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月01日 23时42分22秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

mysql幻读是什么意思_MySQL中的幻读,你真的理解吗? 2019-04-21
mysql执行计划中性能最差的是_MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧... 2019-04-21
易语言执行mysql命令_易语言通过“打开”命令操作数据库 2019-04-21
mysql slave 1062_mysql主从同步slave错误1062 2019-04-21
mysql构造器_MySQL行构造器表达式优化(Row Constructor Expression) 2019-04-21
2008日志清理 server sql_SQL Server 2008 清除日志 2019-04-21
mac mysql root 权限_Mac平台重新设置MySQL的root密码 2019-04-21
mysql新增一列_MySQL-ProxySQL中间件 2019-04-21
mysql 30入门_30分钟带你快速入门MySQL教程 2019-04-21
kangle主机怎么配置MySQL_kangle web服务+easypanel主机控制面板快速搭建网站和数据库以及管理空间详细教程... 2019-04-21
mysql 翻页 存储过程_MySQl通用翻页(存储过程) 2019-04-21
2020word替换所有文本_Excel字符函数(5):REPLACE、SUBSTITUTE查找替换函数之区别... 2019-04-21
win10安装ipython_win10环境 ipython app.py 8080 这里为什么是ipython 这步无法启动 2019-04-21
假定在MYSQL_假定在名称为教学库的数据库中包含有学生、课程和选课三个表,它们的定义如下 - 问答库... 2019-04-21
mysql多字段存储过程_mysql 的存储过程_多字段 2019-04-21
python怎么创建字符串列表_如何在python列表中为每个字符串创建子列表? 2019-04-21
vba ado 执行多条mysql 语句_access 按钮 多条sql语句 VBA 2019-04-21
弹性方法计算连续梁板内力_(梁板结构)混凝土结构设计复习题及答案 2019-04-21
java root权限_android java获得root权限调用linux命令 | 学步园 2019-04-21
java最小化窗体_JAVA窗体最大化最小化控制+托盘 2019-04-21