通用分页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 MapparamMap = 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("
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 { //查询出符合条件的某一页的记录数 Listlist = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月01日 23时42分22秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mysql幻读是什么意思_MySQL中的幻读,你真的理解吗?
2019-04-21
易语言执行mysql命令_易语言通过“打开”命令操作数据库
2019-04-21
mysql slave 1062_mysql主从同步slave错误1062
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
mysql 翻页 存储过程_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最小化窗体_JAVA窗体最大化最小化控制+托盘
2019-04-21