00:00
我们开始上课啊,首先呢,我们借助于这个练习,把昨天的这个知识来做一个复习,这个练习呢是这样的说,在web X文件里边设置两个web应用的初始化参数,注意是外部应用的,而不是。当前的一个是U,一个是password,然后呢,定义一个log in.HTML里边定义两个star user跟password啊,我请求到这个login。然后呢,我们再创建一个log service,在其中获取user跟password,我让这个user跟password跟web X文件里边定义这个U跟password的比对是不是一致,如果一致的话,打印一个hello,嗯,应该是hello u,如果不一致的话,打印为sorry u,这样的话呢,我们将把昨天学的最重要的一些技术都给串起来,首先来新建一个动态的外部工程,第30。
01:14
一个是默认的啊,Next next finish。然后呢,找到这个文件打开,我们首先在这个里边配置两个当前外部应用的部署化参数。配置当前web应用的应用的初始化参数。Contact apparel。Our name yoda。OK,把这个整个的复制一份,这是第二个参数,配为123567。
02:17
保存写完了,然后呢,需要创建一个HTML。第二步。叫login HTML里边有两个。字段,这两个字段很明显应该放在一个表单里面,Action,这个是log in,那表单这个请求方式通常使用post方式写一个叫user。那。
03:00
我也有的吧,有的没有。没有了。下一个password。也兔子菜。怕死我了,怕死我了,嗯。错,OK,然后我们来写一个眼部。嗨。这个什么表单呢?这个表我目前是可见的,我们可以看一下。诶,就长这样好了,那下边的话呢,我希望我按这个提交按钮,然后把这个请求提到一个solve late,那个sol可以来获取表单的这两个请求参数,然后呢,让这个u nameme跟password分别和在web X文件里边配的这两个I的硅谷跟123567相比对,如果比对成功的话。
04:25
看到一个hello at硅谷如果要是失败的话,Sorry,呃,什么什么就不一定了。好了,下面我们来创建一个看,首先建一个包,Com点点。创建一个class叫again,目前学的实直接实现这个接口的so,第一个就是OK。好了,方法已经给我们加上了,目前我需要去写什么方法,写这个service方法好了,我们排看一下步骤啊,第一个获取请求参数分别是有name跟passorwor,这两个是谁,是从login这个HTML提交过来的,这个username跟passwor OK,第二步。
05:32
获取当前外保应用的应用。应用啊,初始啊参数。优点跟阿朵很明显啊,这里边你在生命变量的时候需要区分一下,这个还好,这个不能同名好了,三比对。
06:03
四啊,反应响应响应字符二这样呢,四个步骤换白半这个的话呢,我先改一下改成。给改成OK,第一个获取请求参数到底是什么方法呀?Request get吧,等于request点叫优垂流的内容。吧,CTRLC回来好吧,就这八,我等于快点pro。Password OK,下一个获取这个跟password怎么获取啊,这个跟passwor这什么要这个吧,当前外部应用的初始化参数需要使用,需要使用so content对象,具体是调查到get in need permit方法。
07:26
好吧,那需要用它吗?这边说没有啊,怎么办?哪里边有啊。里边有一个版,从这个里边我们可以获取context,那怎么办?没想到,应该怎么办呢?我应该把。看啊,我这个里边,我本来获取的方式应该是个什么方式,我来写一下,本来获取的方式应该这么获取。本来要是获取的话,应该这么获取,首先获取contact,等于点at contact,然后。
08:17
然后我应该来获取初始化参数,等于点in,叫什么呢?叫user,再来in password,等于service contact.getter是不是这样过去?你这个过去的,我这这边是用不了啊,怎么办,把整个这个CTRLX放在二那点啥都是差都是肯定的怎么办。你不是传进来了吗?我写一个恒源变量不就可以了吗,它看这。
09:11
然后这个this点对点等于so是不是就可以了,你看懂不?在我当前so被创建之后调用的方法,服务器会调这个方法,传so这对象过来吧,然后的话呢,把它传给当前service的一个成员变量service这个,那我在这个里边是不是就可以来获取service context,进而来获取这个user跟password这样写。当然同学说,那我要是把这个service context追重新变量行不行呢?可以你把U的跟password作重新变量行不行呢?也可以,因为这个you跟password目前是只读的,你不能去改它,所以说没有线程安全的问题,可以的,就是说你也可以上面写一个呃,U的跟password,然后的话呢,在这个里面为U的跟password赋值也是没问题的,好了,下一个比对啊。
10:23
应该是的。User equal user。而且。In password equals。Passor。好,都一致的话,我给你一个响应,要。好吧,这个时候为了是为了获取响应的话,想要是个什么东西,这个print等于response,从response里边获取一个打印一个点print加。
11:12
一个好,否则对呀题。Do加。这就了。这是我们整个这个代码的流程,好了,下一个的话呢,我当然需要去配置这个service。来不来?配置。Solid。嗯。SOSO,这名随便起就叫login。
12:07
So class,好,SOSO。Name in,这俩不必须一样啊,C,然后是l Python,好了,这个斜杠后边这个应该跟谁一样,是不是跟这个一样啊,CTRLC过来,注意,就是我访问的路径的,叫他好了整个跑一下。来我们这个ABCD123。123567。
13:01
好123456 sorry,这样就起来了,这就是我们刚才整个的流程,那看一下啊,说目前这个目前这个响应啊。它就是这么一个字符串,这个严格的讲,这不是一个HTML,只不过我们通过浏览器的方式给它显示出来,那我这个里边我可以调用这个,嗯,方法给我打印字符串,那这块我们看我们看我们实际上我们真的可以用这个给我打出一个HTML出来。比方说写上什么HTMLHTML所有东西都可以写,但是会相当的麻烦,所以说正是基于这个原因的话呢,后边会有GSP,太麻烦了。好了,我们现在的话呢,我们来做一个总结,我们看我们写这个so啊,我们觉得还好,但是这个so我们看上去觉得怎么这么别扭呢,怎么别扭啊,你看是不是我为了实现这个接口的话,我是不是有大量的这个空方法呀,看着特别的这个累赘,于是就感觉诶我每一次开发sol,我都需要来继承这个是不是接口的话是不有点太麻烦了,那于是呢,这个so实际上还有一个。
14:32
实现类我们看一下意义看是一个接口,这个接口有一个实现类叫,不过这是一个。这是一个抽象类,好了,我们研究一下这个,So,如果开发用它的话,会会不会简单一些呢?我们首先自个儿写一个,大家看啊。
15:04
啊,我们说呀,我每次都实现这个接口的话呢,太麻烦了,于是我想自己开发一个这个四维实现类,然后以后每次我们继承一个实现类就可以了,而不一定来实现这个接口,我来写一个,大家看一个啊,写一个。叫I。OK,借口。哦,好了,我们先看它按约上如何来实现,如果实现的话,这个第四状用方法我们可以写成一个空的,我也不知道怎么直线好了,这个方法能提供实线吗?Get service能提供实现吗?能提供实现吗?因为我这块有一个方法可以给他传进来,这样写private这个。
16:06
然后CTRLDX点等于二杠零,这方怎么实现啊?我就直接把这个给返回不就可以了吗。啊,这个方法怎么实现不知道,往这一放,这个实现完了。得约特方法,得方法是个什么情况?思维的方法是不是我每一个必须实现的一个方法呀,所以说我们索性说呀,你这个方法你必须实现,于是我写成一个。CT比中一个什么呢?我举了一个抽象方法看。好了,我们自个儿写的,我们写完了这个以后的话呢,我们看我要是在我自己定义这个my service这个基础上去写程序的话,是不是会简单一些,说这是什么呢?自定义的一个service接口的实现类目标是。
17:23
嗯,让。开发的任何。是的。我这个的我们我的这个啊,我要是直接记成它的话,会简单吗?Extend my,于是ctrl c o,我们看定方法我们不用写了。
18:02
这也不用写。那不用写,你说这个不用写靠谱吗?这个什么写变成代这类跟这。保存大家看我这样写完之后的话呢,我开发的这个so,这批以前简单了呀,但是实现是一样的。看一下。再跑一遍。Sorry,好了,我写一个123567。Hello,这是没问题的。小心。干哈,你交五块,我交十块好吧。打瞌睡打的太严重了,肯定瞌睡好几下了,好了,这就是我们自己实现的MY,真的这个soate,我们觉得我们写了这个接口的一个实现类以后,我们以后如果要是继承这个我们自定义的so,我so的开发变得简单了,你要直接去实现那个接口的话,是不是比这个要麻烦呢?这就是这个类存在的意义,但是我们看呢,实际上他给这个,呃,针对这个S还有一个什么特点,它还实现了S。
19:35
实现它了,那实现这个的好处是什么呢?实现这个的好处就是我在写它的时候,我可以在这个里面直接去调so con的方法,好了,那我也实现一下,我看看怎么实现。加上。本周西部的O啊,目前是一个抽象来,这个抽象的话呢,我暂时间去掉。
20:06
这边的方法的话呢,都提供了实现,我暂时先CTR1加方法,然后再加上这个X3,为什么呢?因为这个方法的确是一个抽象方法,我们现在我们来看这个get in the perter以下方法。等着哈以下。方法为接口的方法。好了,我们想以下方法,我应该如何来提供曲线呢?CTRLC拿过来这些方法是谁呢?是so接口的方法,我们已经提供实现了啊,有一些是空的,有一些提供了实线,我们看后面那个码路还提供直线的,叫获取初始化。
21:12
初始化参数好了,获取初始化参数的names获取service获取,这个我们看本身本身我们有没有能力率网的实现啊。没能力,不知道咋实现,完全不知道,但谁知道啊,谁知道啊,你看我当前这个,呃,真的,这个里边是不是有这么一个垂变量叫S,这吧,我第一时间为他赋值了吧,这个家伙是不是能办这些事啊?那于是实现方式就是survey can.get in pro2个零,再来,诶,can.get promote names也一样,Service can.get有。
22:08
点get,再来点第个内。于是啊,我就那我们这个怎么了,还实现了这个接口,而且提供了这个接口方法的具体实现,需要注意到的是。我们自己没有办法去写具体是如何实现的,但是在我们这个类里边有这样的一个成员变量,这个成员变量是service类型的,它有本事实现这些方法,实际上这些方法不就是service can里边定义的方法吗?那我用这么一个对象去获取的话,是不是天经地义呀?而且在我创建这个service对象的时候,我这个杂伙是不是已经出戳好了呀?那我当然可以用。
23:09
那过来吧,我还可以再怎么改,还可以再改,改的方式是这个我都不用获取了,我直接这样写可以。看见没有,这是啥意思啊,我在这个里边是不是已经定义了这个方法呀。在这呢,好了再看直线是一样的。123567有,如果你什么空指针一场29行看啥问题哈。不说提供实现了吗?哦,说。这个in password equals就是空,大家说这块控制异常的话,应该是什么是空啊?
24:09
应该什么是空啊,感觉应该是in in啊,我们这块写的时候有点问题,有啥问题啊,我这块我要直接这样获取的话,我要直接这样获取的话,这咋这是啥呢?这是不是获取点一下,后来是获取什么呢?是不是获取单前三,所以说这个这么写还是看这样就可以。C。你一开始是这么写的,我回忆一下啊,一开始是这么写的。一开始这么写的,我得先获取一个。Can,然后再获取它,现在的话呢,我可以这样写了,叫get contact写一下。
25:13
好了,我这样获取的话,我这个方法从哪定义的,是不是回过来不是在我这个类里面已经实现的用的是。好的好的,这回可以可以跑,没问题,刚才那个搞错了啊,这回来来123567。没问题,里面写行,这就是它的直线好了,我们实际上干了一些什么事呢?我们实际上已经把接口。点它吧,这个接口有一个实现类,这个实现类叫那个源码完整的写了一遍,看下源码怎么看哈,关联源代码啊,去找file。
26:12
们记得你家传那个传tomca的时候有个SR c.D吧,E盘。Java。Soft very nice。SC打开,OK,大家看这是一个,这个就是一个接口啊,里面定义接口的方法,我们要看的是这个接口的一个具体实现,叫真solid。CTRLT就是它好了,看这些方法如何来进行直线的,它也定义了一个重序变量叫service,看扩造器算方法是空挡。
27:02
Get in the para怎么获取的?它是获取了get service conig get in parater,我们看这个它是干什么呀?正确返回,这可和我们那样写是一样的,再来。一样的哈,过来返回它再看,再用这个方法返回词的context啊,这个方法实现不一样,那是不返回了一个空串啊,我我们是不是返回了一个闹啊差不多。这个init怎么写呢?In为这个谁赋值啊,为这个con同一变量赋值了,同时调用了一个d.in注意看哈,那说明什么呀?说明它需要定义一个in的,注意这个in尼的方法我们看不出是继承来吧,你看看这个是什么呀?这个是实现接口的,有一个三角标记,这就是完全自个。
28:07
定义的一个方法,一会我们会讲它为什么会定义这样一个方法呢?再往后看啊,Log这是什么?跟日志相关的,这个我们就不说了,Service是一个抽象方法啊,GA of name跟我们写的几乎是一样,不过这里边它多了一个什么呢?多了一个in,我们想它为什么会多一个in,好,我们回到我们这个里边来。CTRLC的O,比方说啊,我现在需要在我这个里边去重写那个过来看啊,我直接这样写,我直接成那个真的说到。我们实现是一样一样的,没有任何问题。跑一遍。
29:02
没事儿。123567,因为我们那个源码和那个源码几乎都是一样的,只有一个地方不一样,他写了一个什么呢?他写了一个给你的方法,我没写好了,那现在的话呢,我又恢复回了什么呀,恢复回了这个MAG,我们看一看,比方说我这个里边啊,哎,我想这个对当前。进行啊初始化,初始化怎么办呢?我需要覆盖,因它这个其实我一这个一。的,我这个是大家说他会怎么样,他会怎么样,回来过来随便写。
30:17
这不出了一个异常,这个异常叫空指针异常,这个异常吧,不好排除。一长我们看多少行呢,在这个的28行。进而往上走,在这个的第56行,为什么会有这个异常?想想。想想,大家想啊。我这里边儿,我是不是覆盖了这个方法呀,我覆盖这个方法的话,是不是意味着。我在这个log in service里边,这里边这个in的方法是不起作用来覆盖了吗?那不起作用的话,是不就意味着我不能为这个service赋值了,这啥是不是空呀?调是个空的话,是不是就意味着当我调那service can这个成现变量方法的时候,这是不是空啊?所以说会有一个控指针异常,那我如何避免这种情况呢?我还要我还要初始化,我还要避免出现这个异常,我这么办,你说呀,你不就是想进行初始化吗?那我啊,我给你提供一个空的引力值。
31:38
我给你提供一个空的一点,不过这是他啊。啊,也一样。你要是真想初始化的话呀,你就直接在这个里边进行初始化吧,回来初始化吗?我不写它,写它,但我这个里面我想去用那个,这肯我是不是可以用啊,比方说啊,我需要使用加一个吧。
32:10
Get啊,Big不可以了吗?Who可以用它,而且其实你也不用get是吧,这里边我的任何方法我是不是都有啊,比方说getter都可以用啊好,既然可以这样的话,我这个怎么样,我一样可以完成初始化,而且当我当我使用这个印子的时候,我是不是不用担心出现刚才控制异常那个问题啊,好再看。回馈跑一个123567,摁一下,这个时候初始化这个方法也掉了,这块也是正常的,每一次都是OK,这就是我们完整的general,那我们目前这个里边继承它是没有任何问题的,可的O。
33:07
就完了。这就可以,当然然,你如果偏得在这里边儿去继承那个一里的,它也会有控制针异常的问题,和我们那个道理是一样的异常了哈。发写好了你再看它也会有控制针异常的问题。而且代码的行数都一样,你看它也出了,也是那个问题。好了,以上的话呢,我们主要是讲了一个什么呢,讲了一个类,这个类叫generate,使用generate service可以更有利于。我们去开发搜的程序更加简洁了,我们来看我们前面讲过的一个UML图。
34:12
后边一点。这个图大家看这是一个什么?这是一,这是一个,然后的话呢,我们这个general同时实现了这两个接口,同时还实现了接口意味着什么呀,因为这个S可以被。序列化和反序列化后边这个类还有一个类,这个类叫什么呢?叫HTTPSO类,我们一会讲它,大家先把这个关系的话呢,先搞清楚,做一个笔记。Not,第二第一我们讲了一个。
35:04
首先我们要说它是什么呢?是一个具体是solid接口和。Solid config接口。啊,实现类是一个抽象类好了,那么这个抽象类呢,因为集中。啊,Service方法为抽象方法,这就是我们的啊二、存在的意义。说如果。Privilege。新建的吧,新建的程序。
36:05
直接地床。会是开发。更简点,其具体实现是什么样呢?就是我们写的这个跟我们写这个一模一样。只不过什么呀,他加了两个日志方法,一个C,就是它的原代码。利用什么呀。三装带。里边。CTRLC这中声明吧,一个很big类型变量,然后呢,在方法中in猜哈so方法中对其对其进行了初始化。
37:21
给你直线啊。实现看一我们需要注意的细节好了,二。二什么呢?利用。Solid。Conig成员变量的方法实现了。实现了。So。接口的方法三。
38:06
三还定义了。定义了,有定义了一个。有什么呀,米的方法,代餐的哈方法,然后呢,在在这个方法中代三的这个survey con方法中,方法中对其进行调用,然后呢,那此类可以可以直接复写,写谁啊。覆盖覆盖这个在其中,在其中实现对出是啊,这么就以然后的话呢,我们建议大家四,如果不建议,不建议直接覆盖。
39:22
这个。因为如果。忘记编写in,而还使用了很接口的方法,则会什么呀?会出现空指真异常,这就是他的具体实现,我们把这个源码完整的写了一遍。
40:15
好了,大家具体看一下。你看一下说两点,第一点的话呢,我们笔记里边我们写了个他写了个什么,我们说不是这是我说我如果直接盖了这个方法,然后的话呢,我这个方法里边我加上一个S的话,它就不会出现控制的异常,什么意思啊这个意思。这个意思过来看,我覆盖的是代餐的那个,看着。
41:01
在这个,但是呢,我这边我写他了。这个点别说了啊。哦,这么写的是不就没事了呀。能懂吗?要是这样写的话,是不是就意味着?我掉了负类的这个一米呀,我是不是就为这个负值了呀,懂吧,这个时候就不会出现控制了异常了,那我这块写错了啊,最因你。懂这个意思了没有,就是我如果要是不写这个的话,怎么了,不写这个的话,是不是意味着我把负类那个方法完全覆盖了呀,我在真正执行的时候,我执行是不是它呀,那这个时候是不是没有一行代码为负类的这个我so can这个纯量赋值。
42:09
没有一个为他赋值吧,没有一个为他赋值的话,是不是意味着。这个是空啊,而我们后边还调了它的方法的话,你不就会出现一个控制帧异常吗?而而我在这个里边,如果我写一个点是不是着我的这个方法,那就可以。这是第一点,第二点。第二点,我们虽然说的话呢,这里边我为了这个呃,更好的去进行初始化,而不至于出现控制异常的话,我定我定义了一个一米,注意怎么样,它是不代餐的吧,但这个init并不是so生命周期相关的方法G。这个方法不是由服务器直接调用的,而是我们新建的一个方法,然后我们在里边进行调用的,这是需要注意的一个地方。来,我再写一个五。
43:17
五双。新建的一米不带餐的啊。说这个方法并非。并非。Sorry,哒哒。生命周期方法。生命。O,好吧,不是。哪个是啊二这个是以你代餐,这个是。是生命周期。
44:03
相关的方法,就是生命中相关的那个方法,还是那四个扩器代餐的一米。Service跟而后定义这个号,它不是。
我来说两句