00:00
然后呢,这个地方我们来做一个画一个流程图,流程设计的代码都比较好写,好下边来做一个叫分页查询市场活动,分页查询市场活动知道吧,好,下面我们来设计这个流程。看看他到底怎么去做的,首先刚刚我们说所有的流程,我们说我们做外部开发,所有的流程都是从客户端发起的,所以你写程序第一个环节永远是客户端,客户端不发请求,你的程序永远不会执行,所以我们第一个环节永远是客户端。我们说这个客户端就是浏览器,从技术上来讲就是GSP网站。用户在浏览器上面发出请求了,这个流程才开始,那我们大家一块儿来分析一下,那用户是吧。如何发起整个分页查询的这个流程,那我们来看看在客户端上面发生了什么事件,他开始发查询的请求了,那发生什么事情他开始发查询请求,需求说的很明白了,怎么明白了?三个需求,每一个需求都可以发起一个流程,查询的流程哪三个需求?第一个当市场活动主页面刚一加载完,去显示所有数据的第一页,那应该向后台发请求去查询所有数据的第一页。
01:23
知道吗?所以当整个页面加载,整个页面怎么加载吗?那用户一点这个菜单,然后就可以什么行,那么这个在这个地方就应该打开市场活动的主页面,市场活动主页面一旦加载完,就应该向后台发请求,发起一个查询的请求,去查询所有数据的列表,第一页列表以及所有数据的总条数去查出来就行了。还有一个这是第一个发起请求的,这是第一种情况,可以发起一个查询的请求。第二种情况,当用户填写查询条件填完之后,一点查询按钮去查询所有符合条件的数据,第一页以及所有符合条件中总条数,就这一种情况也可以发请求,当用户一检查院钮也可以。
02:06
然后呢,这是第二种情况可以发起这种流程,第三种情况,当用户已切换每页想条数或者已切换页号的时候,也可以发起一个查询流程,所以大家我们这个地方,我们就把这三种情况都可以发起查询流程的,这三种情况我们用一句话来代替,哪一句话这个地方来邮键我来一句话哪哪一句话就是客户端发出就发出查询请求,查询请求如何发现查询请求根据需求三种情况下都可以放查询请求,哪三种情况,第一种当市场活动主页面加载完成。加载完成去查询,那么所有数据的所有数据的第一页,第一页这是需求说了,当整个页面加载完,显示所有数据的第一页,以及所有数据的总条数,总条数,这种情况下可以发查询的请求,我把这个什么这个注释给大家写到这,这种情况可以发请求。第二种情况,当用户点击用户。
03:26
他想看他感兴趣的数数据输入查询条件,输完之后点击查询按钮去干嘛?去查询所有符合条件的数据的第一页,第一页以及所有符合条件数据的总条数,总条数,这是第二种情况,第三种情况也可以发整的什么什么当用户,当用户用户然后呢,切换每页显示条数和页号的时候,他想看第几页的数据知道吧。
04:08
是吧,然后呢去查询。所有去查询所有指定。每页显示条数和页号的数据以及以及什么所有符合条件数据的总条数条数。这三种情况下都可以向后台发请求,发起这种查询请求,我就把这三种情况用一句话来代替了,这三种情况我写成注释里边,然后呢,我也点这个应用大纲,这是发起一个查询请求。这发起产品请求,这三种药都可以发起,不管是哪一种情况发请求,那么都是向后台发的请求,为什么向后台?因为数据都在后台的,你必须从后台去查询,所以像后台按钮,那像后台环,你后台大看是不是得提供CTRL去处理了。
05:13
得处理,你要不提供的话,那他没法什么,这个请求没有人处理了,没有人处理那这个地方,那你这个请求这个流程画不下去了。进行不下去了,推不下去了,所以这都是需求推动往前推的,你要提供一个controller去接收和处理这种查询的请求,那这个CL我问我问大家一下这个CTRL是新创建RL,还是在原来CRL基础上加号码?加方法对,是不是加方法,为什么加方法对?你看他响应信息将来会返问哪个页面,去那个页面看看是不是占独立一个资源目录,它返问信息返回到哪个页面里边,对in该S,那这个页面的话是不是占这个资源目录,这个资源目录是不是我们已经有了一个control桌了,叫市场活动存桌,在这个control桌基上加方法就行。
06:05
所以大家这个这个原则大家要会,然后呢,这个地方呢,还是在我们activity activity controller,在这个control里边加方法这样了,加一个方法,这个方法干什么,将来就是根据条件去分页查询我们的市场活动,向他查一个,发一个叫查询的请求,这三种情况下都可以向这个CR发一个查询请求。那这个请求大家,我问大家一下,写代码之前,你必须明确这个请求是同步的还是异步的。对,为啥一波。对,没有跳转页面是吧,响应信息回来之后,是不是只刷列表和总条数,这些是不是都不变,都不变,其实就是局部刷新,没有跳转页面,所以他这个什么是个异步请求。
07:03
异补请求,异步请求,那异步请求需要提交什么参数?那个就是实验20记录,对,那你看这个他你看是需要什么参数,谁来决定呢?10CTR者来决定是不是这样子,他处理请求需要什么,他说你给他传什么,他不需要,你传了也白传,除了影响效果,他需要的,如果你没给他传,他处理不了请求,所以你看他需要什么参数,他需要什么参数,你看他干什么事,这个CTRL将来要干什么事。按得按条件去查数据,查数据查什么,查列表,查总条数,是不是这样的,知道吧,为什么你说呢?你怎么知道查列表查总需求,说的很明白了。显示的时候要显示列表和总条数,所以它肯定先查出来,肯定在它里边查出来,然后显示到现在有。
08:02
那查列表,查总条数需要什么参数?对查列表的时候需要什么参数?北京查生所有都是开对是不是这些查询条件了,你要查询哪些数据,是不是这些查询条件了,就这样是吧,那你说老师第一种发取的方式,没有查询条件,没有查询条件你给传个空就行了,那明白这个意思吧,就这样啊,所以说大概我说总之这个查询条件你要传过去,除了查询条件这个我把这个查询条件传上去,因为这个CTR呢,他需要查列表的时候,他得需要知道查询哪些数据,他得根据条件去查去,所以这个地方他就查,那他就把查询条件传上去,除了查询条件之外,这个CTRL还得去需要知道什么什么什么参数。对,你去查所有符合条件的数据,把所有符合条件有几百,有几百条,几千条,几万条,你能不能都查出来。
09:03
都查出来,你说老师就都查出来,都查出来,这个页面显示不完呀。那他要分页查,分页查是不是你得知道要查询什么,哪一页的数据,你他是看第一页的数据,你让他你只查第一页的数据就行,然后呢,他看客户端需要看第二页的数据,你只要查第二页数据,他看第三页,你只看第三页的数据就行,那关键是大看这个control,他怎么知道客户端需要看第几R数据呢?对,是不是把把那个每页想把他看那个页号传过去啊对,当用户切换页号的时候,把切换到哪一页了,把那个页号传过去就行了,那就老师前两个需求没切换,没切换默认显示第一页的数据,把那个一传出去了,但能理解这个意思吗?这样对,所以说大刚我们说他要按照条件去查,可以按照条件条件查,会查到几百条几千条记录。
10:00
那我们要分页显示,看看第几页数据,把那个页号传上去,页号我们就简单给大家命名了,就叫page置number page number叫页号,前两个需求这个页号就是一,第三个需求切换到哪一页了,这个页号就是几,传到后台就行了,这个CTRL就知道看第一页的数据了。除了这个页号之外,CTRL要想查询列表,查询总条数,还得需要知道什么参数。配置size,对配置size每页显示条数,你只告诉我你看第一页的数具,你每页看第几条,你不是你每页想看几条,你想看十条,我给你把第一页前十条给你显出来,你想看20,我把前20条给你显出来。知道吧,你想看30条,我把前30条给你查出来,知道吗?所以你得前台得告诉他每页显示条数,我们把每页显示条数叫配。那这胚胎到底等于多少,看客户切换多少,它切换的十就是十,切换20就20,切换30就30,那你说前两个需求没切换,没切换默认是十。
11:07
那你怎么知道默认是需求?说的很明白了。如果没有明确指定每页想调入多少就是十知道吧。好,这是我们说到这,那大家看如果说这个CTRLL,如果拿到这些数据之后,是不是他就能够把前台所需要的,所需要显示的那些列表和总条数都能显示出来了,对,都能查出来了,他只需要知道这些参数就行了,根据条件查询指定页号,指定每人想条数的数据都可以享出来知道,好这样的话,大哥这个客户端每次这三种情况下发请求,不管哪种情况下都得向后台传这参数,因为后台处理的时候需要这些参数啊。好,这样的话,这个CTRL接到请求之后,他怎么办呢。三个职责,第一个职责,接收请求有参数,获取参数,这是他的职责,咱们前面给大家讲代码分层的原理的时候,给大家讲过了。
12:07
参数拿到之,那么接收到井兽获取参数怎么获取定义行参获取参数,这查询条件和配赛是不是有好多参数,多个参数对封装一下啊,封装参数,那封装参数封装成什么啊封装什么?我们最常用的封装参数,要么卖,要么实体对象。这个地方风热脉搏还是风热实体最小。那你看这些参数是不是属于同一个世界对象呢?哪一个是对象?没有是吧,没有那怎么办呢?自己建是吧,那自己建是不是就麻烦了,所以那这个时候呢,对map他们不是属于一个实体对象,我要如果封装实体,我还得自己创建实体类,那这个他们封卖卖。
13:03
好,这是我们说的啊,这那这样CCTRLL第一个职责就完成了,接入掉请求参数也都拿到了,拿到之后也都非常好,非常好之后下边第二个值道处理业务,处理业务干嘛处理数据,我们这个地方就是查询数据,查询数据查什么查,根据条件分页查询数据的列表,再一个还得什么,根据条件查询所有符合条件数据的总条数,这是前台需要显示的,你得把这两个数据查出来,那这两个数据查怎么查,他不直接查他干不着啊对掉service掉那一个一个查呗。查列表,那调一个service,查总条数也调一个service,那么那首先的话先看查列表吧,那调列表的service,那调这个service,调谁的service呢。我要查市场活动的列表,调谁的service,对,市场活动对,因为你要查市场活动那个表调市场,在市场活动service边加一个方法,这个方法咱们现在虽然没写,现在你可以先设计出来了,我说代码写之前这些代码都已经设计好了,在里边加一个方法给他调过来,这个方法我就建明之义的写了,哪一个这个查询,那就query查询什么查询市场活动。
14:23
这是query activity,根据什么去查,对BY根据什么是根据条件查,根据条件是不是只根据条件查,也不是还得分页,分页怎么办?叫for配置,嗯,知道吧,这是这个方法名就设计好了,下边它这个方法加个小Y,小Y是方法的标志,是不加小Y,它不是方法这个小法,然后这个方法里边要传个参数,这个参数什么类型呢?对外部封装号外部,所以这个参数,这个方法我们都已经设计好了,方法名参数等等都设计好了,然后呢,这个service调的它之后,它就可以访问数据库,根据这里边封装的这些条件都在map里边,根据条件去分页查询市场活动。
15:11
到数据库里边去查了,他不能直接访问数据库,他得调什么,调map,调谁的map activity map我们说了,我们我们后台的service map层的代码的原则就是说访问一张表,对应个实体类,对应个map接口,对应个文件,对应一个service,所以在这个map里边再加一个方法,这个方法也是根据条件分页查询市场活动,我就直接设计了select activity,然后呢,这个是by condition,根据条件去查询市场活动,而且是分页可for keep,然后这里边成了一个map。然后呢,大家看那这个地方这个map就可以通过MY去访问数据库,去执行搜狗语句,这个搜语句现在大家都可以大概想象一下这个骚数句大概是个什么样的骚水句了。
16:05
因为这些语法你都学过了,对根据条件分页查询市场活动,你看这个搜数句什么样子的,然后呢,去查询市场活动列表,是查询完了之后把查询的结果往后上。那这个结果大看是个什么什么结果。对,根据条件去查询所有符合条件的数据,是不是有可能是多条,有可能有多条数据啊,对每一条数据是不是可以分成一个实例对象,那多条数据呢?对list的,把这个list返回去,那这个service拿到list之后,继续往外返,返回谁,谁掉它,它返回谁,CTRL掉它返回CTRL了,哎,K别这意思,继续往外返,返回ctl,这样CT就拿到所有符合条件数的列表,就拿到了下边查总条数了,因为前台还需要总条数,所以这叫总条,所以这叫另一个service去查询总条数,再来一个service查询市场活动,所有符合条件的数据的市场活动的总条数。
17:11
对这个service是哪一个service,对市场文字service还是查询市场活动那个表,还是市场活动service,艾克特service,然后呢,在这个service里边加一个方法,加一个方法,然后呢,这个地方来加一个方法。不能加分,这个方法我就直接写了建明之意,方法名你随便写了,我就建明日了,查询总条入啊,叫query查询总条入叫query查询吧总条数,这个方法名怎么命名啊?Come off,谁的总条数?市场活动总条数根据什么去查?总条数根据条件去查,这样用户一建明之意大家知道都看到,诶这个方法名,这个方法是干什么用的大家都知道,那这个条件是个什么类型的,还是map封装网卖,就是根据这些查询条数条件去查询所有符合条件的数据的总条数。
18:10
那么这个service我们说它将来调map,所以那调过来用map,那调用谁的map,还是市场活动的map知道吧,然后呢,在市场活动map里边还得也得加一方法,那加一个方法,这个地方也得加一个方法。是吧,那这个方法也是根据条件去查询所有符合条件的数据,这个市场活动的总条数,所以呢,这个方查询叫然后呢总条数count,然后呢off I,然后呢by condition,然后呢,这里边传来一个map,然后呢这个说map就可以通过买八的访问数据库执行骚数据了,而且这个骚数据大家也现在也这个阶段也就应该能够想用到这个骚数据大概是个什么样的扫数机来查询市场的总条数来查询,然后呢市场活动的总条数,然后查询完了之后,把查询的结果往外放了,那结果是个什么类型的,对印的总条数对印的,然后呢,如果多了,你可能说如果数据量太大的话,你肯定是个浪,也行,知知,反正整个是整数是吧。
19:25
好,这样的话个这个CT就拿到前台所需的列表和总条入了啊。这是我们这,诶这个涉及到这个地方,大家有可能有疑问呢,说老师一个CTRLL怎么能掉两个service的方法呢?可不可以啊可以对可以CTRLL就是掉sorry的方法,只要是sorry方法它都可以掉。不管调几个都行,随意定,并不一定说啊,一个CTRL只能掉一个,它不是这样的啊,它分层的代码怎么说CTRL就是调service,调几个都行,只要需要,当然同样的道理,Service也有可能调多个map,但现在咱们一个service能调一个,因为咱们现在业务比较简单,以后我们做复杂的业务都一个service者可能掉好多map。
20:14
一个肯段也可以调多个,多个肯肯多service,就这个意思知道吗?好,这是我们说的,知道那又有的同学又说了,哎,老师不对啊,我们已经搭建开发环境的老师跟我们说了,我们把事物加到service了,你一个CTRL调service的话,调两个service,这是不是两个事物?一个service方法,一个事物确实是两个事物,它将来调的一个事物,它也是一个事物,诶那你说不对了,那他处理一个业务差两个方法,差两个数据的时候,那他俩不在一个事物里边了。那不在一个事物里边怎么了?他俩数据就不一致了。那这样的话,我们这个数据有可能会对我们系统里边数据造成不一致啊。
21:05
会不会造成不一致?我为啥不会呢?这就surface,对啊,他一个事物,他一个事物,万一他掉的时候成功了,他掉的失败了,或者他成功了,他失败了,那他这时候不回滚啊,那是数据不一致了。就这个业务来说,他俩没有担保。咱就是查询总是。对,大家看这俩service,虽然他俩是两个事物,但这俩数据改我们数据库逻边数据了吗?没改,他俩是查数据的,查数据不改我们的数据,即使一个成功了,一个失败了,会不会对数据库里边数据造成不一致?不会,他都没改数据,他成功了,他失败了,他大不了失败了没查出来数据,他不会改数据库里边数据,大家能理解这个意思吗?对,查询数据不需要放在一个数事物里边,哪怕一个成功了,一个失败,也不会造成数据不一致,但能明白吧,就这样,所以说查询的时候不一定非要放到一个测试次方数,那我大家我进一步的说了,假如他俩都是写数据的。
22:17
做同一个功能需要什么?执行两个service的方法,他俩都是写数据的,这是写第一条数据,这是写第二条数据,如果放到两个service方法里边,可不可以,不可以,为什么呢?如果放到两个字,他俩两个是我假如说这个地方写成功了,他写失败了,他写这了,他只是回滚他的,他成功了,他数据已经写好了,这个时候他没写好,数据就不一致了。同样道理,他成功了,他失败了,也数据也不一致,大家能理解这意思吧?对,写数据的时候放到两个侧边同行里边,不行,只能放到一个侧边同行里边。一个S方法干什么?在一个S方法掉两步,调两个map调两半,在同一个事故里边这个S,如果这个这个功能如果失败了,他成功了回滚,同样道理,他失败了,他成功了回关,要么同时成功,要么同时失败,这个时候写出去数据才能保持一致性,如果是写数据必须放到同一个策service方法里边。
23:21
如果是查出去无作为了。知道吧,我又进一步的说了,假如他俩是查数据的,我能不能放在同一个特方法里边。可不可以啊,可以,那可以,那怎么放,那那就放到一个字上,这个方法返回一个什么,既返回列表,也返到总条数,那反正我CTRL都能拿到,CTRL1调这个service,一个servicel的方法,你知道吗?他查询两个数据,把这两个数据返回了,诶你说L一个方法怎么能返回两个数据呢?一个方法返回两个数据能返回吗?咋返回啊。对map或者放到什么,对对象里边,大家可不可以啊,对这儿,所以大家这些思想你要会什么,那那你说老师你这个地方为啥不放在一个service方法里边。
24:10
对,放在一个sol方法不灵活了,怎么不灵活了,假如我在一个so索上,里边既查列表又查总条数,我们这个地方肯T定,这既需要列表又下总条数,我这个地一调,哎,俩数据都拿到了,万一我又一个地方只需要列表,或者另一个地方只需要总条数,你把它俩写在一起,你调的时候是不是不需要的也给你查出来了,影响效果了,不灵活了知道吧,所以查数据的时候能不分开就分开知吗?这样更灵活。写出去不得不放到一起了,才放到一起。这个这是我们的我们的原则,就这这是我们设计流行,所以大家这个思想大家要知道啊,而且你最好什么整理一下我们这个思路是吧,记下你以后设计项目,设计功能,你也要这么做。
25:02
我们说我们做这个项目不仅仅是写代码啊,我写出来代码你照抄一下。那我们说很快我们这个项目就结束了,我们不是赵高,主要是这个分析的思路,我是分析思路,知道吧,以后你自己也要这么干,知道吧,好这样的话,大概我们这个什么,这个数据我们就是查出去就分开了,分开更灵活。然后把两个数据什么,把两个数据都查了,查出来之后,这个CTRL第二个业务就处理好了,第二个功能就处理好了,第二个功能干什么处理数据啊,数据都处理好了,该准备的数据都准备好了,一个列表,一个总条,然后怎么办呢?对第三个第三个职责,根据查询结果生成响应信息,要往回返了,根据查询结果,然后呢,生成响应信息,生成响应信息是相机,然后把响应信息返回到前台就行了。
26:03
这个这个响应,那大家可以想象一下这个响应信息是个什么样的信息。对,你看啊,这个奖应信息。对,那你看啊,那从格式上来讲啊,到底是个at网页还是个杰字符串呢,这是我们最常用的返回的主主句啊。对,是不是杰森字符串,为什么杰森串E步请求阿贾克斯发的响应信息要给到阿贾克斯,阿贾克斯能解析的数据是不是一定是个阶层字符串?对,一定是个阶层字符串,那这个阶层字符串里边包含什么呢?对里边包含什么,你看你前台需要什么,对前台需要什么。对,那前台是不是只需要显示列表和总条数啊对,把列表你查询考核列表总条数返回前来就行了,那就返回吧,这个地方首先来看列表,列表那么总条数和列表一块返回,那放到一个对象里边,这个对象就一个接字符号,就这个是大括,大括里边有两个数据,这两个数据分别起名字,首先列表起个名字,那我们这个名字列表这个名字起个名字叫什么呢?
27:20
对这个list是吧,那我就艾list这一个,这一个这一个对这个这个数据的名字,那冒号后边数据的值,这个值是个什么数据,对Li Lia转成阶二转成什么样的阶组成。也是大括号吗?大括号是对象,List转成杰森号转成什么?中括号对中括号是什么?数组在阶段里边叫数组,数组里边每一个元素是什么?你看这个每一个元素是什么,对这个对象对象有大括。
28:02
大括号在杰森里边表示对象。中括号在杰森里边表示什么数组知道吧?所以这个Li子的这个值是一个数组,数组的每个元素是一个市场中的对象,那这个对象里边有什么?有市场活动的属性名对,属性值,这种ID然等等,还开始及结束日期等等,这这是一个只要这个list里边有一个市场红对象,就转成一个大括,就一条记录,然后又一个对象呢,又一个大括号,对,那这个大括告也是属性名,然后呢,属性值知道,然后呢,这有多少个Li色,里边查出来多少个列表,列表里边多少个元素然有多少个大包。知道吧,这是我们说这个数据,这个数据。这是一个数组,还有一个总条数,总条数也要反向相的,那给他起个名字吧,总条数我就叫total RO就表示总记录的条数,它的值是个什么?对in特值知道吗?把一个整数值反过去,总之把这俩数据分成一个一个杰森字符串里边看吧,阶层对象里边这是一个。
29:16
这个什么数据的名字,数据的值,数据的名字,数据的值,这个数据的值又是一个,又是一个什么数组,数字是一个一个对象,市场活动对象。这样的话看,这就是我们要返回的这么一个阶层字符串。这这我们这这个接算字符串,然后把这个接算字符串回到我们这个作为响应信息是吧,然后返到前台那钱台拿到之后啊,返回的钱在哪个地方了。对,阿贾克斯那个斯塞斯那个是不是回调函数里边了,斯塞斯那个塔里边了,那阿贾克斯拿到这个阶之后怎么办呢。对,解析这个杰森是吧,解析杰森。
30:07
把这个界线里边的列表都取到,总条数也都取到,取到之后干什么?对对,列表是个数组变了,数组每变出来一条,在这个中方显示一横,每变出条显示一行,怎么显示就拼移字符串,拼好之后往下边显示。查出来几个拼几个,然后呢,把那总条数想到这个地方就行了,我们把这个过程叫做渲染页面。渲染一点,站起来。这让用户来看,从前台不管通过哪一种方式发请求,都会得到一个列表和总调控。当第一种方式显示所有数据的第一页的列表和所有数据的总条数,第二种需求是所有符合条件数据的第一页的列表和所有符合条件数据的总条数,第三种需求根据它切换的每页减条数和页号去显示所有符合条件的这一页的这么多条数的列表和所有符合条件的数据的总条数。这三种需求就行。
31:14
这样的话,我们这个流程就设计好了,其实这个流程大家已经看到,他也不难,主要这个思路大家要清晰,那下边写代码就很好写了,其实这个代码应该说在这个阶段好像在你脑子里边已经写好了,剩下的就一个敲的一个过程,因为这些语法大家都已经写过很多遍了,好吧。好,这个语法我们一会来写一下就行了,好下边大家休息一会,就是我们来写一会来把这个代码写完了,好,下边大家休息一会儿。
我来说两句