00:00
下边呢,我们一起来完成这个分页操作。首先我们进行一个分析,看一看完成这个分页我们需要分为哪些步骤,以及每个步骤里面包含哪些细节。开发的时候啊,我们需要分为几层,最底层实际上是操作数据库的DA层,它的上边是包含业务逻辑的service层。这上边controller。控制器对吧,那在我们spring Mac里边的话,这个实际上是对应的那个handleer,这上边JSP面进行显示,好的,我们先看这个DAO,我们进行的是不带查询条件的分页。所以可以直接调用。那个and sorting reposity给我们提供的那个翻页方法还记得吗?Control t,找找page and。
01:10
Sorting repsy给我们提供了一个分页方法,叫翻到,直接调它就可以了,CC。这个接口的这个方法。返回配置对象,那如果要是带查询条件分页呢。应该调哪个呀?应该调那个叫JPA。Specification exor,它给我们提供了一个方法叫find out,里边需要传入一个specification,再传入一个pageable是吧,我们这个是不带查询条件分页,所以说调它就可以了,好的,然后是service service呢。
02:07
啊,我们说我们这个里边啊,没有业务逻辑,所以说就是一个单纯的分页,那我需要把。Controller传入的配置。Number和配置size封装为。Pay对象。需要注意一点。注意。Able的page number是从零开始,然后呢,调用do层的方法即可。
03:00
这就是我们的controller controller。我们先需要干什么?先需要获取配置number,并对配置number进行校验,就是说你传的这个配置。能不能转化成一个数字啊,我得校验一下。然后呢,调用service方法返回page对象。对,然后把配置对象。放入到。Request中最后一个步骤呢,应该是转发页面。GI页面使用gitl来显示页面,这就是我们整个的步骤。
04:01
看到了吧。Do层我们直接使用pig and sorting resit find out方法就可以了。service层。因为没有业务逻辑,所以说我们直接把那个page number跟page size封装为page,需要注意的是这个page number呢是从零开始,然后呢,我调用DAO层的这个方法就可以了。CTRL程,我们首先需要获取这个page number,然后对这个page number进行一个校验,然后调用service的方法返回配置,把这个配置放request里边转发页面JP层直接用GITL进行显示就可以了。好,那我们开始。我们首先来看我们这个代码,这个代码呢,在前一阶段呢,有一点问题,这个报名是不是写错了,应该是entity,我来改一下。把这个改成t entity。
05:03
这个对实际的运行并没有影响,为什么呀,因为我们这个包我们都是到了这个SSP,所以说底层就是这个子包的一个包名,无所谓,好吧,下面的话呢,我们来建一个sy package。PY。建一个employeesy,应该是一个接口。Employer。Reposity。你继承谁呢?我们继承这会那个GPA。这应该是employee。这个应该是in control shift o,好的,我们还记得这个psity,实际上还它是不是继承了配的sing啊,所以说这里边儿有我们需要的那个分页的方法,对吧。
06:08
好。呃,RY就写好了,下边的话呢,我们来写我们的service。Package。我们来创建一个employee service。首先加一个注解,然后呢,Private employee reposity at auto。Public返回一个什么呀,返回一个配置,这个配置呢,就是spring data里边那个employee。Get page pro2个参数,一个是page number,一个是page size。
07:05
At transaction now。这里边这个步骤呢,我首先需要把这个page number跟page size给它封装为一个。这个pageable实际上是一个接口,我们前面讲过,用的话是不是用它的一个实现的叫page request呀,对吧。等new配置。Request等一下page number page size,需要注意的是这个页码是从零开始,这块的话呢,我来剪一个一,然后直接返回employee resit find or方法就可以了。搞定,这是一个只读方法,写一个read only等于true OK。这上边handler。
08:02
就是我们所谓的那个controller是吧,Employee。Controller service。At autowa public string list re,诶,我要返回DMP下边的list这个页面。所以说在这个下边的话呢,新建一个emp。页面呢叫list JSP。list.jp。好,GSP的那个内容的话呢,我们一会儿写,我们先来看我们的handler,这里边呢,我需要传入请求参数。
09:06
对吧。Value叫什么呀?叫配置number,在我第一次获取这个请求参数的时候的话呢,这个请求参数啊,可能不存在,就是我只传了一个URL过来,没传参数,那我就告诉你,你是可以不存在的,默认值呢,就是。一。需要注意我使用配置number s tr,我使用什么呀?我使用一个string进行接收,这样的好处就是即便你传了一个ABC过来的话,我也可以接收这个程序,不至于死掉,听清了吧?就是说你这个请求参数啊,你正常应该是传123这样的,但我就传了一个ABC,这个时候这个程序呢,不至于死掉,我们在这个里边,我们可以进行一个校验,然后我再来搞一个map。
10:02
Object map。我们来写一个int类型的配置,Number等于一。Catch。in.percent我传个page numbers tr进来。这个值呢,就是配置number好了,如果我这块这个转换出错了怎么办呢?出错就出错,出错的话呢,我就取这个一看到了吧,这块就是我们对。配置number的校验,就是说如果你出错的话,那我我不去管你,那你就用一,如果不出错的话,OK,我就可以来使用你。那实际上我们还有一个校验,如果如果配置number要是小于一的话,那我就让配置number等于一对吧,好的。
11:12
下边呢,我们就调用我们的思维方法。Employee page等于employee service点。Get page number page size呢?几为五,放到我们的map里边去。Put page page写完了先需要加上一个request mapping request mapping,我这个的话呢,就EPS好搞定,这上边我们要去写一个index。
12:01
Index的JD。传一个超链接。EPS list or employees,这个时候我在发这个请求的时候,我们看一下发它的时候是不是就没有带这个请求参数啊,这个时候呢,它就能进到我们这个里边来,因为这个参数我并不是必须的,它的默认值就是一看到了吧,这个时候它就调后续的方法进行,呃,获取配置对象就可以了。然后我来写这个list进行显示,显示的时候的话呢,我们需要使用到GSTL,所以说我得把GSTL对应这个价包给他加进来。我去找一下GTL的包。
13:00
GSTL,这这。CTRLC。蒸屉拿过来用一下。我们需要用到扣。实际上呢,在显示时间的时候,我需要对时间进行格式化,所以说我还需要用到一个标签叫fmt。好,够用了。现在呢,我们要来进行一个显示。我们打交道的呢,实际上就是这个配置对象。点开我们需要用到它里边的一些属性,对吧。好的。写个c if。如果传入这个里面没有对应记录的话,那我就告诉他没有对应的记录,哪一个是啊。
14:06
Number of elements,配置等于空,或者是配置点number or four elements等于零,告他一声没有任何记录,那我现在的话,实际上数据表里边就没有任何记录,对吧?因为我这个数据表里边的话呢,我还没有进行填充,我们看一眼。我们找到我们的。打开没有任何记录,所以说如果现在跑的话,应该就是这样的一个效果,我们试一下。
15:03
走起。没有异常,而且告诉我没有任何记录。点一下。好的,没问题,没有任何记录,好了,下边如果要是有记录呢,那就得这么写了呗。c if,如果。它不等于空干什么呀,而且当前页面的记录数大于零。那我就开始写了是吧,写一个table。11。Cell padding10selfpacing0T2TH。CTRLC。
16:09
第一个呢,实际上叫ID,然后叫last name。Email。看一眼我们的entity employee。A birth time。B。Create time。还有一个department,这块显示的实际上是department的name是吧?Department,我们还会有一个edit和delete,这是两个具体的操作是吧?然后是c for each。It应该是我啊,配置里边的什么看他。
17:04
配置里边的content对吧。Content war。DP。第二。TD。八个。EP点。第一个应该是ID,然后是秒。这个应该是什么呀?是birth吧,Birth需要用我们的标签去转一下fmt。Formal date。这样写DMP.boss t y y YY-MM杠,DD。
18:00
下一个呢?是create time。对,也需要来转一下。C c c create time,这包含小时分秒。下一个注意是什么呀?是部门为什么需要注意呢?因为这是一个极点属性,我们暂时哎,先这样写一个哈,写部门一会儿的话呢,我们再来额外的去说它。诶,少了一个好像是是吧。IDO应该少了一个last name。这样写。ep.last name。他俩在一起,他俩在一起。
19:07
下面呢,是两个超链接,一个叫。还有一个叫delete,这两个呢,我们先不写。下边我们会有一个分页的效果,有分页的一个链接是吧。T2TD。Cos应该是八,显示共多少条记录?共多少页?当前第几?还有上一页和下一页好的。
20:12
共多少条记录,我们看一下我们的配置应该哪个是啊,Total elements是吧,所以说这样写配置点,Total elements共多少页配置点。应该是total pages有吗?Total pages total pages当前第几页page点?哪个是应该是number,它从零开始,Number加一上一页。
21:01
过来。应该是这个加一减一对吧,配置number等于。加一,然后再减一。他是从零开始吗?这应该是加一加一是吗?CTRLC过来加一再加一,好了,我们看效果。哦,数据表里边需要插入一定的记录是吧,我们来插入一下,一需要插入几个部门,这个部门呢?呃,总裁办。总裁。开发部。
22:01
后勤保障部。后勤。不。就来一个公安部。每页呢,我要求显示五条记录,所以说。我们增加七条就足够了,随便写了哈。好的,Create time。
23:10
Email AA at硅谷点com。CTRLC这个改成BB。CC。DD de f f。GG,好的,AA。BB CC d de f f g g部门1234123保存。好,跑起来看一看我们的效果怎么样呢?
24:05
注意这个发心。这是我们。第一页的内容是吧,五条,然后呢七条记录。共两页,当前第一页,下一页没问题吧,上一页好了,基本显示是OK的,差一点意思,差什么呀,这个部门没有显示,好了,我来显示一下这个部门,我们看一看它会怎么样呢。他会怎么样啊,大家说。部门儿在这儿。e.department.department name保存。他会怎么样啊?哎,这个时候我们发现我们这个部门呢,都详细的给我进行显示了,并没有出现我们想的那个。
25:02
懒加载异常,为什么呢?因为我们在映射的时候,大家看我是不是映射了这个department啊,我并没有写要启用这个懒加载,我来写一下我使用懒加载的方式。Fetch等于。Lazy。这回我们再来看一下效果。重启走。我刷新。哎哟,是不是出现这个什么啊,叫懒加载异常啊,往后翻看见了吗?啊,不能够初始化代理,因为没有session,所以说需要注意的是默认情况下,GPA里面它是把我关联那个对象,在我获取当前对象的时候,把它直接给获取出来,我把这个再去掉,大家。
26:05
再看一下。保存。刷新,哎,这个时候是没问题的,我们看到什么呀,我们看到我们获取了这个,呃,Department同时呢,也获取了,哦,不是看错了哈,我们在获取employee的同时,获取了每个关联的department,发了N条SQL语句,看到了吧,但这样的话呢,性能很显然是不好的,那怎么办呢?那我就要把这个给它改为使用lazy的方式。好,这样一写完之后的话,问题出来了,怎么样?它会出现懒加载异常。
27:00
走起啊,我们知道是如何发生的吧,因为默认情况下,我们这个事物的边缘在哪呀?事物的边缘在service方法结束的时候。这个一结束,事务结束,Session关了,那我那个employee关联的department就是一个。代理对象页面上,你要用这个代理对象的属性,可不是就出现懒加载异常了吗?可以怎么解决?我们可以使用一个open in view filter,还记得吗?加一个filter进来。配置open,这个不叫open,叫open entity。Manager in view filter。可以。解决来加载异常的问题,就是说特点是在页面上给我开什么呀,给我开这个链接就开这个nity manager,或者是开har那个session,这个时候就不会出现懒加载异常的问题。
28:16
好处是。解决这个问题了,缺点是会使那个session打开的时间,那个链接打开的时间稍微长那么一点,那么在并发量大的时候,它就会出现性能问题,但是作为一个内部管理系统的话没问题,我们给它加上。Name。Filter plus。Open ntt。Manager filter。Con。C filter mapping filter name。
29:08
Ul pattern星。再来看效果,走起。我们注意一下,我们employee这块加了lazy,我把这个页面重新加载一下,这个时候它就没那个问题了,对吧。好了,到这块的话呢,关于这个分页就OK了,那除了刚才分析那个之外,我们需要注意一下这个。Open entity in view filter,再做一个内部管理系统的话,这么做是没问题的,只要你这个并发量不是那么的大。
我来说两句