上图是Servlet核心接口类图:可以看出我们平时自动创建的servlet是都是继承HttpServlet,Httpservlet又是继承于genericSevlet,GenericServlet是实现了Servlet的接口。这种层层继承的目的也是为了更加抽象,便于以后的拓展。使上层的接口变得通用。
HttpServletRequest和response 是在服务器上被创建的,它也是依赖了Servlet的接口。
上图是一个web容器和pro(项目容器)以及Servletcontext的关系图。
一个功能健全的 servlet 容器对于每个 servlet 的 HTTP 请求会完成以下事情:
l 1, 当 servlet 第一次被调用的时候,加载了 servlet 类并调用它的 init 方法(仅调用一次)
l 响应每次请求的时候 ,构建一个 javax.servlet.ServletRequest 和 javax.servlet.ServletResponse 实例。
l 激活 servlet 的 service 方法,传递 ServletRequest 和 ServletResponse 对象。
l 当 servlet 类关闭的时候,调用 servlet 的 destroy 方法,并卸载 servlet 类。
Servletconfig:Servlet的配置文件被封装成一个初始化的对象放在pro的容器中,可以说是给servlet 放初始值变量的。
Servletcontext:Servlet 被创建之后都归context管理。
Servletcontext的作用相当于是一个A(servlet)和B(servlet)之间的桥梁. A也可以通过getServletcontext方法,获得servlet 容器,从而调用上册的pro容器。
二、ServletContext详解
ServletContext是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletContext对象,即servlet上下文环境。每个webapp都有唯一的ServletContext对象。同一个webapp的所有servlet对象共享一个ServeltContext,servlet对象可以通过ServletContext来访问容器中的各种资源。
ServletContext接口提供的方法分为以下几种类型:
用于在Webapp范围内存取共享数据的方法。
注:webapp范围具有以下两层含义:
(1) 表示有webapp的生命周期构成的时间段。
(2) 表示在webapp的生命周期内所有web组件的集合。
◆ setAttribute(String name, java.lang.Object object):以键值对的形式,把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。
◆ getAttribute(String name):根据参数给定的属性名,返回一个Object类型的对象。
◆ getAttributeNames():返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。
◆ removeAttribute(String name):根据参数指定的属性名,从servletContext对象中删除匹配的属性。
◆ getContextpath():返回当前webapp的URL入口。
◆ getInitParameter(String name):返回webapp配置文件中匹配的初始化参数值。在web.xml中
◆ getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中
◆ getServletContextName():返回webapp名称。即
◆ getRequestDispatcher(String path):返回一个用于向其他web组件转发请求的RequestDispatcher对象。
◆ getContext(String uripath):根据参数指定的url,返回当前servlet容器中其他web应用的servletContext()对象。
◆ getMajorVersion():返回servlet容器支持的java servlet API 的主版本号。
◆ getMinorVersion():返回servlet容器支持的java Servlet API的次版本号。
◆ getServerInfo():返回servlet容器的名字和版本。
◆ getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实的路径。
◆ getResource(String path):返回一个映射到参数指定的路径的url。
◆ getResourceAsStream(String path):返回一个用于读取参数指定的文件的输入流。(把文件读到输入流中去)
◆ getMimeType(String file):返回参数指定的文件的MIME类型。
◆ log(String msg):向servlet的日志文件中写日志。
◆ log(String message, java.lang.Throwable throwable):向servlet的日志文件中写错误日志,以及异常的堆栈信息。
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
三、ServletConfig详解
Jsp/Servlet容器初始化一个Servlet类型的对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。Jsp/Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig类型的对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与ServletConfig类型的对象建立关联关系。
◆ getInitParameter(String name):根据给定的初始化参数,返回匹配的初始化参数值。
◆ getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中
◆ getServletContext():返回一个servletContext()对象,
◆ getServltName():返回servlet的名字,即web.xml中的相对应的servlet的子元素
Example:
如上,红色标记处为初始化参数,相当于servlet共享参数。
在servlet中:
public class BlogServlet extends HttpServlet {
String first = this.getInitParameter("first");
String last = this.getInitParameter("last");
System.out.println("第一个参数:" + first + "第二个参数:" + last);
}
注:HttpServlet类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,因此在HttpServlet类和GenericServlet类及子类中都可以直接调用ServletConfig接口中的方法。