文章目录
Servlet对象
Servlet的本质是什么?
Servlet是服务器端的小java程序,这个小java程序不能随意编写,必须实现SUN制定的javax.servlet.Servlet接口,实现其中的方法。Servlet是一个满足java规范的java类。Servlet既然满足Servlet规范,Tomcat服务器我们可以叫做“WEB容器(Container)”,那么Servlet 就可以叫做容器中的“组件(Component)”
Servlet对象的生命周期是什么样的,什么时候创建,创建几次,什么时候销毁?
假设客户端向web服务器发送的请求是/login请求,当用户向web服务器第一次发送/login请求的时候,Tomcat在容器中搜索/login对象的Servlet对象,但是没有找到该对象,此时会从web.xml文件中获取/login对象的完整Servlet类名,通过反射机制,调用Servlet的无参数构造方法创建Servlet对象,马上调用init方法完成Servlet对象的初始化操作,然后调用service方法提供核心服务。
当用户第2+次再发送/login请求的时候,Tomcat还是在容器中搜索/login对象的Servlet对象,此时可以找到该对象,直接调用该对象的service方法提供核心服务。
当用户长时间没有访问该Servlet,或者服务器关闭,或者项目重新部署的时候,Tomcat容器会去回收Servlet对象所占用的内存,在回收该内存之前调用该Servlet对象的destroy方法,完成回收之前的准备。
结论:
Servlet对象只创建一次(构造函数只执行一次)
Servlet对象的init方法在对象创建之后马上执行(只执行一次完成初始化操作)
Servlet对象service方法,只要用户访问一次则执行一次。
Servlet对象的destroy方法,也是只执行一次,执行之前对象没有销毁,即将销毁。
Servlet对象的生命周期由Tomcat容器管理,对象的创建,对象内存的释放,还有对象中的方法调用都是由Tomcat容器完成,程序员不能干涉,只能编写该类实现Servlet接口,将其配置在web.xml文件中。
Servlet对象是单实例的,并且是在多线程的环境下运行,可能存在线程并发带来的安全问题。
什么情况下在init方法中编写程序?什么情况下在service方法中编写程序?什么情况下在destroy方法中编写程序?
- init方法是SUN规范中为程序员提供的一个对象初始化时机,这是一个特定的时刻,有的时候我们需要在这个特定的时刻执行一段特定的程序,此时将该程序写入init方法,例如:项目经理要求在Servlet对象创建时刻记录日志,请将该程序编写到init方法中。对象第一次创建的时候执行记录日志,并且只执行一次,记录一次日志信息。(init方法一般很少用)
- Service方法是Servlet的核心业务方法,核心业务都在该方法中完成,只要编写一个Servlet,service方法是一定要编写代码的,完成业务的处理。(常用)
- destroy方法init方法相同,只不过是一个不同的时机。(destroy方法一般很少使用)
研究Servlet对象的生命周期
1、在myeclipse中设置文件的默认打开方式:
Window–>Preferences–>file associations–>找到对应扩展名选项–>设置默认打开方式default
2、什么是Servlet生命周期?
Servlet对象的生命周期表示:Servlet对象从最初的创建,到最终的销毁,经历了哪些不同的过程。
3、Servlet对象的创建,Servlet对象的方法被调用,Servlet对象的销毁,都是由WEB容器来负责管理的,
javaweb程序员是不需要管理这些的。
javaweb程序员主要负责:
Servlet类的编写,
service方法的实现,
Servlet类在web.xml文件中的配置。
4、myeclipse快捷键:
alt + / 自动补全
ctrl + 1 纠错
ctrl + o 查看类的属性和方法
ctrl + shift + t 查找类
ctrl + shift + o 组织导入
ctrl + / 注释和取消注释
tab 缩进
shift + tab 取消缩进
ctrl + shift + f 格式化【不建议使用】
ctrl + alt + 向下箭头 复制一行
ctrl + z 撤销
ctrl + y 重做
ctrl + s 时刻记住这个“保存”
ctrl + c
ctrl + x
ctrl + v
ctrl + d 删除光标所在行
5、web.xml文件在服务器启动阶段被解析,若web.xml文件编写有错误,启动Tomcat服务器的时候,当前webapp启动失败。
6、Servlet对象“默认情况”下,在服务器启动阶段是不会实例化的。不会创建对象
7、Servlet对象的生命周期
1) 用户打开浏览器在浏览器地址栏上输入URL:http://localhost:8080/oa/save,回车
2) WEB服务器截取请求路径,得知用户要访问的资源是:/oa/save
3) WEB服务器从整个容器中检索/oa/save请求路径对应的Servlet对象
4) 若找到了该Servlet对象
4-1) web容器负责调用该Servlet对象的service方法提供服务,处理请求
5) 若没有找到该Servlet对象
5-1) 通过请求路径/save找到对应的Servlet完整类名(web.xml文件支持的,web.xml文件在服务器启动阶段解析,路径和类名已经绑定在一起了)
5-2) 通过反射机制调用Servlet类的无参数构造方法完成Servlet对象的实例化操作。(Servlet对象已经创建完毕)
5-3) web容器调用该Servlet对象的init方法完成初始化操作。
5-4) web容器调用该Servlet对象的service方法提供服务,处理请求
6) 若“服务器关闭”或“webapp重新部署”或“长时间没有用户再访问该Servlet”,WEB容器
会销毁该Servlet对象占用的内存空间,web容器在销毁该Servlet对象之前,web容器负责
调用该Servlet对象的destroy方法,完成销毁之前的准备工作。
8、Servlet对象是单实例的,不符合单例模式,是一种伪单例,真单例的构造方法必须是私有化的。
Servlet对象是在多线程环境下运行的一个对象。【单实例多线程环境下运行的一个java对象】
之所以Servlet对象是单实例的,是因为该对象的创建是由WEB容器负责的,javaweb程序员不能干涉
9、单例分类:
真单例
伪单例
10、总结:
1) 无参数构造方法只调用一次,对象只创建一个,对象是单例的
2) init方法只被调用一次,在对象创建之后马上执行它,完成初始化操作
3) service方法,只要用户发送请求一次,则执行一次
4) destroy方法也是只执行一次
注意:
init方法在执行的时候&