Servlet详解
Servlet任务就是得到客户的一个请求,根据请求执行任务并返回响应。
Servlet生命周期
Servlet的生命周期由容器来决定。
servlet生命周期只有一个状态——初始化。通常在容器启动时,容器找到servlet类文件,servlet生命周期开始。Servlet调用了构造 函数和init()函数之后,进入初始化状态。在这个状态中,它可以调用service()函数,在这个函数中根据请求调用doGet或doPost函数执行任务。
在容器中,每个Servlet只有一个对象,对于每个请求容器会运行一个线程来调用这个Servlet对象的函数。
对于init()函数我要多说一点,init函数用来初始化servlet,在调用servlet构造函数以后,生成了一个普通的对象,而调用了init函数以后,才成为一个真正的servlet,而且init函数在servlet一生中只运行一次。同时,在init函数里面我们可以放一些servlet的初始化代码,比如database连接代码等。那为什么不能将初始化代码放到servlet构造函数呢,这是因为servlet初始化往往需要ServletConfig对象(体现在web应用部署文件里面),而构造函数无法调用,这个和向前版本兼容有关[1],总之,记住,servlet构造函数不用写,所有的初始化的代码放到init函数里面!
请求和响应因为每个servlet只有一个实例,所以此Web应用的所有请求若访问这个servlet都是同一个实例,只是不同线程而已。所以,servlet的实例变量是所有的请求共享的,实例变量也不是线程安全的。一般来说,好的servlet一般不存在实例变量,或者就算存在也是final的。
请求和响应
Get和Post的区别上一节在HTTP角度已经有了一些说明,实践编程角度比较简单,本文就不介绍了。
首先来看请求对象,从请求对象里面我们可以得到什么?
最重要的,我们可以从请求对象里面获得客户传给我们的参数,如用户名、密码等。
除此之外,还可以获得浏览器信息、相关cookie及session信息等。
还有一些不常用的东东,比如请求HTTP方法、输入流等。
下面介绍响应对象。
对于响应对象,一般使用setContentType()函数设置内容类型,告诉浏览器内容是什么类型的以便浏览器处理。
然后,一般使用PrintWriter或OutputStream获得输出流,并将内容写入输出流即可。
完成以上步骤,刷新提交输出流即将输出流写入相响应象。
同时,我们可以使用一些函数设置响应首部信息。
除此之外,如果servlet不想自己处理响应,可以使用response.sendRedirect(strURL)函数,响应返回到浏览器后,浏览器会跳转到strURL。
我们还可以使用请求分派,在服务器端获得其他程序的帮助。一般为了不讲html代码写在servlet中,我们都在servlet运行完相关任务后使用请求分派将请求和相应对象使用请求分派传送给响应的jsp文件,根据jsp文件生成html文件返回给客户端。
Reference:
1 有关servlet中init和构造函数??? http://feipigzi.iteye.com/blog/675798