Servlet简介    Java Servlet是与平台无关的服务器端组件,它可以运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用"请求/响应"的模式
    Servlet可以完成以下功能:
    l         创建并返回基于客户请求的动态HTML页面
    l         创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)
    l         与其他服务器资源(如数据库或基于Java的应用程序)进行通信
    l         接收多个客户机的输入,并将结果广播到多个客户机上,如Servlet可以实现支持多个参与者的游戏服务器
    l         根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,如进行图像格式转换

Servlet API
    Servlet的框架是由两个Java包组成的:javax.servlet和javax.servlet.http,前者定义了所有的Servlet类都必须实现或扩展的通用接口和类,后者定义了采用HTTP协议通信的HttpServlet类
    Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口,其中定义了5个方法,3个代表Servlet的生命周期:
    l         init方法,负责初始化Servlet对象
    l         service方法,负责响应客户的请求
    l         destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源
    用户开发自己的Servlet类时,必须扩展以下两个类中的一个:
    扩展GenericServlet类:如果扩展这个,必须实现service方法,service方法有两个参数,ServletRequest和ServletResponse。Servlet容器将客户的请求信息封装在ServletRequest对象中,传给service方法;service方法将响应客户的结果通过ServletResponse对象传给客户
    扩展HttpServlet类:这个不需要实现service方法,在此方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法,如请求方式为GET,则调用doGet(),如为POST,调用doPost()。两个参数HttpServletRequest和HttpServletResponse
    ServletRequest接口:封装了客户的请求信息,包括请求方式、参数名和参数值、客户端使用的协议,以及发出客户请求的远程主机信息等,方法如下:
         getAttribute         根据参数给定的属性名返回属性值
         getContentType       返回客户请求数据MIME类型
         getInputStream       返回以二进制方式直接读取客户请求数据的输入流
         getParameter         根据给定的参数名返回参数值
         getRemoteAddr        返回远程客户主机的IP地址
         getRemoteHost        返回远程客户主机名
         getRemotePort        返回远程客户主机的端口
         setAttribute         在ServletRequest中设置属性(包括属性名和属性值)
    ServletResponse接口:为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据的长度和MIME类型,方法如下:
         getOutputStream      返回可以向客户端发送二进制数据的输出流对象ServletOutputStream
         getWriter            返回可以向客户端发送字符数据的PrintWriter对象
         getCharacterEncoding 返回Servlet发送的响应数据的字符编码
         getContentType       返回Servlet发送的响应数据的MIME类型
         setCharacterEncoding 设置Servlet发送的响应数据的字符编码
         setContentType       设置Servlet发送的响应数据的MIME类型

Servlet的生命周期
    Servlet的生命周期开始于被装载到Servlet容器中,结束于被终止或重新装入时.分三个阶段:初始化阶段,响应客户请求阶段和终止阶段.在javax.servlet.Servlet接口中定义了3个方法init(),service(),destroy(),它们将分别在Servlet的不同阶段被调用.
    初始化阶段:Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet整个生命周期中,init方法只会被调用一次,它有两种重载形式:
              public void init(ServletConfig config) throws ServletException;
              public void init() throws ServletException;
    在 Servlet的初始化阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用于存放Servlet的初始化配置信息, 如Servlet的初始参数,如果使用第二种,那么要在init方法中访问ServletConfig对象,可以调用Servlet类的getServletConfig()方法
    响应客户请求阶段: 对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法.service方法从ServletRequest对象获得客户请求信息并处理该请求,通过 ServletResponse对象向客户返回响应结果.
    终止阶段:当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法,在此方法中,可以释放Servlet所占用的资源.

HTTP与HttpServlet    Web服务器和浏览器是通过HTTP在Internet上发送和接收消息,HTTP是一种基于请求/响应模式的协议.在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接.
    HTTP请求构成:请求方法URI协议/版本、请求头(Request Header)、请求正文
    HTTP响应构成:协议 状态代码 描述、响应头(Response Header)、响应正文(HTML页面)
    Servelet容器响应Web客户请求流程:
        Web客户向Servlet容器发出HTTP请求
        Servlet容器解析Web客户的HTTP请求
        Servlet容器创建一个HttpRequest对象,在这个对象中封装了HTTP请求信息
        Servlet容器创建一个HttpResponse对象
        Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet
        HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
        HttpServlet调用HttpResponse的有关方法,生成响应数据
        Servlet容器把HttpServlet的响应结果传给Web客户

创建HttpServlet的步骤    1.扩展HttpServlet抽象类
    2.覆盖HttpServlet的部分方法,比如覆盖doGet()或doPost()方法
    3.获取HTTP请求信息,如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串,无论是HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,通过以下方法检索参数信息:
        getParameterNames()       返回一个Enumeration对象,它包含了所有的参数名信息
        getParameter(String name) 返回参数名name对应的参数值
        getParameterValues()      返回一个Enumeration对象,它包含了所有的参数值信息
    4.生成HTTP响应结果,通过HttpServletResponse对象可以生成,getWriter()方法返回一个PrintWriter对象,使用PrintWriter的print()或println()方法可以向客户端发送字符串数据流

  1. package mypack;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import java.io.*;

  5. public class HelloServlet extends HttpServlet //第一步:扩展 HttpServlet 抽象类
  6. {
  7. //第二步:覆盖doGet()方法
  8. public void doGet(HttpServletRequest request,
    HttpServletResponse response) throws IOException ,ServletException
  9. {
  10. //第三步:获取HTTP 请求中的参数信息
  11. String clientName=request.getParameter("clientName");
  12. if(clientName!=null) //解决汉化问题,做转码工作
  13. clientName=new String(clientName.getBytes("ISO-8859-1"),"GB2312");
  14. else
  15. clientName="我的朋友";

  16. //第四步:生成 HTTP 响应结果
  17. PrintWriter out;
  18. String title="HelloServlet";
  19. String heading1="This is output from HelloServlet by doGet:";
  20. // set content type.
  21. response.setContentType("text/html;charset=GB2312");
  22. // write html page.
  23. out = response.getWriter();
  24. out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>");
  25. out.print("</HEAD><BODY>");
  26. out.print(heading1);
  27. out.println("<h1><P> "+clientName+" : 您好</h1>");
  28. out.print("</BODY></HTML>");
  29. //close out.
  30. out.close();
  31. }
  32. }

ServletContext和Web应用的关系
    Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据,它提供了4个读取或设置共享数据的方法:
        setAttribute(String name,Object object)把一个对象和一个属性名绑定,对象存储在ServletContext中
        getAttribute(String name)       根据给定的属性名返回所绑定的对象
        removeAttribute(String name)    根据给定的属性名从ServletContext中删除相应的属性
        getAttributeNames()             返回一个Enumeration,它包含了存储在ServletContext中的所有属性名

 

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------------

 

 

以下内容摘自<<精通 servlet>>Servlet基础Servlet容器(以前称Servelt引擎)实际上是执行servlet的软件。所有支持servlet的服务器包括一个servelt容器(集成的或通过插件。)术语支持java的服务器常指一个增强的servletHTTP服务器(即它包括一个用于运行servlet的 servlet容器) Servlet生命周期:以下是一个服务器调用servlet的过程。 
1, 在服务器启动时,当servlet被客户首次请求或被配置好,这时由服务器加载servlet.Servlet的加载可以通过合用一个自定义的Java类加载工具(可允许自动Servlet重载)从本地或远程地址来实现。这一步等同于 Class c = Class.forName(“com.sourceStream.MyServlet”);这里用的术语加载指同时加载和初始化servlet的过程。
2.服务器创建一个servlet类实例来为所有请求服务。利用多线程,可以由单个servlet实例来服务于并行的请求。惟一的例外是,因为实现SingleThreadModel接口的servlet,这样,服务器会创建一个实例池并从中选择一个来服务于每一新的请求。此步相当于以下java代码:Servlet s = (Servlet)c.newInstance();
3. 服务器调用Servlet的init()方法。它用来保证完成在首次请求servlet处理以前的执行过程。如果servlet创建了多个servlet实例,则为每个实例调用一次init()方法。 
4.服务器从包括在客户请求中的数据里构造一个ServletRequest或HttpServletRequest对象,还构造一个ServletResponse或HttpServletResponse对象来返回响应提供方法。其参数类型依赖于servlet是否分别扩展GenericServlet或HttpServlet.(注意:如果服务器没有收到对这一servlet的请求,此步骤与以下5---7步骤将不会发生。) 
5.服务器调用servlet的service()方法(对于Httpservlet,service()将调用更为具体的方法:如:doGet() 或doPost()),在此步骤中作为参数传递结构化对象。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。(除非servlet实现了SingleThreadModel接口)
6通过分析ServletReuest或HttpServletRequest对象。Service()方法处理客户的请求.并调用ServletResponse或HttpServletResponse对象来响应。 

7.如果服务器收到另一格对该servlet的请求,这个处理过程从5步骤重复。 

8.一旦servlet容器检测到一个servlet要被卸载,这可能是因为要回收资源或因为它正在被关闭,服务器会在所有servlet的service()线程完成之后(或在服务器规定时间后)调用servlet的destroy()方法。然后servlet就可以进行无用存储单元收集清理。Servlet容器不需要为保留一个servlet而指定时间。 以上8个步骤就是servlet的生命周期。