2 后端操作
后端的准备工作和第一阶段时的分页写法相似,准备好实体类,dao和dao的实现类以及sql代码,service和service的实现类(如果没有什么复杂业务,那么service基本就是直接调用dao即可)以及最后要完成servlet
其中差别最大的是sql代码,需要使用拼接来动态调整查询方式
2.1 实体类
首先是实体类,用于储存分页信息,但是相比第一阶段
①“每页显示几条“,不再是固定值,而是由用户决定进而产生变化
②实体类需要注解实现get方法,其他的均不用注解实现
③实体类的构造函数需要手动构造
只需要传递当前页、每页显示几条、数据库返回的总条数
在构造函数里要对当前页和每页显示几条使用三元运算符进行默认值设置,避免空指针问题
并且设置当前页的传入值,不允许小于1,避免查询错误
不需要设置每页显示几条的最小值,因为用户通常只被允许在固定的数据中做选择
④起始值只需要在类内部进行计算即可得到
2.2 sql代码
不再是静态的代码,而是动态拼接,同时要注意SQL代码的外连接的使用,以避免漏查数据。
//分页查询英雄信息 List<HeroType> findHeroByPage (Heroinfo heroinfo , PageInfo pageInfo ); //在指定条件下统计英雄信息总条数 Integer countTotal (Heroinfo heroinfo); |
2.3 servlet编写
前端通过异步请求将查询需要用到的条件、分页需要用到的信息传给后端的servlet,此时servlet需要做以下操作:
- 处理数据(从请求头中获取查询条件和分页信息)
- 将查询数据封装到对象heroinfo中
- 调用service方法,统计指定查询条件下获得的总数据
- 有了1的分页信息、3的总数据 那么就能组成一个完成的分页信息对象了
- 查询英雄信息(业务需求,需要分页信息用于页面展示)
- 查询英雄类型(业务需求,不需要分页信息用于页面展示)
- 将业务需求的信息以及分页数据封装到map集合中
- 将map集合转为json字符串
- 将json数据通过IO流发送到浏览器上被VUE的异步请求的回调函数接收
3 分页查询 - 封装
在上面的servlet代码中,涉及分页查询的代码是下图三段,分别是获取到数据总数量、封装分页信息、给需要用分页的查询业务分页对象。
现在的写法是未封装状态,这意味着一旦写的项目有多个查询模块,那么每个查询模块都要重复的写这前两行代码,然后再根据实际业务写第三条代码。
因此我们应当将这三行代码封装到service里。
①修改service接口
一旦将上面三条语句直接封装到service中,那么就意味着service的接口要进行调整
①不再需要先查询能获得的数据总数量
②不再需要将查询条件和分页对象都传过去
③只需要创建一个分页查询接口,传入查询条件以及从页面获取的当前页、每页显示几条
②修改service实现类
其实只是把三条分页查询相关代码换了个地方:
①第一条放到了service的实现类中,这样无论几个外部有几个模块,这条必定重复的代码就不用反复写了
②第二条也放到了service的实现类中,在这里组装成分页对象,就不用在外面反复写了
③第三条是业务逻辑,其实没变化,只是因为第二条放到了service里,而第三条又必须在第二条后面,才写到这里
③修改实体类
使用了新的接口和实现方法,并且需要使用分页查询的业务代码被包含在了新的接口方法中,因此现在的思路是将之前分开的分页对象+业务查询返回的集合进行合并,设置了新的分页对象,可以在其中储存需要分页的查询代码返回的数据结果。
使用泛型定义该类,这样才能用泛型集合 data和泛型方法 getData
④修改servlet
最后在servlet上就可以将原来的代码精简成一行代码
原来的:
新的: