在编写servlet过程中,需要用到 ServletConfig、ServletContext对象,对这两种对象的介绍如下:
ServletContext对象:servlet容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据。ServletContext对象是真正的一个全局对象,凡是web容器中的Servlet都可以访问。
servletConfig对象:用于封装servlet的配置信息。从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对servlet自身有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
在servlet中如何获取ServletContext对象和ServletConfig对象,请看下面代码:
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class Servlet1 extends HttpServlet{
@Override
public void init() throws ServletException
{
ServletConfig config = this.getServletConfig();
System.out.println("Servlet1 config=="+config);
System.out.println("Servlet1 间接获取context==" +config.getServletContext() );
System.out.println("Servlet1 直接获取context==" + this.getServletContext());
System.out.println("Servlet1 param_value==" + config.getInitParameter("servlet1_param_name"));
System.out.println("context_value==" + this.getServletContext().getInitParameter("context_param"));
System.out.println("*********************************");
}
@Override
public void service(ServletRequest req, ServletResponse resp)
throws ServletException{
}
@Override
public void destroy() {
}
}
Servlet2的代码:
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class Servlet2 extends HttpServlet {
@Override
public void init() throws ServletException
{
ServletConfig config = this.getServletConfig();
System.out.println("Servlet2 config=="+config);
System.out.println("Servlet2 间接获取context==" +config.getServletContext());
System.out.println("Servlet2 直接获取context==" + this.getServletContext());
System.out.println("Servlet2 param_value==" + config.getInitParameter("servlet2_param_name"));
System.out.println("context_value==" + this.getServletContext().getInitParameter("context_param"));
System.out.println("*********************************");
}
@Override
public void service(ServletRequest req, ServletResponse resp)
throws ServletException{
}
@Override
public void destroy() {
}
}
servlet_1
com.test.servlet.Servlet1
servlet1_param_name
value1
1
servlet_2
com.test.servlet.Servlet2
servlet2_param_name
value2
0
context_param
value3
index.jsp
Servlet2 config==org.apache.catalina.core.StandardWrapperFacade@13d422d
Servlet2 间接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet2 直接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet2 param_value==value2
context_value==value3
*********************************
Servlet1 config==org.apache.catalina.core.StandardWrapperFacade@14683c0
Servlet1 间接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet1 直接获取context==org.apache.catalina.core.ApplicationContextFacade@1123c5f
Servlet1 param_value==value1
context_value==value3
*********************************
通过控制台打印的信息可以得出如下结论:
1、在web.xml配置文件中,对没个servlet的配置里,有一项
servlet_2虽然配置在servlet_1后面,但是它的load-on-startup为0,启动的优先级高于servlet_1,所以servlet_2先启动。
2、获取ServletContext的两种方式,直接获取和间接获取,得到的对象都是同一个。同时在servlet1和servlet2中取得的ServletContext对象都是同一个对象,说明整个web应用都只有一个唯一的ServletContext实例;
3、servlet1与servlet2的serveletConfig对象是不一样的,说明ServletConfig对象的作用范围仅在servlet中。