00:00
好,那么接下来呢,我们完成咱们的员工更新的最后一步,哎,我们信息显示出来了,当我们写正确以后,我点击更新,就把咱们这个员工信息更新完成好,我们就为这个更新按钮,诶我们之前呢,给更新按钮给了一个ID,我们为这个更新按钮绑定一个单机时间。好,这个应该是点击更新,咱们这个更新员工信息,更新员工信息好,我们来为更新按钮,就是它绑定一个单击时间。好进行更新,那么也一样,在更新之前呢,因为我们这有一个邮箱的这个输入框,得进行表单验证,看它是否合法,所以说呢,这块也一样验证咱们这个啊邮箱。邮箱是否合法,好,我们把邮箱刚才的邮箱验证逻辑我们拿过来邮箱验证好就是这一块。
01:07
校验邮箱信息。好在这只不过呢,我们要验证的这个邮箱ID不是它了,我们来看啊,我们的这个邮箱这个input框,它的ID叫email update。哎,这个email update email更新的这个输入框好验证它,当它验证成啊错误以后说邮箱格式不正确,验证成功以后啊,Success就行啊。其他的我删掉。邮箱验证,邮箱验证我们这个成功以后呢,哎,成功了以后,我们接下来进行下边的事情,哎,就应该是咱们这个发送Ajax请求,保存咱们这个更新的,保存更新的咱们这个员工数据好,按照我们之前的uri约定,我们发送请求要发送一个put请求,带上员工ID,我们来更新员工好,我们先把这个请求处理我们写出来。
02:11
这一块呢,是咱们这个查询员工,根据根据咱们这个ID查询,然后呢,我们下边我们来写一个保存员工啊,保存成功与否,也是返回咱们这个message对象,好保存员工我们就叫save emp,把提交的咱们这个员工数据,我们也封装成employee对象。好,Employee项,然后呢,来。Return,那先来return,来把保存逻辑写完好。他要处理的请求request好,他要处理的请求呢。就是我们这个杠EP,然后呢,带上员工ID,然后但是请求方式,哎,请求方式我们来看啊请求方式。
03:09
请求方式就是我们的这个put请求,哎,必须发一个put请求,第2PUT好发一个put请求,然后呢,我们MVC,哎把提交过来的员工数据封装,封装成功以后,哎,我们调用咱们这员工的更新方法,比如呢,我们有service,有一个叫update e,把我们的员工对象来放进来。更新完成以后,我们就来返回第2SUCCESS,好,我们来创建出这个员工的更新方法点。好,这个呢是员工更新,哎员工更新,然后呢,我们来看咱们这个更新,这个更新呢,我们来调用employee member,诶这个呢,它有一个叫update方法,这update呢啊有一个根据主更新,我们要用的是根据主见有选择的更新,因为我们。
04:11
页面提交过来的数据啊,我们的员工的这个名字是没带的,所以说不更新员工名字带了哪个更新哪个好,按照主见有选择的更新好,这个呢就更新完成。更新完成以后呢,我们这个方法就写好了,哎,整个响应response body就是它啊,这是我们这个员工更新方法。员工更新方法啊。接下来我们就来页面来完成这个逻辑来,当我们点击更新按钮来确认更新以后呢,咱们这个先邮箱校验,校验完成成功以后,我们发送aja请求,诶发送AJ请求,更新员工URL地址,这个地址呢,就是我们刚才刚写的那个方法APP pass好,我们请求EP,然后呢,带上咱们这个员工ID,哎,就是这个方法关键这一块啊,这个员工ID怎么带呢?我们来看。
05:14
如果我们这个编辑按钮我来点更新,要想获取这个员工ID还挺不好弄的,我们可以呢,在打开咱们这个模态框的时候,这个编辑按钮上有咱们这个员工ID,我们把这个员工ID呢,我们可以传递到咱们这个更新按钮上,我们就更新更据更新按钮带到咱们这个啊员工ID来更新也可以,好,所以说呢,我们来传递一下。那么呢,我们在这儿打开我们这个模态框啊,点击咱们这个编辑打开我们这个模态框,哎,这个模态框这是查出员工信息并显示,然后这一块打开模态框啊,我们把员工的ID传递过去,把员工的ID传递给咱们这个模特框的,咱们这个更新按钮,好,那这个更新按钮我们就来找到它。
06:10
找到它这个更新按钮的ID呢,就是employee update button,好,给它一个at tr。给他一个咱们这个ID的值。它的值呢,就是咱们这个,哎,这是获取员工ID的值,好我们拿过来就行了,好,那么呢,我们接下来刷新刷新我们来看啊,点击编辑那这个更新按钮的应该就传递过来了,诶这个更新按钮是一,那么呢,我们编辑五号员工这个更新按钮就是五好没问题,那么呢,我们这个有ID了,我们接下来那就简单了,我们找到只需要调用咱们这个this。加上啊,咱们这个当前对象。
07:04
什么值呢?At tr把当前咱们这个元素的edit。ID的值,好员工ID的值,然后呢,这是我们请求的UI的地址,我们就做好了,那么做好以后呢,我们接下来,哎,咱们这个请求方式,这块请求方式呢,哎,我们在这里边。在web我们一开始配的时候,有一个过滤器叫hidden h filter,它能将post请求转为指定delete或者put请求,所以说呢,如果我们是页面的表单提交,哎,我们可以method等于post,然后带一个杠,Method等于put的值,那么呢,我们也可以来先来按照这种方式,它的类型呢,先是post。但是他带的这个数据,带的这个数据呢,当然就是我们这个添加的,呃,员工修改的这个表单序列化后的数据啊,我们来看一下啊,在这个表单员工哎员这是员工修改模态框。
08:11
我直接给他就写序列化就行了,员工修改模模态框里边的这个表单序列化后的结果,我们来看这个序列化的函数,哎,在这我们调用它。序列化后的结果好。这个数据,那么呢,当我们成功以后,Success function。有返回值,我们可以alert一下啊,我们返回过来的服务端,返回过来的这个提示信息是成功了还是失败了,哎,我们来可以看一下啊,我们来启动一下服务器。走,启动一下服务器。
09:01
启动一下服务器,我来刷新。好,刷新我们来假设呢,就来修改咱们这个末页,末页的咱们这个AA,我点编辑它的email呢,我们来改一下,改成咱们这个bbb特163南啊,我们改成测试部,我点更新走,哎,我们来看啊,这个更新呢,员工的ID是发对了,更新请求在这有,包括呢更新的数据email真的didd也有,但是我们来看啊,他说有错误,说request不支持,诶不支持的原因呢,是因为我们这个要发,我们更新是咱们这个put特请求,所以说呢,你要这么发,那就带上杠板索的参数,那么我们这个表单序列化,它带的这个参数没有杠板索的,诶我们来看啊,没有它,所以说呢,我们可以在这序列化后边我们来加上。
10:00
加上我们再来拼上and,咱们这个慢,哎,就等于哎,我们这个put请求好,我们这么一写,我再来测试刷新,好们还是来到最后一页,我们来修改AAA走,好,我把这个清空好,我们把它修改成AAABBB好,女男,我们这个开发部,好,我们点一个更新走。好,处理成功点一个确定我们来看啊,这个处理成功以后呢啊,我们来看到最后一页变了吗?我们发现来是不是并没有改变啊,那我们来看一下并没有改变的原因是什么呢?好,我们来到我们这个控制器,控制器呢要按照ID去更新员工,我们呢,可以看一下我们这个员工,我们将要更新的数据是什么。这个呢,是将药。将要咱们这更新的咱们这员工数据,员工数据首先确保这一块进来的数据是正确的啊,有数据再来保证后边的逻辑好,直接打印employee对象,那为了观看方便,我们给employee对象填上图论方法,诶这有这有呢,带上did的菟丝砖好,那么呢,我们再来看。
11:20
我来启动服务器。好,启动我们来看这个更新,我刷新来到最后一页,我们重新更新。好,来到最后一页,我点击编辑,我们修改成bbb男测试部,好。走哎,这处理成功,但是我们来看,咱们这个控制台打印我们来看啊。Employee name我们没提交,哎,所以说呢,他是那他不更新,真的,哎,这都是我们提交的数据,但是看关键。员工的ID是不是为空啊,而我们要按照选择的更新,我们来看我们调的方法,调employee member的update by primary key selective,那么来到我们这个member的实现里边呢?哎,就是在这。
12:17
我们来看它的这个呢,更按照咱们这个主键,按照咱们这个主键有选择的更新带了哪些字段,更哪些字段,Where ID,咱们这ID等于我们取出来的值,然后我们现在这是nu,相当于呢,我们要更新一个ID,等于nu的这个员工,那自然他就没不行了,究其原因就是我们这个ID没带上来,不是这个路径上都带过来了吗?怎么还没有封装在employee对象中呢?哎,其实我们看啊,这个路径上我们带的叫ID,而employee对象中呢,我们叫m employ e ID,所以说呢,两个没啥关系,我们把这个路径中的这个呃,占位符我们也改成跟咱们这个对象中属性一样,哎,这样就可以了,我们可以再次测试一下,好重新启动。
13:13
重新启动。好,重新启动以后呢,我们来。来刷新,我们来重新来刷新,我们来到最后一页模一页好,这个我们点编辑好,这个呢,我们来改成PB好难,开发部点更新好,处理成功,处理成功,我们看控制台,诶员工ID就进来了,那么这一块呢,应该他也更新成功了,我要点关闭,重新来到最后一页,诶数据就对了,所以说呢,哎,这是我们这个更新的这个基本操作。好,我们来到这个页面,这是一个能基本完成的,但是呢,我们来说咱们这个杰克瑞啊aja,我能直接去发送普特请求,而不需要呢,整一个cost,还带一个杠man速的好,所以说呢,我们希望直接来发,直接来发以后呢,哎,我们这么写就简洁多了,我们来看行不行,刷新。
14:12
那么刚才那种方式呢,是可以的,大家也可以那么做,那我们来试一下,直接发送,好,我点编辑,我把男的又改成女BB改成AA,好,测试部我要点更新,哎呀,这个没情况,完蛋了,我们来看控制台报错了,报错呢,我们来看报错的原因,他说我们有一个语法异常,说在咱们这个where employee ID等于1014,好这然后呢,我们这个怎么能有语法异常呢?我们先来看啊,我们更新的员工数据,诶这就有点问题了。我们这个除过我们路径上带的咱们这个员工ID进来了,剩下的数据居然全是呢。
15:00
好,这个问题赶紧注意一下,如果直接发送Ajax请求,直接发送咱们这AJ等于等于put形式的请求,我们封装的是咱们这个数据。哎,直接呢,除过我们这个路径,哎,我们说这个路径上带了咱们这个ID,剩下的全是呢,那么全是浪的原因是什么呢?来F12。F12,我们来看啊,我们再来发这个请求,我来刷新。啊,点击编辑好,还是一样,我女测试部,我把这些都去掉,我点更新好,完蛋了,但是呢,我们来看请求的这个数据,哎,Email这些数据都还在请求题里边有数据,所以说呢,我们来先看看现在问题。问题就是咱们这个请求其中请求其中有数据,但是employee对象。
16:04
对上封装不上,一封装不上以后呢,就会导致我们这个控制台错误,错误原因是什么呢?哎,我们这个更新方法employee,好这个更新方法他来找所有的字段,但是咱们这些字段全为空,所以说它这个circle拼串就变成这样了,好我们来到咱们这个处理器,当我们这个字段全为空,好这一块全部为空circleq拼串,那就直接就来到我们这个VR条件。好,就拼成这样好,我们的控制器。V,咱们这ID等于幺,比如1014好整成这样,那整成这样的话呢,我们这些set条件都没有了,那肯定语法有问题,所以说呢,哎,我们找到了这个问题所在,它这个请求对象封装不上,那封装不上的原因是什么呢?哎,我们就来说一下。
17:03
这是咱们这个汤姆凯特的问题,也就说呢,汤姆凯特它是咱们这个呢,将那么请求其中的数据,数据那么呢,会封装一个咱们这个map,然后呢,我们这个request第2GET。哎,如果呢,我们要获取,比如EP name就是从就会从这个那不中取值,而我们都知道。好,这是第一步,他将请求体中的所有数据封装map,然后呢,我们这样就是从map中取值,而我们MVC。MVC啊,封装咱们这个数据的时候,封装咱们这个pogo啊对象的时候,它呢,会把会把咱们这个pogo中每个属性。
18:05
的,然后呢,调用request get到。F me。比就说呢,比如我们看你这个po中,我们有咱们这个员工的email,诶我们就调用这个方法拿到,但是呢,我们说Tom cat把请求体中的数据会封装这个mapvc,只是调用request get从map中取值,那么我就能大胆的猜测。哎,你这个HTTP,我们把原生的request对象进来,Htp request,你这个request对象的请求。我们直接调用request get估计都是拿不到get,我们employee对象呢,有一个咱们这个员工的,咱们真的比如呢,我们就拿员工的真的值。
19:00
好,正的值,我们来输出一下它拿出来的请求体中获取的值。你看啊,我们这个发请求的时候请求体哎带了email,真的如果按照正常request get,那么是能获取导致的这题求题。中走咱们这个值,那现在来重新启动,我们来看一下是不是真如我们所猜想的这样。好,我们来重新发请求,我来刷新,好,来到呢,我们假设来到最后一页,好,我把这个去掉,我们来修改AA,好,它的这个我们也改成AA女测试部,好,我把这些都删掉,我点更新走,我们请求发出去,发出去以后呢,我们的数据也都在,但是我们来看控制台。
20:00
走,看控制台,诶请求题中获取的值确实拿不到,所以说呢,这是我们to KT的问题,那么这个呢,就是我们诶aja来发送put请求,哎引发的悬案。哎,这个葡萄请求啊,不能直接发血案呢,就是咱们这个,哎。Put请求。请求体中的数据。的数据,咱们这个request get都拿不到。拿不到的根本原因是因为他们看一看。一看是put请求,就不会封装请求提出的数据。数据为咱们这个map,因为我们这个请求体中的数据是map,从这个map中拿,而只有post,只有咱们这个post,也就是说呢,Post形式的请求,我们才封装请求体,才咱们这个封装请求体。
21:17
喂,咱们这个慢,那么呢,这个相关的咱们汤姆cat源码的位置,我来也提供给大家,我在这儿呢,打断点来找,嗯,已经不好找了,我们来直接锁定我们这个源码的位置,好,这是地盘。好,这是Tom它的,我在下边这个压缩。好,这个源码呢,有一个这个Java里边源码都在这里,Java org阿帕奇卡特琳娜,好,我们这个所有的数据,呃,第一次进来都是在这个8080端口,哎,所以说呢,我们8080端口这是一个连接器,我们进connect里边,这里边呢有一个request对象。
22:00
这个request对象呢,它是在这个包下,我们来标志一下,在这个包下有一个我们这个request对象,我们来看一下request对象,哎就是它它呢,它就是htp request有一个它它里边定义了咱们这个request解析的办法,哎往下翻一直在下边。在我们往下找啊,在3000多行左右,好在这一块有一个方法叫pass parameters,诶就是这个方法。这个方法呢,在咱们这个刚才这个3111行,哎,有一个这个方法,这个方法里边呢,我们来看这个方法的这个描述啊,比如呢啊有呃,他在这里边拿到咱们这参数,然后呢,先看判断是不是超了咱们这个呃数量,然后这一块还有设置给primeter设置咱们这个编码等等,我再往下看啊这一块呢,是处理查询字符串,哎,就是我们URL地址问号后边的这一堆,但是呢,下边有一个这么一个方法,我把它复制过来。
23:09
这个方法呢,它做了一个判断,如果哎,它调用get connect get connector,这个方法呢,啊,我们来看一下。Connect就是拿到咱们这个连接器对象。他调用了一下这个get connect,我们呢,回到刚才的这个位置。好,调用拿到连接器,然后呢,调用连接器是否呃,Is pass body method的方法啊,有一个判断,如果这个判断啊不成立,那直接啊咱们这个就返回了,判断成立才执行后边的后边的呢,我们大概可以看一下啊后边呢,如果我们这个啊内容是我们文件上传表单,它就解析每一个部件,如果呢,啊咱们这个不是咱们这个啊普通的这个表单他就呢这个直接返回了,没有后续的流程了,后续的流程呢,我们大致可以看一下,哎,拿到咱们这个内容的长度就是在这一串解析工作,哎,咱们这个be数轴来表存form data用呢,哎,Read post body哎,读取咱们这个post请求体中的数据等等等等,好,那么呢,我们关键就来到了这一处判断,这一处判断呢,就是拿到连接器,然后调用它的is pass body muscle的方法。那么这个连接。
24:30
气呢,也在我们圆码的,哎,就是这个。它来双击打开这个连接器,找到咱们这个判断方法,诶就是在这儿,这个判断方法呢,也非常简单,哎,它就返回我这个pass body muscle set这个集合里边是否包含我们这个muscle的值,而这个muscle的值呢,我们来看啊,我们来关键就看这个集合里边是否包含,而这个man速的值呢,就是我们当前请求的请求方式。
25:02
我们来看这个集合里边有什么内容,我来找一下,好,这个集合呢,刚好在上边有一个赋值,这个赋值呢,是一个method的set,哎,就是说如果我们传入了这个method,这相当于这一块是定义连接器的规则,如果连接器允许我们解析非请求的请求题了,我们传入规则,然后呢,我们默认这一块都是没有的,所以说呢,啊,我们这一块啊,Pass method set,哎这一块呢,应该是一个默认值,这个默认值我们来看。走来看看,诶这一块呢,有一个我们来看这个passman默认呢是一个空值,空值呢我们来看用到它的地方,哎,用到它的地方这一块,如果pass muscle默认是空的,它在这里边,哎就设置有一个叫pass body muscles这个。东西啊,他要来设置这个设置呢啊,就是来到了我们刚才的这个方法啊,给咱们这个赋值,而这个赋值工作呢,我们来看啊。
26:09
它给这个设置呢,其实就是把这个muscles之类的付给这个pass body method这个值,来找这个muscle值啊,就来找这个值就行了,好把这个呢拿到pass body method的这些值,这个值呢,默认是多少,我们可以来看一下。在这好,哎,你看啊,正好我们这个connect连接器有一个属性,它默认就是post,所以说大家这一块注意,然后呢,只有post请求啊,如果是post请求啊,我们才会执行后续的流程,哎,就是在这儿,它判断当前请求方式是不是包含在其中,我们是put方式啊,而我们默认解析呢,咱们这个集合里边只有post请求啊,Put没在这个集合里边,直接返回不解析,否则呢,我们才往下解析,这就是我们原码的关键位置。
27:06
下一节课哎,我们就来解决咱们这个问题。
我来说两句