深入servlet

  Java Servlet是和平台无关的服务器端组件,它运行在 Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应” 的模式。

  Servlet可完成如下功能: 

  • 创建并返回基于客户请求的动态HTML页面。
  • 创建可嵌入到现有 HTML 页面中的部分 HTML 页面(HTML 片 段)。
  • 与其它服务器资源(如数据库或基于Java的应用程序)进行通信 。  

servlet API:

Servlet的框架是由两个Java包组成:

  • javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
  • javax.servlet.http 包 : 定义了采用HTTP协议通信的HttpServlet类。

Servlet的框架的核心是javax.servlet.Servlet接口 ,所有的Servlet都必须实现这一接口。在Servlet接 口中定义了五个方法,其中有三个方法代表了Servlet的生命周期: 

  • init方法:负责初始化Servlet对象;
  • service方法:负责响应客户的请求;
  • destroy方法:当Servlet对象退出生命周期时,负责释放 占用的资源。

 

 

 

ServletRequest接口:

  • ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议, 以及发出客户请求的远程主机信息等。 ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。
  • ServletRequest的子类可以为Servlet提供更多的和特定协议相关的数据. 例如: HttpServletRequest提供了读取HTTP Head信息的方法。 

ServletResponse接口:

  • ServletResponse接口为Servlet提供了返回响应结果 的方法。它允许Servlet设置返回数据的长度和MIME 类型, 并且提供输出流ServletOutputStream。
  • ServletResponse子类可以提供更多和特定协议相关 的方法。例如: HttpServletResponse 提供设定HTTP HEAD信息的方法。

Servlet生命周期:

Servlet的生命周期可以分为三个阶段: 

  • 初始化阶段
  • 响应客户请求阶段
  • 终止阶段

在javax.servlet.Servlet接口中定义了三个方法init(), service(), destroy(),它们将分别在Servlet的不同阶段被调用。

Servlet的初始化阶段:

在下列时刻Servlet容器装载Servlet:

  • Servlet容器启动时自动装载某些Servlet
  • 在Servlet容器启动后,客户首次向 Servlet 发出请求 
  • Servlet的类文件被更新后,重新装载Servlet  

Servlet被装载后,Servlet容器创建一个 Servlet 实例并且调用 Servlet 的 init()方法进行初始化。在 Servlet的整个生命周期中,init方法只会被调用一次。

Servlet的响应客户请求阶段:

对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和 ServletResponse对象,然后调用 Servlet 的 service方法。service方法从ServletRequest对象获得客户请求信息、处理该请求,并通过 ServletResponse对象向客户返回响应结果。

如果你的Servlet类扩展了HttpServlet类,你通常不必实现 service方法,因为HttpServlet类已经实现了service方法, 该方法的声明形式如下:

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException;

  

在 HttpServlet 的 service 方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法。例如:如果请求方式为GET ,那么调用doGet方法;如果请求方式为POST,那么调用 doPost方法。

Servlet的终止阶段:

当Web应用被终止,或Servlet容器终止运行,或 Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源。

创建HTTPServlet类(以创建HelloServlet为例)的步骤: 

  1. 扩展 HttpServlet 抽象类。
    • public class HelloServlet extends HttpServlet {
      }
  2. 覆盖HttpServlet的部分方法,如覆盖doGet()或 doPost()方法。 
    • public class HelloServlet extends HttpServlet {
          public void doGet(HttpServletRequest request, HttpServletResponse  response) throws IOException ,ServletException {
          }
      }
  3. 获取HTTP 请求信息,例如通过HttpServletRequest 对象来检索 HTML 表单所提交的数据或 URL 上的查询字符串 。无论是HTML表单数据还是URL 上的查询字符串,在 HttpServletRequest 对象中都以参数名/参数值的形式存放, 你可以通过getParameter(String name)方法检索参数信息 。
      • public class HelloServlet extends HttpServlet {
            public void doGet(HttpServletRequest request, HttpServletResponse  response) throws IOException ,ServletException {
          

        String clientName=request.getParameter("clientName"); 
        if(clientName!=null){
        clientName=new String(clientName.getBytes("ISO-8859- 1"),"GB2312");
        } else {
        clientName="我的朋友";
        }
        } }
  4. 生成 HTTP 响应结果。通过 HttpServletResponse 对象可以生成响应结果。 HttpServletResponse 对象有一个 getWriter()方 法,该方法返回一个 PrintWriter 对象。使用 PrintWriter 的 print()或 println()方法可以向客户端发送字符串数据流。
    • public class HelloServlet extends HttpServlet {
          public void doGet(HttpServletRequest request, HttpServletResponse  response) throws IOException ,ServletException {
              String clientName=request.getParameter("clientName");
      if(clientName!=null){
      clientName=new String(clientName.getBytes("ISO-8859- 1"),"GB2312");
      } else {
      clientName="我的朋友";
      }
      PrintWriter out;
             String title="HelloServlet";
             String heading1="This is output from HelloServlet by doGet:";   // set content type.
             response.setContentType("text/html;charset=GB2312");     // write html page.
             out = response.getWriter();
             out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>" );
             out.print("</HEAD><BODY>");
             out.print(heading1);
             out.println("<h1><P> "+clientName+" : 您好</h1>");
             out.print("</BODY></HTML>");       //close out.
             out.close();
      } }
  • 最后不要忘记在web.xml中发布: 在web.xml中为HelloServlet类加上如下<servlet>和 <servlet-mapping>元素: 
    • <servlet>
                <servlet-name>HelloServlet</servlet-name>
                <servlet-class>com.test.servlet.HelloServlet</servlet-class>
      </servlet>


      <servlet-mapping>
               <servlet-name>HelloServlet</servlet-name>
               <url-pattern>/hello</url-pattern>
      </servlet-mapping>
       

 

posted on 2013-01-29 11:19  阿波次的  阅读(142)  评论(0编辑  收藏  举报

导航