javaweb之ServletConfig对象和ServletContext域对象以及Servlet的生命周期

一 、Servlet API 的主要接口和类之间的关系图

在这里插入图片描述

二 、Servlet的生命周期

在这里插入图片描述

代码实现Servlet的生命周期

public class MyServlet implements Servlet {

	public MyServlet() {

		System.out.println("MyServlet的构造方法");
	}

	@Override
	public void destroy() {
		System.out.println("执行销毁的方法");
	}

	@Override
	public ServletConfig getServletConfig() {
		System.out.println("执行getServletConfig方法");
		return null;
	}

	@Override
	public String getServletInfo() {
		System.out.println("执行getServletInfo方法");
		return null;
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("执行init方法,自定义");
		//获得xml文件中信息
		//得到Servlet的名字
		String servletName = config.getServletName();
		System.out.println(servletName);
		//得到ServletContext队象
		System.out.println(config.getServletContext());
		
		//得到初始化值
		System.out.println(config.getInitParameter("username"));
		//得到所有的初始化名字
		
		Enumeration<String> name = config.getInitParameterNames();
		while(name.hasMoreElements()) {
			System.out.println(name.nextElement());
		}
	}
	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("执行service方法");
	}

}

输出结果是

MyServlet的构造方法
执行init方法,自定义
MyServlet
org.apache.catalina.core.ApplicationContextFacade@2f0653e2
hengheng
userpass
username
执行service方法

从代码的执行顺序就可以看出servlet的加载顺序,,构造方法最先被调用,init()方法只会执行一次,每一次请求都会调用一次service方法。

总结

1、构造方法,最先被执行,构造方法被执行意味着创建新的实例,且只会被执行一次,意味着Servlet是单例的,在整个Servlet容器中每个具体的Servlet实现类都只有一个实例!

2、init:构造方法之后,马上被执行,且只执行一次,作用是做初始化,虽然构造方法也能做初始化操作,但init(ServletConfig arg0)是带了参数回来的,作用更大,后面在具体讲这个参数。

3、service:被多次调用,每次在浏览器刷新请求都会调用一次service方法,实际用于对请求的响应。

4、destroy:只被调用一次,当前Servlet所在的web应用被卸载前执行,用于释放Servlet占用的计算机资源。

——web.xml中Servlet映射配置中整数,这个配置的整数若为0或正整数时表示web应用启动的时候,自动执行对应的Servlet,整数越小,越优先执行,只执行一次随web应用启动时。若为负数,则会在第一次请求时被执行对象的Servler。

三 、ServletConfig对象

ServletConfig的介绍
容器在初始化一个Servlet时,将为该Servlet创建唯一一个ServletConfig对象,并将这个ServletConfig对象通过init(ServletConfig config)方法传递并保存在此Servlet对象中。
ServletConfig的主要方法
1、String getServletName() 
 -- 获取当前Servlet的属性名,即@WebServlet 的name的属性值,如果没有配置这个属性,则返
回Servlet类的类全名。

2、getServletContext()
返回当前ServletContext()对象

3、getInitParameter(String param)
根据给定的初始化参数名称,返回参数值,若参数不存在,则返回null;

4、getInitParameterNames()
返回一个Enumeration对象,里面包含了所有的初始化参数值
Servlet初始化参数在web。xml文件中的配置
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>//设置初始化参数名
<param-value>123456</param-value>//设置初始化参数值
</init-param>
Servlet初始化参数的获取
//--获取当前Servlet 在web.xml中配置的名称(用的不多,来演示!)
String sName = config.getServletName();
System.out.println("当前Servlet 在web.xml中配置的名称:"+sName);

//--获取当前Servlet中配置的初始化参数(只能获取一个)经常用到,演示!
String value = config.getInitParameter("user");
System.out.println(value);

// --获取当前Servlet中配置的初始化参数(全部获取)经常用到,演示
Enumeration enumration = config.getInitParameterNames();
while(enumration.hasMoreElements()){
String name = (String) enumration.nextElement();
String value = config.getInitParameter(name);
System.out.println(name+":"+value);
}

三 、ServletContext对象

ServletContext的介绍

ServletContext:代表当前web应用(非常重要)

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过
ServletConfig.getServletContext()方法获得ServletContext对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

ServletContext的主要方法
1getInitParameter(String name)
 返回Web应用范围内指定的初始化参数值,在web.xml文件中使用<context-param>元素表示的。
2getInitParameterNames()
 返回Web应用范围内所有的初始化参数值
3setAttribute(String name,Object value)
把一个对象和一个属性名绑定到ServletContext中共享
4、getAttribute(String  name)
根据给定的参数名,返回一个Object类的对象
5、 getContextPath()
返回当前web的根路径

6getServletPath()   获取servlet的映射路径

获取服务器文件资源的方法

7、getRealPath(String path)
根据参数指定的虚拟路径(文件名),返回文件系统中一个真实的路径(绝对路径)

8. getResourceStream(String path)
 返回一个读取参数指定的文件的输出流,参数路径必须以"/"开头

9 getResource(String path)
 返回由path指定的资源路径对应的一个URl对象,参数路径必须以"/"开头
ServletContext的web.xml文件配置

在这里插入图片描述

ServletContext信息的获取
// 获取单个的Context里面的初始化参数
String value1 = context.getInitParameter("username");
String value2 = context.getInitParameter("password");
System.out.println(value1 + ";" + value2);
System.out.println();

// 一次性获取Context里所有的初始化参数
Enumeration enumeration = context.getInitParameterNames();
while (enumeration.hasMoreElements()) {
String name = (String) enumeration.nextElement();
String value = context.getInitParameter(name);
System.out.println(name + ";" + value);
}
ServletContext、加载资源文件
ServletContext提供了getRealPath方法,在这个方法中传入一个路径,这个方法的底层会在传入的路径的前面拼接当前web应用的硬盘路径,从而得到当前资源的硬盘路径。例如: 先在WebRoot的根目录下新建一个专门用了配置信息的文件为config.properties,里面的参数如下:

username=smyhvae
password=007

Properties prop = new Properties(); // 注意导的包是import java.util.Properties;
prop.load(new FileReader(context.getRealPath("config.properties")));
System.out.println(prop.getProperty("username"));
System.out.println(prop.getProperty("password"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值