天天看点

ServletContext ------- ServletContext的getServletContext()获取ServletContext对象

研究javax.servlet.ServletContext接口

    1、javax.servlet.ServletContext是一个接口

    2、javax.servlet.ServletContext是Servlet规范中的一员

    3、apache Tomcat 服务器对ServletContext接口的实现类完整类名:

org.apache.catalina.core.ApplicationContextFacade
        package org.apache.catalina.core;
        public class ApplicationContextFacade implements javax.servlet.ServletContext{
        
        }
        程序员不需要关心实现类,还是面向ServletContext接口编程。
           

    4、ServletContext是什么?

        * ServletContext对象被翻译为“Servlet对象的上下文对象”。

        * Servlet上下文是所有的Servlet对象共享的一个四周环境对象。

    5、在同一个webapp中,所有的Servlet对象共享一个ServletContext对象。

    6、ServletContext对象在web服务器启动阶段被创建,在web服务器关闭的时候被销毁,生命周期最长的一个对象。

    ServletContext对象在web服务器启动阶段解析web.xml文件的时候被创建。

    7、一个webapp对应一个ServletContext对象。

    8、ServletContext在开发中能干什么?

        * ServletContext对象在webapp中只有一个。所有Servlet对象共享,也可以看做是所有用户共享的一个对象。

        * ServletContext对象中适合存放什么数据?

            - 所有用户共享的数据(不是用户共享的数据不适合放到一个共享的环境当中)

            - 少的数据量(数据量庞大会占用大量的内存空间,影响效率)

            - 不被修改的数据(经常修改的数据不适合放到该环境中,因为有线程安全隐患)

            注意:当以上的条件全部满足之后,数据可以存放到该环境当中,这个环境本身就是一种缓存机制, 没有必要每一次都去连接数据库,连接数据库是需要频繁的IO操作的,减少IO操作需要使用缓存解决方案,可以大大提高程序的执行效率。

    9、ServletContext通常变量名叫做:application

        ServletContext application;

        application翻译为:应用

        一个应用只有一个ServletContext对象。

        ServletContext对象是一个应用级别的对象。

    10、ServletContext接口中常用的方法:

        -void setAttribute(String name, Object object)  //map.put(key,value);

        -Object getAttribute(String name)               //Object value = map.get(key);

        -void removeAttribute(String name)                 //map.remove(key);

        -Enumeration getInitParameterNames() 获取上下文初始化参数的name

        -String getInitParameter(String name) 通过上下文初始化参数的name获取value

<!-- 上下文初始化参数 -->
            <!-- 以下的配置信息被自动封装到ServletContext对象当中 -->
            <!-- 全局配置,这里的配置信息,在所有的Servlet中都可以访问 -->
            <context-param>
                <param-name>user</param-name>
                <param-value>zhangsan</param-value>
            </context-param>
            <context-param>
                <param-name>password</param-name>
                <param-value>123</param-value>
            </context-param>
           

        -String getRealPath(String path) 获取文件的绝对路径

ServletContextDemo代码如下:

package com.servletConfig;

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

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletContextDemo implements Servlet {
	
	//实例变量
	private ServletConfig config;
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		//将局部变量config赋值给实例变量config
		this.config = config;
	}

	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		//获取ServletContext对象
		ServletContext application = config.getServletContext();
		//[email protected]
		System.out.println("application = " + application);
		
		
		//获取上下文初始化参数配置信息
		Enumeration<String> contextNames = application.getInitParameterNames();
		while(contextNames.hasMoreElements()){
			String name = contextNames.nextElement();
			String value = application.getInitParameter(name);
			System.out.println("ServletContext======" + name + " = " + value);
		}
		
		//获取文件绝对路径
		//注意:路径在写的时候不需要以“/”开始,但是从WebRoot文件夹下出发
		String realPath = application.getRealPath("index.html");
		System.out.println(realPath); //D:\tomcat7\tomcat7\webapps\hello\index.html
		
		//向ServletContext对象中或者说向application范围中绑定一个数据,并起名
		application.setAttribute("fdsafdsaf", "jojio");
		
		// 【注:另一个Servlet实例】 从应用范围当中或者说从ServletContext范围当中通过name读取某个绑定的数据
		Object obj = application.getAttribute("fdsafdsaf");
		//将取出的对象输出到浏览器中
		response.getWriter().print(obj.toString());
		
	}
	
	@Override
	public void destroy() {
	}

	//子类使用该方法可以获取到ServletConfig
	@Override
	public ServletConfig getServletConfig() {
		return config;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

}
           

web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	
	<!-- 上下文初始化参数 -->
	<!-- 以下的配置信息被自动封装到ServletContext对象当中 -->
	<!-- 全局配置,这里的配置信息,在所有的Servlet中都可以访问 -->
	<context-param>
		<param-name>user</param-name>
		<param-value>admin</param-value>
	</context-param>
	<context-param>
		<param-name>password</param-name>
		<param-value>112233</param-value>
	</context-param>

	<servlet>
		<servlet-name>b</servlet-name>
		<servlet-class>com.servletConfig.ServletContextDemo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>b</servlet-name>
		<url-pattern>/b</url-pattern>
	</servlet-mapping>
	
</web-app>
           

希望对你有帮助,祝你有一个好心情,加油!

若有错误、不全、可优化的点,欢迎纠正与补充!

继续阅读