web实操3——servlet
课程链接b站:第12课
https://www.bilibili.com/video/BV1qv4y1o79t?spm_id_from=333.788.videopod.episodes&vd_source=05a3c1275b87b47507d869e9349ee3cd&p=233
为什么只要写一个实现Servlet的类就可以被调用
tomcat根据url去web.xml里定位到我们写的类后,就做了如下1,2,3操作
所以我们只需要按照人家规定的结构把service方法实现了,在里面编写好我们想要的逻辑,就可以了,对象的创建和方法的调用都是由服务器执行的。
所以也就是说了,为什么servlet的运行依赖于web容器,也就是说你不在这个容器里,没人帮你创建对象,没人帮你调用方法,就运行不了。
补充:
web.xml配置多个路径时写法:
Servlet类方法详解,servlet生命周期
init方法:
服务器启动后,第一次浏览器访问这个servlet的路径回车后,就会执行。执行完执行service方法。
service方法:
服务器启动后,浏览器每次访问路径,回车都会执行service方法。
destroy方法:
服务器正常关闭了(非正常关闭,直接把黑窗口叉掉这样,destory方法不会被执行),servlet被销毁了,servlet被销毁的时候执行destory方法
理解成交待临终遗言,所以这个方法是servlet销毁之前执行。
正常关闭服务器:就自动执行了destory方法:
关闭前:
点击后:
servlet生命周期:
什么时候被创建,什么时候被销毁
getServletConfig方法
返回了ServletConfig对象,是Servlet的配置对象。
这个方法需要我们自己去实现的,我们暂时先不做实现,先了解一下。
getServletInfo方法
获取servlet的一些信息,一般我们也不实现他,了解一下就可以了。
servlet生命周期详解
指定servlet的创建时机
如何指定:
在xml里用坐标指定,说明如下图:一共有两种时机
服务器启动时创建:
只要一启动就创建,不是要浏览器url回车创建了。
无论配成哪种,都是要先执行init方法。
但是service方法是必须浏览器回车的时候才会调用。
使用场景:
有的servlet加载的资源比较多,init方法用来加载资源的,
有的servlet执行之前需要依赖于其他的servlet,我们可以把其他servlet在服务器启动的时候就创建。就这个意思。
servlet单例的问题和解决
一个servlet内存里只有这一个对象:
这样一个对象会有的问题:
多个线程访问同样的对象资源的时候,这个时候可能会存在多线程的访问安全问题。
张三浏览器可以访问,李四也可以访问,王五也可以,
那么这同一个对象就是共享资源,就会存在安全问题。
加锁也不行,比如这个是12306的,张三在买,全国这么多亿人在那等着他买完吗,很不合适,性能影响太严重。
解决:
一个对象里面,方法不被共享,成员变量是被共享的。
所以尽量在方法里定义局部变量,每次方法进栈都会有一个变量存在在栈里,这个变量就不再是共享的了。这样就不会存在安全问题了。
如果万不得已必须要定义一个成员变量,尽量不要修改值,我们仅仅是获取这个值的话,每次只是拿这个值,没有对他修改,没有并发的操作,也不会有安全问题。
并发的问题是,有的线程对他进行修改了,有的对他获取了,所以才会出现数据安全错乱的问题。
前:
改成在方法里定义: