00:00
接着呢,我们再来看一下啊,这些九大内推断当中的其他两个,比如说out和response,那么大家注意啊,我们知道这个response。是表示响应是吧,表示响应,那么我们经常用于设置返回给客户端的内容,简单点说就是输出对吧,输出嘛,好了,那么out呢,大家注意哈,Out呢也是。给用户做什么呢?输出使用都是一样,都是输出,那我们来看一下吧,他俩的输出有啥区别啊,有啥区别好我们在这里呢,再来一个接着批,叫做output。好间号,百分号,我们先用response咱们学过的来做输出right right好,咱们说response输出一。
01:04
我们加个换行啊,然后呢,到response输出二是吧,两个嘛,好,那咱们在这边来。Output,大家看有输出吧,没问题是吧?好,那现在请看一下哈,我们把这两个做了。我们用out来试一下。我们说out.right咱们说out,输出一,哎呀。稍等。那么我再来alt输出啊,好大注意看了哈,现在呢,我刷新这个alt是不是也可以输出对吧?好没有问题,那么现在大家注意看一下哈,我们把这两个解开。对吧,那按照这个顺序来说,那肯定是response在前面,On在后面,没错吧。
02:01
诶,稍等。他这个热部署还没有过来。啊,不行的话,咱们就来重新部署一下哈,如到实施不够了,咱们就重新部署一下。好重新部署怎么看成功了呢?啊,这里打印对吧,部署成功了啊来我们刷新。大家看绿response先执行,所以律response在上面没错对吧?Out在后面没错吧?四指输出嘛,好大家注意看哈,那现在如果说我们把这两个输出的顺序倒过来。那么我们所期待的就什么,就应该是在上面response在后面,没错吧,对吧,但是现在呢,注意看啊。诶,发现了吗?好像没变是吧,到底是缓存呢还是什么原因呢?来。我在在这里加个一,如果这个一生效了,就说明不是缓存了哈。这个一是不是出来了。看见了吗?这是不是多了个一啊?但是你发现了吗?这个路易斯棒子输出是不是跑到了最前面啊?
03:05
诶,为啥呀,老师这个输出好像跟我们所期待的不太一样,诶为什么呢。来,我们把这个底层的一些细节和原理啊,给大家解释一下啊,首先。大家注意,首先这边是咱们JP中的代码啊,好,我先把这个代码拿过来。OK。好,这个是输出的代码哈,咱们把它。拿掉拿掉啊。剪切掉。OK,好了。那么大家注意看一下哈,这是JP页面中的代码,然后呢,不是两个输出流嘛,那么每个输出流啊,各自都有他们自己的缓冲区,那么这是什么?这是out缓冲区。
04:05
这个是out缓冲区,哎,那么还有一个缓冲区呢,就是response缓冲区,来我们,哎呀,我们再来一次。好,这边这个是绿色缓冲区。好了。来咱们看一下哈。缓冲区好,大家注意两个流在输出的时候啊,都是直接输出到自己的缓冲区里面的。啊,那也就是说来,我先把这个这个背景给它截一下哈。这样不太好看,好大家注意看,那么alt在输出的时候是直接写入到alt缓冲区里面的,那么它这里就会出现什么东西呢?就会有这个什么out输出一,Out输出二没问题,然后这个response呢,它是直接往自己的缓冲区里面写。
05:04
啊,那这边就会有什么东西呢,叫做response输出A输出一,然后是response输出二,就这样子。好,那问题发生在哪里呢?老师,为什么这个结果不对啊,来注意了啊注意了。我们说当呃换成蓝色,当GSP页面中所有代码执行,所有代码执行完成后,会做以下两个。操作哪两个操作呢?咱们来说明一下第一个。啊,第一个。OK,嗯,我们换成黑色啊执行什么呢?会执行out.flash操作,那这个操作会干嘛?
06:00
会把out缓冲区中的数据追加。诶,写入到棒缓冲区,诶缓冲区末尾。你知道吗?他就干这个事情,也就是说大家看啊,这一步执行的时候,他这个数据就挪到这边来了,好然后这一步执行完以后,接着干嘛呀,注意看啊啊。啊。啊,再挪过来一点点。哎,好了,那么第二步大家注意看一下哈,那么会执行response的。刷新是吧,操作把全部数据写给客户端。啊,写给Co,那就什么意思呢,就这个时候啊,他的数据呢,就会全部输出,这些数据就会全部输出。
07:01
诶,那么最终这边是什么,这边是客户端呢。这边是客户端。哎呀,看不见了是吧,20就行了。啊OK,那么这里得到的数据就是什么,得到的数据呢,就是RESPONSE1RESPONSE2,然后是OUT1OUT2,那么就跟我们这里看到的是一样的。啊,一样的,好了,有同学就说,老师你咋证明啊,你咋知道啊是吧,我们可以验证一下,我们只要验证一下out flash这个操作是不是会把out缓冲数据的数据啊,写入到response缓冲区就可以了。我们来验证一下这个结果啊,来,大家请看。首先呢,我把这个内容先都拿出来啊,现在。注意看我们这个代码,我们要执行什么东西呢?来我调一下,我在这里就加一句就行了,叫做out,点点flash操作,对着吧,看见了吧,好,现在这个代码呢,我们一行一行来执行,我们看细节哈,我们说先执行outright,好,那OUTRIGHT1的话,这个时候你想想缓冲区里面是不是有这个数据,没错吧。
08:13
好,那么当你执行out flash的时候会干嘛?他是不是把out的数据写到response缓程序末尾啊,由于这里面还没有数据,它就到头了,能理解吧?然后接着再来看out,又输出第二次。那么这个时候注意看啊,那这个数据呢,在这边没错吧。别着急,再接着看还有两条,这个时候呢,Response输出一,Response输出二,那么他就追加到末尾,也就这两个输出追加到了末尾,看见吗。那么当所有的这些代码大家看啊,执行完了以后,我们说会做两个步骤,诶,这个时候out又刷新,也就是把这个追加到末尾来,那么这时候用户最终看到的结果是什么?是不是就这个内容。
09:01
能理解吧,好,我们来试试看,我先确认一下那个一咱们去掉了吗?啊去掉了哈,那我刷新一下走。大家看是不是跟我们分析的一样啊。对吧,好,这个咱们了解一下,好,那咱们就知道咱们它们之间的一个区别了,哎,他们之的一个区别,来,我先把这个拿过来。啊,拿过来。OK,那最终的结果呢,是这边过来啊,这边过来是吧,是这个效果好,这咱们知道一下,但是还有些问题。哎,我们我们虽然知道啊,这两个输出的区别了,但是有同学会问老师,那我应该用哪个输出啊。啊,用哪个输出很简单呢,对吧,就是当你不知道怎么做的时候,你看看别人怎么做啊,当我们做任何事情的时候,自己不知道怎么做,看看别人怎么做,那我们怎么看GDP用什么输出呢?很简单,我们打开这个源代码啊,大家其实你观察一下人家用的什么输出。
10:07
这个都能看见看见吗?哎,底层是不是都用的out输出啊,所以大家注意啊,那么由于。由于JP翻译翻译之后,那么底层源代码都是使用out来进行输出,所以一般情况下啊,所以一般情况下我们在JP页面中统一使用out来进行输出啊,那么避免什么东西呀打乱。避免打了页面输出内容的顺序就这么简单。就这么简单,那么对于alt来输出的时候啊,大家看啊,哪怕是用al输出,它还有些说法,还有什么东西啊,来你请看一下哈,Out输出它还有两个方法,一个是right。
11:02
看见吗?一个呢,Out点,那这两个方法我们到底用哪一个。好,大家请看哈,我们先都给他们输出一下,用两个方法试一下,比如说这个输出12,下面也输出12。当然我先让他用字符串啊,先都输出字符串。那现在啊,我们刷新页面上有两个蛇,看似都没问题,对吧,大家看见了吗?当我们输出做不上的时候都没有问题。好,没错,但是如果说我们输出的不是字符串,我把这个字符串符号啊去掉。那如果说输出的是整形呢?就出来是整形呢来刷新。哎,这不对,这有缓存,我们重新部署一下哈。重新部署一下,你就发现只有一个出来。啊,这就重新部署成功啊,我们清一下来,这时我们刷新。你发现没有,是不是只有一个12啊,另一个变成不知道什么东西了,看见了吗?
12:04
哎,看见了吗?就这样子,那为啥就这样子呢。为什么呢?来这就要说一下这个out它的一个底层实现了,大家看这个out是什么类型,就接着P,看见吗,我们点击它。呃,来这样子。就这个类是吧,我们点。这个。接着批write。啊,我们到这边来源代码当中去看一下,它我们放到这里来。啊,那么它的实现类是什么呢?说这个。看见了吗?就JP write in input,这是它的实现类啊,你看这是抽象类吗?这实现类吗?来走,你看是实现的它吧,好,我们观察下个代码,你就会发现这个问题了。首先啊,这里简单说明一下哈,这里面有一个out,那这个out是什么?是这个response的输出流。
13:03
啊,就是get right这个输出流啊,然后别着急再看。嗯,然后这个呢,字符数组是什么?就是alt缓冲区了。啊,二到缓冲去,好,我先把这个做了哈,现在我们就先做了,然后。然后有同学就问老师。你咋知道这个out?它是绿色棒get得到的呀。啊,首先两个点,第一你在out里面是不是需要把流写到这边来,那它肯定要持有它的引用啊,这是第一点啊,我们想的,第二,其实源代码呢,我们也能看见这个out,看到吧,看下面代码,它有个方法叫做呃,In out哪呢?Out in out看到吗?它如果说这个out等于空的话,它通过这个response get right得到。对吧,那源代码总不至于做错了,好这第一点,那第二点就是为什么我们的这两个方法。
14:01
Output。为什么我们这两个方法在输出字符串的时候都没有什么问题,但是输出整形就有问题了呢?那到底是哪一个有问题呢?那到底是哪一个有问题呢?大家注意看了啊。现在我们把它做掉,我们留下print,我们看看它能不能出来。能出来吧,好,别着急,现在马上就知晓答案了。走刷新发现没有,你剩下这个乱是不是不能出来呀?啊为什么来接着往下看,首先呢。我们找到查找一下这个方法,咱们说呃,咱们说这个。Print方法。大家看一下哈,每一个print的方法,我这个地方加一下。每个print方法在执行的时候,它都会干嘛,将这个输出的数据啊转成支付串联型,大家看见吗?
15:03
每个都一样,下面这个也是你看到吗?呃,再往下走下in也是再往下走,这这是不是也是啊,Long也是,然后呢,Float也是,然后呢,Double也是看见了吗?看见了,不管你写什么,诶好,那我们要说明一下了哈,那我们说。看到这里,我们说print底层不管输出任何东西,它都会将它转成字符串联型,然后调用什么right方法去输出,你仔细看它是不是都用right,看见了吗?是不是都是right,都是right看见吗?也就是说呀,大家注意right,哎,Out啊,Right方法。输出字符串没有问题对吧?那么out out呢?点print输出任意数据都没有问题,原因是为什么?因为都转化成为字符串后调用的right输出,这能理解吧?也就是说他们殊途同归,最后还是调用这个方法。
16:16
那我们问题就来了,我们的问题在哪里啊?我们的问题是这个right,注意啊,我们的问题是right输出的时候,输出字符串,输出整形的时候它就会有问题,对吧?创新吗?有问题吧,为啥?那我们现在就重点来看看输出整形这个方法有什么问题,嗯,我们把这个找成right。啊,Right大家看就这个刚好就是它right输出int有什么问题,关键就看这一行就行了。大家看这个CB是什么CB啊,就是我们最早看见的这个alt的缓冲区,它就是个字符。宿主。好,接着我们回到下面来。
17:01
啊,就就唱了啊。Red,这个去哪了?好,就这个哈,大家注意看它将这个输出的值直接转成字符之后放到字符缓冲区当中。这就是问题了,有同学说,老师这有啥问题啊,没看出来啊,来回忆一下咱们基础讲的内容。好,大家注意哈,咱们现在呢,有个int等于一,那么我们在输出,大家看到哈,把它转成字符型的时候。那你能看见什么?走。啊,咱们不能放到这个类里面,咱们再整一个类。随便整个类就行了,好,就这个。嗯,没方法,咱不要。好达执勤。来大家看一下哈,这个地方输出是不是一个阿克马字符啊,看见了吗?那如果说咱们有个字符等于一好,我们在输出的时候。
18:10
注意啊,我们将将它转成in的类型。好,那他会说出什么再看。稍等大家看一下一个字符一,其实在整形是用49来表示的,那么可想而知,大家想想哈,我们这个源码里面,人家这个地方如果传进来是一个12,也就是也就是我们在这里传进来是12的时候,它会怎么样?它会把这个12注意转成它所对应的那个阿斯卡玛,阿斯卡玛表中的字符。那么最终得到的效果还是我们希望看到的在页面上显示十二两个字符吗?就不是了,这就是根本的原因,大家注意这个地方,好,那我们就知道了,大家注意得到一个结果是什么东西呢?大家注意哈,Right只适合输出字符串,而print呢?由于它把所有的数据都转成了字符串略型,所以它可以输出所有的数据。
19:12
诶,这就是这两个方法的区别,就是你在使用的时候也得注意,当然了,如果说大家比较懒得记的话,怎么办?我们给出一个比较简单的结论啊,我们说深入圆满是吧,那么浅出结论。是吧?那么在接着P页面中可以统一使用out.print来进行输出,对吧?如果说你懒得记的话,你就记住这一句话就行了,这个永远不会错,不管你输出的是什么数据都可以,好,这个咱们知道一下。
我来说两句