Web核心练习之分页模块和条件模块(后台代码为主,jsp已经落伍)

分页查询分类:

逻辑分页(不常用):

逻辑上进行分页,实际并没有分页操作。
一次性把所有数据查询出来,但是在展示的时候只显示其中某一部分。

优点:只需要查询一次数据库,数据展示的速度比较快。

缺点:非常消耗内存,在数据量比较大的时候有内存溢出的隐患。

物理分页(推荐,常用)

在逻辑上进行分页,实际操作时也进行分页。
查询时就只查某一页的数据。无论数据库表中一共有多少条记录,一次只查其中一页的数据。

优点:占用的空间是稳定可预期的。不会产生内存溢出的问题。

缺点:每次查询都需要和数据库进行交互,实现的难度略高。

sql查询时就需要分页。

涉及的知识:

html知识:

什么是表单?

表单:


创建表单:用form标签创建表单区域,form标签属性:action表单提交的数据什么地方处理,method表单以get或post方法把数据内容提交。

Servlet知识:

request.getParameter("")方法;



获得表单

标签内name=""中变量的值,name是提交表单时,给后台处理程序传递的它们的值。
request.getParameter("");是后台得到该值的方法。

JDBC知识:

query查找:

jdbcTemplate.queryForObject()参数是什么,返回值是什么?
参数是(动态sql,封装类型.class,动态sql中的?位置的参数),返回一个封装类型对应类的对象
还有这种奇葩方式:

jdbcTemplate.query()参数是什么,返回值是什么?
参数是(动态sql, new BeanPropertyRowMapper<泛型>(封装类型.class),动态sql中的?位置的参数),返回一个一个封装类型对应类的对象List
使用BeanPropertyRowMapper将数据库查询结果转换为Java类对象

数据结构:

前台->后台

目标页码 currentPage(为了转换为当前页,所以也叫currentPage)

页面显示数量 rows\pageSize

后台->前台

当前页码 currentPage

页面显示数量 rows\pageSize

总页数 totalPage = Math.ceil(totalCount/rows)

总数据量 totalCount

数据列表 list

为了数据传递和操作方便,我们把上述5个数据封装到一个对象中,起名为PageBean。

逻辑

从list.jsp或者从index.jsp开始,给Servlet发送要查询哪一页的信息


这里还顺便做了选中页码激活

在Servlet中获取请求参数,把两个参数传给Service

在Service中,目的就是封装PageBean中的所有数据。

PagingQueryServlet类调用service包实现类UserServiceImpl中pagingQuery()方法:

该方法调用了dao.impl包中UserDaoImpl类中findTotalCount()方法和findByEachPage()方法

层次总览:


原则:缺什么补什么。

查询数据库:查询总数据量,查询数据列表
计算开始索引 = (currentPage - 1) * rows
在Service中调用DAO方法把需要从数据库获取的数据得出来,在DAO中实现数据库查询的两个方法

limit m,n;m: 开始索引,n: 查询的数据条数

把PageBean返回到Servlet中,存入到request域,转发到list.jsp中

在list.jsp中,使用EL+JSTL回显分页数据

分页条处理

1页码最好不要从1遍历到最后一页,自行处理一下开始和结束的页码

分页条边界值处理

前台要做有效性校验

后台也要做有效性校验

在Service中进行校验:

条件查询:

在分页查询的基础上,额外获取查询条件进行sql的拼接。
如何动态生成sql?
使用一个恒等式把主体sql中的where关键字给确定下来,然后所有的额外条件只需要拼接and语句即可。
select * from user where 1=1
[and name like ?]
[and address like ?]
[and email like ?]
limit ?,?

posted @ 2019-12-27 21:37  卯毛  阅读(254)  评论(0编辑  收藏  举报