Servlet对象的生命周期
1.Servlet对象的生命周期是由谁管理的?程序员可以干涉吗?
Servlet对象的生命周期包括Servlet对象的创建,方法的调用以及Servlet对象的销毁等过程。
它的生命周期由Web容器来管理,程序员无权干涉。
2.描述Servlet对象的生命周期
1)用户在浏览器中输入URL:http://localhost:8080/prj-servlet-03/testLifeCycle
2)web容器截取请求路径:/prj-servlet-03/testLifeCycle
3)web容器在容器上下文中找请求路径所对应的Servlet对象
4)若没有找到Servlet对象
4.1)通过web.xml文件中相关的配置信息,得到请求路径/testLifeCycle对应的完整类名
4.2)通过反射机制,调用Servlet对象的无参构造方法完成实例化
4.3)web容器调用Servlet对象的init方法完成初始化
4.4)web容器调用Servlet对象的service方法提供服务
5)若找到了Servlet对象
5.1)web容器直接调用Servlet对象的service方法提供服务
6)web容器关闭/webapp重新部署/Servlet对象长时间没有用户再次访问 的时候,web容器会销毁Servlet对象,在销毁之前调用Servlet对象的destroy方法
3.关于Servlet对象生命周期的几个总计和注意事项
1)Servlet对象的构造方法、init方法、destroy方法只执行一次
2)Servlet对象的service方法,用户请求一次便执行一次
3)init方法执行的时候,Servlet对象已经创建好了
4)destroy方法执行的时候,Servlet对象还没有被销毁
4.关于Servlet对象的线程安全问题
Servlet对象是单实例的(构造方法,init方法只调用一次,所有用户公用一个Servlet对象),但是不符合单例模式(24设计模式之一,单例模式的构造方法是私有的)。
而tomcat服务器支持多线程(多用户),所以Servlet对象是在单实例多线程环境下运行的。
若Servlet对象中有实例变量,并且实例变量涉及修改操作,那么便存在线程安全问题,解决方法是不使用实例变量,使用局部变量。
5.默认情况下,Servlet对象在web服务器启动阶段不会被实例化。若希望再web服务器(tomcat等)启动阶段实例化Servlet对象,可以再web.xml中进行配置。
<servlet> <servlet-name></servlet-name> <servlet-class></servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name></servlet-name> <url-pattern></url-pattern> </servlet-mapping>
在上面的<load-on-startup></load-on-startup>标签中设置自然数就可以决定Servlet对象启动时的优先级,自然数越小优先级越高。
6.访问Servlet时的URL配置
如上面的xml文本,
<servlet-name></servlet-name>是Servlet对象的注册名称,随意编写,保证上下两个<servlet-name></servlet-name>标签一致即可
<servlet-class></servlet-class>是Servlet对象的完整类名,通过反射机制创建Servlet对象
<url-pattern></url-pattern>是Servlet对象的访问路径配置:必须以"/"开头,且不包含项目名称,注意同一个Servlet可以被映射到多个URL上
缺省Servlet:<url-pattern>/</url-pattern>
缺省Servlet用于处理所有其他Servlet都不处理的访问请求
在URL中使用通配符*:
只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以"/*"结尾。例如 /abc/* 、 /* 、 *.do
7.Servlet对象实例化后,Servlet对象被存储到哪里了
大多数web容器将Servlet对象以及对应的url-pattern存储到Map集合中了:Map<string,Servlet>
例如:key value
/login LoginServlet对象引用
/delete DeleteServlet对象引用
8.web服务器启动时解析web.xml文件,在这个过程总做了什么
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中:Map<string,string>
例如:key value
/login com.bjpowernode.javaweb.servlet.LoginServlet
/delete com.bjpowernode.javaweb.servlet.DeleteServlet
9.Servlet接口中的这些方法编写什么代码
1)无参构造方法:不考虑写代码,不常用
2)init方法:Servlet对象创建时需要初始话一些东西时,在这里编写代码
3)service方法:必然重新,这里写业务逻辑
4)destroy方法:Servlet对象销毁时执行的代码,不常用