1、ServletConfig对象
在web.xml中,可以配置一些servlet启动时的初始化参数,当servlet启动时,这些参数就被封装在ServletConfig对象当中。
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>ServletDemo01</servlet-name>
<servlet-class>day1129.servlet01.ServletDemo01</servlet-class>
<!-- 配置初始化 -->
<init-param>
<param-name>name</param-name>
<param-value>Errol</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UFT-8</param-value>
</init-param>
</servlet>
Servlet类的init方法:
public void init(ServletConfig config) throws ServletException {
// Put your code here
this.config = config;//获取初始化参数
}
在Servlet启动时调用init()方法,就会将web.xml配置的初始化参数自动加载到ServletConfig对象当中。
ServletConfig对象通过Servlet对象的getServletConfig()方法获取。
如果我们需要将初始化参数获取出来,就需要用到Enumeration,对config进行遍历。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
sop("doGet:"+i++);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
/*
* 获取初始化参数
*/
String paramUser = this.config.getInitParameter("name");
out.print(paramUser);
out.print("<hr>");
//获取所有初始化参数
Enumeration<String> e = config.getInitParameterNames();
while(e.hasMoreElements()){
String name = e.nextElement();
String value = config.getInitParameter(name);
out.print(name + "=" + value+ "<br>");
}
out.print("<hr>");
out.close();
}
这样,在浏览器上访问这个servlet就可以在页面上输出获取到的初始化参数
2、ServletContext对象,上下文对象
代表当前web应用,web容器在启动是的时候,会对每一个web应用创建一个ServletContext对象,我们需要通过ServletConfig对象来获取ServletContext对象:
ServletContext context = this.getServletConfig().getServletContext();
总结,ServletContext对象的获取
1.在javax.servlet.Filter中直接获取
ServletContext context = config.getServletContext();
2.在HttpServlet中直接获取
this.getServletContext()
3.在其他方法中,通过HttpRequest获得
request.getSession().getServletContext();
ServletContext对象的作用是什么??
1)通过相对路径获取绝对路径
通过ServletContext对象可以获取绝对路径
//获取文件的路径
String filePath = this.getServletContext().getRealPath("中文文件.txt");
2)可以获取容器的附加信息
如web应用初始化参数(看清楚,是web应用的初始化参数,ServletConfig可以获取的是Servlet的初始化参数,虽然都存放在web.xml文件中,但是标签不一样),例子
web.xml文件配置
<!-- Web应用的初始化 -->
<context-param>
<param-name>servlet01</param-name>
<param-value>这里是Servlet01请求</param-value>
</context-param>
<context-param>
<param-name>servlet02</param-name>
<param-value>这里是Servlet02请求</param-value>
</context-param>
Servlet类中可以context初始化参数
//获取web应用的初始化参数
ServletContext context = this.getServletContext();
String contextInitParam = context.getInitParameter("servlet02");
3、多个Servlet通过ServletContext对象实现数据共享
也就是可以将变量设置为全局变量,这里的全局指的是所有的Servlet
例如:
Servlet1
//Context对象可是实现servlet之间的数据共享
String data = "sdofhgaouifhgaoifhidshfiouahef";
ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("DATA", data)
Servlet2
//这里通过context对象可以获共享数据
ServletContext context = this.getServletConfig().getServletContext();
String data = (String)context.getAttribute("DATA");//获取共享数据
out.print("共享数据="+data+ "<hr>");
这里可以发现,在Servlet1中将变量data放到ServletContext对象,在Servlet2中通过ServletContext对象也能得到该变量,所以,ServletContext对象是全局的储存信息的空间,服务器开始, 其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一 个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。