您的位置:首页 > 产品设计 > UI/UE

Servlet技术浅析(一)之GenericServlet抽象类

2017-01-03 14:42 423 查看
简介:

servlet最常用的几个对象:

1、请求对象(ServletRequest和HttpServletRequest):Servlet从该对象中,获取来自客户端的请求信息。

2、响应对象(ServletResponse和HttpServletResponse):Servlet通过该对象来生成响应结果。

3、Servlet配置对象(ServletConfig):当容器初始化一个Servlet对象时,会向Servlet提供一个ServletConfig对象,Servlet通过该对象来获取初始化参数信息及ServletContext对象。

4、Servlet上下文对象(ServletContext):Servlet通过该对象来访问容器为当前Web应用提供的各种资源。

一、Servlet API:

1、Servlet API主要由两个java包组成:javax.servlet和javax.servlet.http;

1)在javax.servlet包中定义了Servlet接口和相关的通用接口和类;

2)在javax.setvlet.http包中主要定义了与http协议相关的HttpServlet类、HttpServletRequest接口和HttpServletResponse接口。

下图显示了Servlet API 中主要的接口和类的类框图;



2.1、Servlet接口
Servlet API的核心是javax.servlet.Servlet接口,所有的Servlet类都必须实现这一接口。在Servlet接口中定义了5个方法,其中3个由Servlet容易调用,容器会在Servlet生命周期的不同阶段调用特定的方法。
1)init(ServletConfig config)方法 :负责初始化Servlet对象。容器在创建好Servlet对象后,就会调用该方法。
2)service(ServletRequest req , ServletResponse res)方法:负责响应客户的请求,为客户提供相应的服务。当容器接收到客户端要求方法特定Servlet对象的请求时,就会调用该Servlet对象的service()方法。
3)destroy()方法:负责释放Servlet对象占用的资源。当Servlet对象结束生命周期时,容器会调用此方法。

Servlet接口还定义了两个返回Servlet相关信息的方法。JavaWeb应用中的程序代码可以访问Servlet的这两个方法,从而获得Servlet的配置信息及其他相关信息。
1)getServletConfig(): 返回一个ServletConfig对象,在该对象中包含了Servlet的初始化参数信息。
2)getServletInfo():返回一个字符串,在该字符串中包含了Servlet的创建者、版本和版权等信息。

在Servlet API 中,javax.servlet.GenericServlet抽象类实现了Servlet接口,而javax.servlet.http.HttpServlet抽象类是GenericServlet类的子类。当用户开发自己的Servlet类时,可以选择扩展GenericServlet或HttpServlet类。下图展示了Servlet接口及其实现类的类框图



二、下面详细介绍各个类
1、GenericServlet抽象类为Servlet接口提供了通用实现,他与任何网络应用层协议无关。GenericServlet类除了实现Servlet接口,还实现了ServletConfig接口和Serializable接口。
先看javax.servlet.servlet接口源码:
package javax.servlet;   //Tomcat源码版本:6.0.20
import java.io.IOException;

public interface Servlet {

//负责初始化Servlet对象。容器一旦创建好Servlet对象后,就调用此方法来初始化Servlet对象
public void init(ServletConfig config) throws ServletException;

//方法负责响应客户的请求,提供服务。当容器接收到客户端要求访问特定的servlet请求时,就会调用Servlet的service方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
/*
*Destroy()方法负责释放Servlet 对象占用的资源,当servlet对象结束生命周期时,servlet容器调用此方法来销毁servlet对象.
**/
public void destroy();
/*
说明:Init(),service(),destroy() 这三个方法是Servlet生命周期中的最重要的三个方法。
**/
/*
*返回一个字符串,在该字符串中包含servlet的创建者,版本和版权等信息
**/
public String getServletInfo();

/*
GetServletConfig: 返回一个ServletConfig对象,该对象中包含了Servlet初始化参数信息
**/
public ServletConfig getServletConfig();
}

GenericSerlvet抽象类源码如下:

package javax.servlet;

import java.io.IOException;
import java.util.Enumeration;

//抽象类GenericServlet实现了Servlet接口的同时,也实现了ServletConfig接口和Serializable这两个接口
public abstract class GenericServlet
implements Servlet, ServletConfig, java.io.Serializable
{
//私有变量,保存 init()传入的ServletConfig对象的引用
private transient ServletConfig config;

//无参的构造方法
public GenericServlet() { }
/*
------------------------------------
以下方法实现了servlet接口中的5个方法
实现Servlet接口方法开始
------------------------------------
*/
/**
*实现接口Servlet中的带参数的init(ServletConfig Config)方法,将传递的ServletConfig对象的       	 *       引用保存到私有成员变量中,
*  使得GenericServlet对象和一个ServletConfig对象关联.
*  同时它也调用了自身的不带参数的init()方法
**/
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();   //调用了无参的 init()方法
}
//无参的init()方法
public void init() throws ServletException {
}

//空实现了destroy方法
public void destroy() { }

//实现了接口中的getServletConfig方法,返回ServletConfig对象
public ServletConfig getServletConfig()
{
return config;
}

//该方法实现接口<Servlet>中的ServletInfo,默认返回空字符串
public String getServletInfo() {
return "";
}

//唯一没有实现的抽象方法service(),仅仅在此声明。交由子类去实现具体的应用
//在后来的HttpServlet抽象类中,针对当前基于Http协议的Web开发,HttpServlet抽象类具体实现了这个方法
//若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
/*
------------------------------------
实现Servlet接口方法结束
------------------------------------
*/

/*
---------------------------------------------
*以下四个方法实现了接口ServletConfig中的方法
实现ServletConfig接口开始
---------------------------------------------
*/
//该方法实现了接口<ServletConfig>中的getServletContext方法,用于返回servleConfig对象中所包含的servletContext方法
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
//获取初始化参数
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
//实现了接口<ServletConfig>中的方法,用于返回在web.xml文件中为servlet所配置的全部的初始化参数的值
public Enumeration getInitParameterNames() {
return getServletConfig().getInitParameterNames();
//获取在web.xml文件中注册的当前的这个servlet名称。没有在web.xml 中注册的servlet,该方法直接放回该servlet的类名。
//该方法实现了接口<ServleConfig>中的getServletName方法
public String getServletName() {
return config.getServletName();
}
/*
---------------------------------------------
实现ServletConfig接口结束
---------------------------------------------
*/
public void log(String msg) {
getServletContext().log(getServletName() + ": "+ msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
}


补充:

GenericServlet类实现了Servlet接口和ServletConfig接口,GenericServlet类的主要身份是Servlet,此外,它还运用装饰设计模式,为自己附加了ServletConfig装饰身份(装饰者设计模式参见《设计模式之装饰者模式》)。在具体实现中,GenericServlet类包装了一个ServletConfig接口的实例,通过该实例来实现ServletConfig接口中的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息