JavaWeb ServletConfig对象和ServletContext对象

139 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

ServletConfig对象

代表当前Servlet在web.xml文件配置信息的对象

1)获取ServletConfig对象

ServletConfig scf=this.getServletConfig()

2)功能

①获取当前servlet的初始化参数
在web.xml文件中的<servlet>标签的内部可以为当前servlet配置0个或者多个初始化参数,可以使用ServletConfig来获取配置的这些初始化参数
             getInitParameter(name)  -->value
             getInitParameterNames()  -->Enumeration
②获取ServletContext对象
ServletConfig scf=this.getServletConfig();
ServletContext sct=scf.getServletContext();

修改Web.xml

参考教程,添加如下内容:

<servlet>
    <servlet-name>ServletConfigDemo</servlet-name>
    <servlet-class>servletconfig.ServletConfigDemo</servlet-class>
    <!-- 给当前ServletConfigDemo配置初始化参数,这些初始化参数可以通过ServletConfig来获取 -->
    <init-param>
         <param-name>pwd</param-name>
         <param-value>123456</param-value>
    </init-param>
    <init-param>
         <param-name>url</param-name>
         <param-value>www.baidu.com</param-value>
    </init-param>
    <init-param>
    	<param-name>id</param-name>
    	<param-value>1001</param-value>
    </init-param>
  </servlet>
package servletconfig;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示ServletConfig对象的使用
public class ServletConfigDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//在web.xml文件中的<servlet>标签中配置了一些初始化参数
		//使用ServletConfig对象来获取这些初始化参数
		
		//获得ServletConfig对象
		ServletConfig scf=this.getServletConfig();
		
		//该方法通过配置的<param-name>的值获取<param-value>的值
		/*
		String strPwd=scf.getInitParameter("pwd");
		String strUrl=scf.getInitParameter("url");
		String strId=scf.getInitParameter("id");
		System.out.println(strPwd+" "+strUrl+" "+strId);
		*/
		
		//获取初始化参数中所有的<param-name>的值
		Enumeration<String> params=scf.getInitParameterNames();
		//使用循环将params中所有的值取出
		while(params.hasMoreElements()){
			//System.out.println(params.nextElement());
			String name=params.nextElement();
			String value=scf.getInitParameter(name);
			System.out.println(name+","+value);
		}
		/*
		 * 
		 * id,1001
           pwd,123456
           url,www.baidu.com

		 * 
		 */
		
		
		//②获取ServletContext对象
		ServletContext sct=scf.getServletContext();
		

		
	}

}

ServletContext对象

代表的是当前web应用(web项目)对象

在web应用被加载以后,服务器会立刻创建出代表当前web应用的ServletContext对象,创建后对象会一直驻留在内存中,直到服务器关闭或者web应用移出服务器为止,随着web应用的销毁,ServletContext对象也会跟着销毁。

1)获取ServletContext对象

方法一:先获得ServletConfig,然后通过ServletConfig
在获得ServletContext。
ServletConfig scf=this.getServletConfig();
ServletContext sct=scf.getServletContext();
方法二:通过this直接获取
          ServletContext sct=this.getServletContext();

2)ServletContext中的方法

方法一

	getInitParameter(String name) ---->value
	根据name来获得value的值
	getInitParameterNames()  ---->Enumeration
	获得所有的name值
package servletcontext;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示ServletContext对象的使用
public class ServletContextDemo extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1、获取ServletContext对象
		//方法一:通过ServletConfig来获取
		ServletConfig scf=this.getServletConfig();
		ServletContext sct=scf.getServletContext();
		
		//方法二:通过this直接获取
		ServletContext sct=this.getServletContext();
		
		//根据name来获得value
		String s1=sct.getInitParameter("data1");
		String s2=sct.getInitParameter("data2");
		System.out.println(s1+" "+s2);
		
		//获得所有的name的值
		Enumeration<String> ns=sct.getInitParameterNames();
		while(ns.hasMoreElements()){
			String name=ns.nextElement();
			String value=sct.getInitParameter(name);
			System.out.println(name+","+value);
		}
		
	}
	
}

方法二

	ServletContext对象也是一个域对象,利用这个对象可以在整个	web应用内实现资源的共享
	setAttribute(String name, Object obj)
	getAttribute(String name)  --->Object obj
package servletcontext;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示ServletContext作为域对象的功能:实现范围内的资源共享
public class ServletContextDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("我是ServletContextDemo1...");
		
		/*
		//复习:使用request域对象,request对象的作用域是一次请求中的范围,
		//只要在一次请求中的范围就可以实现资源的共享,否则资源无法实现共享
		request.setAttribute("a", 1);
		//同一个Servlet类中,能够获取到request域对象存储的值(同一个Servlet类上下依次执行,是同一个请求)
		Integer strA=(Integer)request.getAttribute("a");
		System.out.println(strA);//1
		//通过转发,由ServletContextDemo1转发跳转到ServletContextDemo2
		//如果是转发,就是一次请求,就能使用request域对象实现资源的共享
		RequestDispatcher rd=request.getRequestDispatcher("context2");
		rd.forward(request, response);
		*/
		
		//使用ServletContext域对象:ServletContext对象的最用是整个web应用
		//获取ServletContext对象
		ServletContext sct=this.getServletContext();
		//往ServletContext域对象中存储数据
		sct.setAttribute("b", 2);
		Date time=new Date();
		System.out.println("time:"+time);
		sct.setAttribute("t", time);
		//同一个Servlet中,ServletContext可以实现资源共享
		Integer itgB=(Integer)sct.getAttribute("b");
		System.out.println("context1中的itgB的值为:"+itgB);
		//通过转发技术,由ServletContextDemo1跳转到ServletContextDemo2
		//RequestDispatcher rd=request.getRequestDispatcher("context2");
		//rd.forward(request, response);
		
	}

}

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示从域对象中获取值
//获取从ServletContextDemo1中存储的值
public class ServletContextDemo2 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("我是ServletContextDemo2....");
		//从request域对象中获取数据
		/*
		Integer itgA=(Integer)request.getAttribute("a");
		System.out.println(itgA);
		*/
		
		//从ServletContext域对象中获取数据
		//获得ServletContext对象
		ServletContext sct=this.getServletContext();
		Integer itgB=(Integer)sct.getAttribute("b");
		System.out.println("context2中的itgB的值为:"+itgB);
		Date date=(Date)sct.getAttribute("t");
		System.out.println(date);
	
	}

}

方法三

	//获取web资源文件的路径
	String path=sct.getRealPath(“xx文件”)
	获得的是一个绝对路径,传入一个相对于web应用跟目录的资源文件路径,这个方法会在传入的路径前面动态的拼接上当前web应用跟目录的磁盘路径,这种路径称为动态获取的路径,换个环境,也能够正确的获取路径。
package servletcontext;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//演示ServletContext来获取资源文件的路径
public class ServletContextDemo3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取ServletContext对象
		ServletContext sct=this.getServletContext();
		//()里设置的是资源文件,该方法返回该资源文件对应的动态路径
		String path=sct.getRealPath("/aa.txt");
		System.out.println(path);
		//C:\Users\qingd\mywork\tomcat\apache-tomcat-7.0.68\webapps     tomcat服务器的磁盘路径
		//\servlet   web项目名
		//\aa.txt    资源文件名
	}
}