00:00
各位学员朋友们,大家好,欢迎大家学习我来教你学Java系列专题课程。我们今天学习的专题是。So的编程。So,什么是solve?我们可以从。三方面来说。宏观的来讲,Solid。是什么?是我们说过的web访问中。四大角色,三大协议中的其中的一个协议。它连接的是web服务器和web端的Java代码。是这两者之间通信的一种规范。只不过这种规范,它的反应形式是一套接口,它不像ittp协议、ttp协议。它也是一套规范。这套规范反映的形式是。
01:05
一种数据传输的格式。而这呢,是一套接口。所以这是宏观上来讲就是。一个协议。那么我们一般情况下来说。Solid是什么呢?Solid是一个接口。是我们说的宏观上的solid规范里边的一个很具体的接口。这个接口存在于Java X点这个包。那么。所以我们一般情况下说的这个萨指的就是这个接口。这通常的来说啊,然后呢,还有个微观的来讲是什么。是。
02:00
我们接口实现类的一个对象,一个实例。那么它是运行在我们服务器上的一段Java程序。这个怎么来的?Serveet是两个单词啊,Server Ali组合一块的叫S,表示的意思就是服务端小程序。那么啊,这个对象它的功能主要是。根据客户端提交的请求,然后调用服务端Java代码,我们这儿啊。服务端程序,这个不是不仅仅是一个我们的。实现类。
03:00
他是。一堆代码。一堆泪。一堆对象。那么我们完成的工作是什么?根据用户提交的请求,我来调用其他的。另外的那些萨林。那那些其他的那些Java代码,当然其中也包括其他的。这是我们先说一下什么是。好了,知道什么是so塔,我们首先来学习一下萨塔生命周期。这生命周期啊,你要理解这个概念,它指的什么?生命周期就指的从这个实例。这个solid的实力从他被创建一直到最后被销毁,整个这个过程。
04:02
那么在这个过程里边,作为程序员来说,我们可控的这些时间点组合一块儿。我们称为它的生命周期。那对于生的生命周期来说,我们的可控点有哪些?所谓的可控点是指什么?就是程序员可以捕获到这个时间点,然后在这个时间点里边。可以执行一些操作。完成一些功能。那么这个可控点我们。常用到的啊,是这样的四个。实例化、初始化服务和销毁。那么。实例化,那就是创建这个对象啊,当然调用的是谁,是我们的构造器初始化,那初始化你创建的对象了,对吧,要对它有一些初始化的数据。
05:07
那可能我后边这个服务这要用到一些对象,我在初始化时可以创建它。而服务呢?是最核心的。最核心的部分就是你这个so提供哪些服务,由他来完成。服务完成了。服务完成了,你注意是整个它的服务,我以后再也不使用这个服务了。整个服务结束了。那么。销毁这个对象。这样的话,就完成了整个的生命周期了。好,关于这个生命周期啊,我们。简单看一下啊,这刚才是这样画了一个生命周期的示意图,我们看一下它的执行流程。首先我们的请求到达了,到达以后。
06:00
到达,到达哪儿了?你注意我们说了,Solid是什么东西?是服务端的一个小程序,肯定是在他们的服务器里边的。当我们的请求到达了他们的服务器。当然我们这儿啊,那不一定非得指的是Tom KT,我们现在用的是tomcat啊,K以是其他的服务器,我们这个课程里面用到的是tomcat。当请求到达了他们的服务器以后。那么服务器会对这个请求进行解析。解析出当然请求发出的什么是URL,我们从请求中会解析出来UR。我们现在知道URL和UR对吧,当然确切的更确切的说,从URL里边再解析出什么叫solid pass,当然我们现在不用管那个solid pass是个什么东西啊,我们后边会说。
07:00
我们现在就把它当成是一个解析出来一个U。然后呢,会将这个请求。和solid进行映射。怎么做的映射?这种映射关系。对于我们程序员能够操作的来说,它是以配置文件的形式出现的。那底层来说能够完成映射关系的,大家想想是哪种?数据结构可以。反映映射。映射这个概念对map。Map就是map本身就是映射的意思啊,对不对,Map这个单词本身就是映射啊。买瓶嘛是吧。哎,也就是说把我们的用户的请求。与。这个so。
08:02
这个对象在这个map里边,在这个配置文件里边,先建立好这种一对一的映射关系,哎,你过来一个这样的请求,我就找到相应的solid了。我找到这个so了,然后呢,我先看看这个是不是已经被创建了,是否已被实例化。如果已经被创建了,走这条线执行服务service方法。执行service方法。服。如果没有被创建。那怎么样,我就给你创建呗,执行无参构造器就创建了这个S对象。那紧接着呢。创建好了以后要初始化了呀,初始化完毕以后再执行service方法。好,你注意执行到这儿以后呢,有同学说这执行完了就该de该销毁了,也不是啊,这个可不是。
09:10
为什么不是,你看我这儿这个颜色,这个销毁部分用的是橙色的,为什么不是说service执行完毕马上就执行。第一创意呢,我们后边来说,我们下边呢。来写一个例子。通过这个例子。来看一下这个生命周期的过程。好。我们下边来写一个dynamic web project。这个我们叫零一。So。Life。Cycle吧,生命周期,Solid的生命周期对吧。
10:00
然后2.5直接finish。好。那在这个里边啊。我们直接创建。直接创建,创建什么。直接创建这个。不过啊。Data。那我们找到这儿。帮助文档。我们先来看一下这个接口。Index。好,刚才我说了so的这个接口在哪放着呢,在加了X。点。
11:01
So。这个包里边找 Javax.so诶找到了吧,点开它接口interfass,你看这是不是有个。对不对,这就是solid。看看它里边有什么方法。为什么我们要看这个方法,你想你实现这个接口,你是不是我们一会儿要定义这个接口的实现类啊,你要实现这个接口,是不是必须要实现这个接口里边的方法呀。猜出来几个方法,123455个方法。这五个方法我们看一下啊,我们认识的。我们认识的。诶,大家看这里边是不是有有个in呀。这我们认识。初始化呀。Detroit销毁啊。
12:01
是不是service服务啊,诶也就是说我们这里边儿生命周期里边12344个方法。我们已经看到了三个了。这还有个实体化,实体化是什么?肯定有。那另外的这两个方法是干什么的?我们现在先不用管它。好。那现在我们就来实现这个接口。这写个什么呢?我写一个class,这class叫什么,叫某一个。我叫 sumcom.ABC。北京power node点儿SOS。
13:02
注意,实现的接口是。Okay。Finish。再来看看。Destroy。这又一个三个四个五个对吧,这是不是五个方法呀。这五个方法。这五个方法,我现在还想要什么?另外一个方法,它的无参构造器。那好说加一个呗,是吧,无参构造器加上了。那么加上无参构造器了,当然我刚才用的是快捷键操作啊,如果你不知道我用的什么快捷键,希望大家能够学习一下啊,我之前录制的视频。
14:04
Eclipse的用法。里边的关于快捷键。我这里就对快捷键不再进行解释了啊。好,现在呢,我就往里边添加一些输出语句。直行。不要执行了,咱们创建。Sam so,实例。对吧,这创建这个实例啊,好这个。这个是。销毁。实力。咱们这样这个就是。
15:05
执行get。So config。我都给你加上啊,我都给你加上。其实这俩我们可以不用管它,因为目前来说,我们现在研究的是solid的生命周期啊这俩方法。我们现在不用管他,现在执行不到,干脆执行不到,咱们为了简单啊,我干脆就不给你写了,这俩方法执行不到啊,什么时候能执行到,那回头再给大家说。好。这。初始化萨实例。
16:03
这是执行萨姆的实例。的方法好了。就这样OK了。12344个生命周期方法啊。那好,写完了吗?写完了没有,我问问大家。没有,哪儿没写完。你注意在这儿我不是给大家说了吗?要将请求映射为。将请求映射为这种映射关系还没有建立的。在哪儿建地?我不是说了吗?在。配置文件,哪个配置文件注意在这儿。外边点儿钱没有。
17:02
外边的车没有。是什么?这个我们说过对吧,在前面的专题里边。JA web开发基础专题里边我们说过什么呢?这个东西是我们Java意义。规范中。对于。加web程序结构。这个规范里边所规定的,他要出现在。Web佛像。对不对。打开。这都是我们的欢迎页面是吧?我们现在没有欢迎页面,所以根本就不用管它。这样吧,删掉留一个吧,虽然留着一个也没啥用处。好,我格式化一下代码。
18:00
要好看一些啊,现在我要干嘛呢?我建立这种映射关系,而我们这种映射关系的建立,我们称为对的注册。注册。So。看这。这放一个name。给他起个名吧。叫什么?呃,这样吧,我这叫some。哎,这样放。我们刚刚定义的这个的全限定类名。是不是他呀,拷贝全名。
19:04
去拷贝全名啊。呃,我们可以,刚才这种考法,你注意你可不要这样考。你可不要这样考拷贝全名,你看拷出来是什么?这是一个文件,这是一个文件协议下的一种路径,我们不要它,你可以这样考。从这考拷贝全名。你看。诶,这是包形式下的。明白吧,你可以不要在它上面拷贝全名啊,你要么打开这个类,要么从这拷都可以,好我拷贝全名了。这仅仅你注意啊,这仅仅是创建或者说注册了一下solid这种映射关系,我们在这儿说的这种映射请求和映射这种关系还没建立呢,要建立映射,建立是映射映射买平。
20:08
映射。再看这有个URL patternon。什么意思呢?就是他要建立这种映射关系,指的是哎。这个solve哪个就这个,这个是谁,这个就是他,他就是他这个solve,你要想访问我,你就得提交什么样的请求呢,URL pattern。URL的模式什么,比如我这写了个你就提交,你就提交一个sum就可以了。好了。映射关系。咱们就说过了。我们一般情况下啊,说这个注册solve就包含这样的两部分,一个是对service类的注册,一个是和your的这种映射关系的注册。
21:11
所以注册分这样的两部分啊,这两部分缺一不可。好了,映射关系有了,那么我们下一步要做的工作。就可以访问了。好看着。哎,为什么404啊。我们不是欢迎页面是inex HL吗?没有啊,对不对。没有我们就不用管它了,我们直接给这儿输。说什么some?我先不敲回车啊,大家看一下。
22:01
控制台,我把控制台清了。走。哪看?是不是创建some初始化some,执行some实例的service方法诶?三个呀,不对呀,生命周期方法四个呀。是不是午餐过到期?Service。我不是说了吗?Destroy并不是执行到这儿以后啊,执行完它以后马上就销毁了,不是为什么,因为还有可能会有其他的。浏览器来访问。那比如说我现在重新拷贝。或者我先不拷贝,我直接刷新大家看啊,我刷新我把它清掉。现在先不清也行,不清也行,这是原来的啊。
23:05
我刷新刷新刷新刷新刷新刷新刷新。大家看到没?是这个。就刚才执行的那个初始化,也是刚才执行那个你看。是不是30次方法一直在执行啊?这就是为什么不能被你执行完,Service不能被销毁。不能把他销毁了,你笑话他,那后边怎么做呢?另外咱们大家再看我拷贝。啊,拷贝他这样,我给这儿访问。你看。这样我把它清掉。大家再看这。刷新。刷新。你看看是不是只执行service了?对不对。
24:03
也就是说我们从这个执行过程里边可以得出这样的一种结论,就是。这个方法无参观系和初始化是不是只执行一次啊,而service方法是不是可以执行多次,由于初始化和这个由于这个无参构造器和初始化只执行一次,就意味着我们就可以推断出来这个。这个类的对象,这个类的实力。在他们看看里边有几个。对,有一个。他只有一个。它是单立的。你注意它是单立的。而且它可以被多个浏览器。
25:04
同时访问说明它是什么呢?是多线程的,所以so的一个很重要的特征需要你记住的。是是单例多线程的。OK。那有同学说了,这这个这个。第处理方法什么时候执行啊?什么时候执行?当你不可能使用当前这个solid的时候再执行它。那什么时候就不可能使用它了。整个应用停止的时候。你应用都不用了,你的就不可能再访问了,也就是说什么时候我们把服务器停掉的时候。把服务器停到的时候就会执行它,好大家来看停服务器。右击注意,你注意我是怎么停服务器的啊,大家看我是不是可以直接从这点呢。
26:07
不要从这儿点。从这走。点这个stop。看看。销毁了吧,对不对,这是可以看到的啊好。我重新。这样吧,咱们重新启动服务器。我重新启动了服务器了。嗯,然后我刷新。直接刷新。创建了吧。青鸟。我现在直接点这儿把它停掉,直接点这把服务器停掉,你看看走。你看到没?
27:02
是不是没看到啊。没执行销毁,所以啊,这两种方式是不一样的。我们右击点stop和。这里边儿点它。这是terminate。这是不一样的。右击点stop属于什么呢?属于,对于来说它属于寿终正寝。哼,如果你点这。那电闸把服务器停掉了。那属于什么?对于来说它属于。意外。属于意外事故。那不一样。所以大家在做这个测试的时候啊,你注意。从这点这个stop,当然了和这点这个stop,这也是stop啊,这俩是一个意思,和这儿不是一个意思啊,点它terminate是不不一个意思的啊,当然你也可以从这点。
28:06
呃,服务器启动以后啊,就这可以看到,你可以给这点那个stop。好。那么这是我们刚才说这个。好总结一下啊,我们看看我们看看看什么呢?看这个so的特征。萨ET是单例多线程的,刚才说了吧,一个萨的实力只会执行一次。无参构造器与。盈利的方法,这是没问题的吧,只会执行一次。并且在什么时候执行?或者换一种说法,So的实力是什么时候创建的?你再看一下啊。再看一下这个我。这样开启服务器。
29:03
我问问大家,我现在服务器启动了。那么这个实例被创建了没有?他被创建了没有没有啊。你看看控制台吗?有吗?没有。那什么时候被创建,看着我直接刷新。我这一刷新是不是就创建了,也就是说当第一个请求到来的时候,它会创建,当然我再刷新,我换个浏览器刷新。大家看他会不会再创建,不会。单立的吗?它不会再创建,所以这是我们总结的第二点啊。实力的。无参构造器和引地的方法只会执行一次,并且是在第一次访问的时候执行的。也就是说,S的实例是在第一次被访问的时候创建的,那么用户每提交一次对当前somebody的请求就会执行一次。
30:10
Service方法对吧?一个实例只会执行一次destroy。是应用停止的时候执行。只会执行一次,当然了,你就一个实力。生只能生一次,那死呢,也只能死一次啊,你不能死而复生啊,是不是?诶,这个大家需要注意。You是。单立多线程的,所以为了保证线程安全性。我们一般情况下不为solid类定义可修改的成员命令。你注意。一般是不为定义可修改的成员变量的什么意思?大家想想,如果我这定义了一个啊,假设说private in count,我定一个count。
31:17
是吧,然后我给他一个。Get赛的方法,那大家想想。它是单立的呀,我这个浏览器。访问它的时候,我可以调用set方法,是不是修改count的值啊,我得改成五了。你也来访问这个了,然后你把这个solid的值改成了七了,那我问问我那个五还有没有了。肯定没有了呀,为什么这个实例就一个,对象就一个在哪放着,这对象在哪儿放着呢?
32:02
对象肯定是在Java机的。嘿。回顾一下,在哪放着呢?我们的对象,创建的对象在哪放着呢?对了,堆内存嘛,在堆里边放着呢,堆里边就一个sum的实例,并且它里边有一个成员命令叫count,我把它改成了五,你把它改成了七,你个七是后改的,是把我这个五给覆盖掉了,这就叫线程安全问题。对于这种单的单多线程的。失礼。为了保证其线程安全性,我们是不为其添加。可修改的成员命令,当然了,我这样,我把set给它去掉,只有get可不可以,这可以。比如我这给你赋值为五,那我们每一个人只能get这个值,这个值肯定就是五了,他不能修改呀。
33:08
它就不存在线程安全问题。所以线程安全问题产生的。这条件是什么?第一是单例多线程的。这是个条件。第二。这个单位多线程的对象存在有。什么东西存在有?可修改的成员命令。他要没有可修改的,它也不存在这个现场安全问题。OK。最后一点,默认情况下,在web容器启动的时候不会被实例化。Okay。那么大家在测试的时候啊,我要给大家写了一下,你需要注意这么几个时间点,第一个。我们项目部署的时候,就是发布的时候啊,我们启动服务器启动的时候并没有执行无餐购药器。
34:08
说明我们的web容器启动的时候没有创建对象,第二,用户提交请求以后马上会执行这三个方法,然后在刷新页面发现只会执行这一个方法。这需要你注意的啊。另外一个浏览器发出同样的请求,也只会执行service。这对象不会创建,然后正常关闭,这个正常关闭啊。Tom,我们会发现执行了Detroit这几个时间点,大家在进行测试的时候需要注意。
我来说两句