[Java] Servlet
1. 什么是Servlet
Servlet是Sun公司提供的一门用于开发动态Web资源的技术。
Sun公司在其API中提供了一个Servlet接口,用户如果想开发一个动态Web资源,
需要完成以下2个步骤:
(1)编写一个Java类,实现Servlet接口。
(2)把开发好的Java类部署到Web服务器中。
通常我们也把实现了Servlet接口的Java程序,也称之为Servlet。
2. Web服务器处理请求的过程
Servlet程序由Web服务器调用,Web服务器收到客户端对Servlet的访问请求后:
(1)Web服务器首先检查是否已创建并装载了该Servlet的实例对象,是(4)否(2)
(2)创建并装载该Servlet的一个实例对象
(3)调用Servlet实例对象的init()方法
(4)创建一个用于封装HTTP请求消息的HttpServletRequest对象,和一个代表HTTP响应的HttpServletResponse对象。然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
(5)Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法
3. HttpServlet的doGet与doPost方法
Servlet接口Sun公司定义了2个默认实现类,分别为:GenericServlet,HttpServlet
开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。
因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
4. 多次请求共用一个Servlet实例
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。
而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
5. 线程安全性
当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
针对Servlet的线程安全问题,Sun公司是提供有解决方案的:
让Servlet去实现一个SingleThreadModel接口。
对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
6. ServletContext对象
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
ServletContext对象通常也被称之为context域对象。
servlet1:
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data);
servlet2:
ServletContext context = this.getServletContext();
tring data = (String) context.getAttribute("data");