码迷,mamicode.com
首页 > 其他好文 > 详细

第四部分_Servlet精解

时间:2015-07-03 20:32:10      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

Servlet API

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

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

换句话说,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的终止阶段:

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

Servlet API类图如下:

技术分享

  • 如果你的Servlet类扩展了HttpServlet类,你通常不必实现service方法,因为HttpServlet类已经实现了service方法,该方法的声明形式:protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
  • 在HttpServlet的service方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法。例如,如果请求方式为GET,那么调用doGet方法;如果请求方式为POST,那么调用doPost方法。

Tomcat service源码伪码描述如下:

public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	String method = request.getMethod();
	
	if(method.equalsIgnoreCase("get"))
	{
		this.doGet(request, response);
	}
	else if(method.equalsIgnoreCase("post"))
	{
		this.doPost(request, response);
	}
	else if ...
}

  ServletRequest接口

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

  ServletRequest接口的主要方法

  • getAttribute,根据参数给定的属性名返回属性值
  • getContentType,返回客户请求数据MIME类型
  • getInputStream,返回以二进制方式直接读取客户请求数据的输入流
  • getParameter,根据给定的参数名返回参数值
  • getRemoteAddr,返回远程客户主机的IP地址
  • getRomoteHost,返回远程客户主机名
  • getRemotePort,返回远程客户主机的端口

  ServletResponse接口

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

  ServletResponse接口的主要方法

  • getOutputStream,返回可以向客户端发送二进制数据的输出流对象ServletOutputStream
  • getWriter,返回可以向客户端发送字符数据的PrintWrite对象
  • getCharacterEncoding,返回Servlet发送的相应数据的字节编码
  • getContentType,返回Servlet发送的响应数据的MIME类型
  • setContentType,设置Servlet发送的响应数据的MIME类型

创建自己的HttpServlet

技术分享

技术分享

下面给出一个实例:

package com.test.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet // 第一步: 扩展 HttpServlet 抽象类。
{
	// 第二步:覆盖doGet()方法
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException
	{
		// 第三步:获取HTTP 请求中的参数信息
		String clientName = request.getParameter("clientName");
		if (clientName != null)
		{
			clientName = new String(clientName.getBytes("ISO-8859-1"), "GB2312");
		}

		else
		{
			clientName = "我的朋友";
		}

		// 第四步:生成 HTTP 响应结果。

		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();
	}
}

在浏览器地址栏中键入:http://localhost:8080/test/HelloServlet,返回信息为:

This is output from HelloServlet by doGet:

我的朋友 : 您好

 键入:http://localhost:8080/test/HelloServlet?clientName=Eric,返回信息为:

This is output from HelloServlet by doGet:

Eric : 您好

第四部分_Servlet精解

标签:

原文地址:http://www.cnblogs.com/Code-Rush/p/4618999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!