[转]七个问题全面理解Servlet
1. Servlet的生命周期?
Servlet是一种可以 在Servlet容器中运行的组件,那么理所当然就应该有一个从创建到销毁的过程,这个过程我们可以称之为Servlet生命周期。Servlet的生命 周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。生 命周期的具体说明如下:
-
Servlet容器完成加载Servlet类和实例化一个Servlet对象
-
init()方法完成初始化工作,该方法由Servlet容器调用完成
-
service()方法处理客户端请求,并返回响应结果
-
destroy()方法在Servlet容器卸载Servlet之前被调用,释放一些资源
Servlet实例是在servlet第一次在容器中被加载的是时候创建的, Init()方法是用来配置这个servlet实力的, 这个方法在servlet的生命周期中只被调用一次,所以应该把所有servlet生命周期中的配置操作都写在这个方法法里面。
3. 为什么不在Servlet中写一个构造(Contructor)方法?
容器会自动为Servlet写一个无参的构造方法
4. 我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢?
容器会自动为Servlet写一个无参的构造方法,容器是用Class.forName(className).newInstance()来创建servlet的实例的。
5. 当容器调用servlet的destory()方法的时候,servlet会马上销毁么? 如果当时这个servlet正在执行其他任务或者线程呢?
是的, 当容器调用servlet的destory()方法的时候,servlet会马上销毁,但是容器在调用destory()方法之前,会等servlet的service()方法结束剩余的任务。
6. 用ServletRequest和ServletContext调用ReqestDispatcher有什么区别?
在用ServletRequest调用RequestDispatcher的时候可以用相对URL, 但是ServletContext不行。
7. 为什么在用ServletRequest.getRequestDispatcher()的时候可以用相对URL而用ServletContext.getRequestDispatch()的时候不可以?
因为ServletRequest包含当前的request path,可以用当前的request path去计算URL,但是ServletContext不包含当前的request path。