Java面试题
Servlet
1.Servlet 结构图
Servlet 和 ServletConfig 都是顶层接口,而 GenericServlet 实现了这两个顶层接口,然后 HttpServlet 继承了 GenericServlet 类.所以要实现一个 Servlet 直接就可以继承 HttpServlet
2.Servlet 接口
init 方法接收一个 ServletConfig 参数,由容器传入.ServletConfig 就是 Servlet 的配置,在 web.xml 中定义 Servlet 时通过 init-param 标签配置的参数由 ServletConfig 保存
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(); }
3. ServletConfig 接口
ServletConfig 是 Servlet 级别,而 ServletContext 是全局的
public interface ServletConfig {
//用于获取 Servlet 名,web.xml 中定义的 servlet-name
String getServletName();
//获取 Servlet 上下文对象(非常重要)
ServletContext getServletContext();
//获取 init-param 中的配置参数
String getInitParameter(String var1);
//获取配置的所有 init-param 名字集合
Enumeration<String> getInitParameterNames(); }
4.GenericServlet 抽象类
GenericServlet 是 Servlet 的默认实现,是与具体协议无关的
//抽象类 GenericServlet 实现了 Servlet 接口的同时,也实现了
//ServletConfig 接口和 Serializable 这两个接口
public abstract class Generic Servlet implementsServlet,ServletConfig,java.io.Serializable {
//私有变量,保存 init()传入的 ServletConfig 对象的引用
private transient Servlet Config config;
//无参的构造方法
public Generic Servlet(){
}
-----------------------------------
以下方法实现了 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()方法
publicvoid init()throwsServletException{
}
//空实现了 destroy 方法
publicvoid destroy(){
}
//实现了接口中的 getServletConfig 方法,返回 ServletConfig 对象
public ServletConfig getServletConfig() {
return config;
}
//该方法实现接口<Servlet>中的 ServletInfo,默认返回空字符串
publicStringgetServletInfo(){
return""; }
//唯一没有实现的抽象方法 service(),仅仅在此声明。交由子类去实现具体的应用
//在后来的 HttpServlet 抽象类中,针对当前基于 Http 协议的 Web 开发,HttpServlet 抽象类具体实现了这个方法
//若有其他的协议,直接继承本类后实现相关协议即可,具有很强的扩展性
public abstract void service(ServletRequestreq,ServletResponseres) throws ServletException, IOException;
-----------------------------------
实现 Servlet 接口方法结束
-----------------------------------
--