Servlet和Servlet容器理解(转)

1、ServletContext详解

ServletContext是servlet与servlet容器之间的直接通讯的接口。Servlet容器在启动一个Web应用时,会为它建立一个servletContext对象。每一个web应用有惟一的servletContext对象。同一个web应用的全部servlet对象共享一个serveltContext,servlet对象能够经过它来访问容器中的各类资源。 
servletContext接口提供的方法分为如下几种类型: 
用于在Web应用范围内存取共享数据的方法。 
注:web应用范围具备如下两层含义: 
(1) 表示有web应用的生命周期构成的时间段. 
(2) 表示在web应用的生命周期内全部web组件的集合。 
setAttribute(String name,java.lang.Object object):把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。 
getAttribute(String name):根据参数给定的属性名,返回一个Object类型的对象。 
getAttributeNames():返回一个Enumeration对象,该对象包含了全部存放在ServletContext中的属性名。 
removeAttribute(String name):根据参数指定的属性名,从servletContext对象中删除匹配的属性。 
访问当前Web应用的资源 
getContextpath():返回当前web应用的URL入口。 
getInitParameter(String name):返回web应用方位内的匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>元素表示应用范围内的初始化参数。 
getInitParameterNames():返回一个Enumeration对象。 
getServletContextName():返回web应用的名字。即<web-app>元素中<display-name>元素的值。 
getRequestDispatcher(String path):返回一个用于向其余web组件转发请求的RequestDispatcher对象。 
访问servlet容器的相关信息 
getContext(String uripath):根据参数指定的url,返回当前servlet容器中其余web应用的servletContext()对象。 
反问web容器的相关信息 
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的日志文件中写错误日志,以及异常的堆栈信息。 
ServletContext对象得到几种方式: 
    Javax.servlet.() 
    Javax.servlet.jsp.PageContext.getServletContext() 
    Javax.servlet.ServletConfig.getServletContext()

2、ServletConfig详解

Servlet容器初始化一个servlet对象时,会为这个servlet对象建立一个servletConfig对象。在servletConfig对象中包含了servlet的初始化参数信息。此外,servletConfig对象还与servletContext对象关联。Servlet容器在调用servlet对象的init(ServletConfig config)方法时,会把servletConfig对象当作参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与servletConfig对象创建关联关系。 
servletConfig接口中定义了一下方法: 
getInitParameter(String  name):根据给定的初始化参数,返回匹配的初始化参数值。 
getInitParameterNmes():返回一个Enumeration对象,里面包含了全部的初始化参数。 
getServletContext():返回一个servletContext()对象, 
getServltName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。若是没有配置这个子元素,则返回servlet类的名字。 
例子: 
<servlet> 
<servlet-name>actionServlet</servlet-name> 
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class> 
<load-on-startup>0</load-on-startup> 
<init-param> 
  <param-name>color</param-name> 
  <param-value>red</param-value> 
</init-param> 
<init-param> 
  <param-name>size</param-name> 
  <param-value>16</param-value> 
</init-param> 
</servlet> 
<servlet-mapping> 
<servlet-name>actionServlet</servlet-name> 
<url-pattern>*.do</url-pattern> 
</servlet-mapping> 
如上,红色标记处为初始化参数,至关于公有参数。 
在servlet中:java

  public class UserDateBaseServlet extends HttpServlet{ 
String color = this.getInitParameter("color"); 
String size = this.getInitParameter("size"); 
System.out.println("颜色是:"+color+"字号是:"+size); 

注:HttpServlt类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,所以在HttpServlet类和GenericServlet类及子类中均可以直接调用ServletConfig接口中的方法。web

3、两者区别

在看web.xml配置文件关于环境初始化参数的配置时,发现了ServletConfig与ServletContext这两个对象的应用,因而就写了一个Servlet来体验了一下。apache

  首先从做用范围来讲,ServletConfig做用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,可是该Servlet以外的其余Servlet不能访问;ServletContext做用于某个web应用,即在一个web应用中至关于一个全局对象,在Servlet容器启动时就已经加载,对于不一样的web应用,有不一样的ServletContext。浏览器

  其次,来看一下两者参数的使用。若是一个参数为整个web应用所用,那么就配置为ServletContext参数,以下所示:服务器

  <context-param> 
  <param-name>encoding</param-name> 
  <param-value>gb2312</param-value> 
</context-param>app

  若是一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数,以下所示:jsp

  <servlet> 
  <servlet-name>affice_add</servlet-name> 
  <servlet-class>servlet.Affice_add</servlet-class> 
  <init-param> 
   <param-name>filepath</param-name> 
   <param-value>/webContent/affice</param-value> 
  </init-param> 
</servlet>this

  最后,说明一下参数的获取。访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()便可,而后一样调用getInitParamter()方法就能获取参数。例如对于上面的参数,能够经过以下方法获取各自参数。url

  public class TestServletConfig extends HttpServlet { 
  ServletConfig config;spa

  public void init(ServletConfig config) { 
    this.config=config; 
  }

  public void doGet(HttpServletRequest request,HttpServletResponse response) 
     throws ServletException,IOException { 
    String filepath=(String)config.getInitParameter("filepath"); 
    System.out.println(filepath); 
    String encode=(String)config.getServletContext().getInitParameter("encoding"); 
    System.out.println(encode); 
  }

  public void destroy() {   } } 对上面Servlet编译后,在浏览器中输入 http://localhost:8080/my/TestServletConfig (该连接地址与servlet在webx.xml中的配置有关)后,就能够分别对应输出/WebContent/affice和gb2312

相关文章
相关标签/搜索