JavaWeb---ServletContext

创建Servlet的三种方法:

1,实现Servlet接口;

2,继承GenericServlet抽象类;

3,继承HttpServlet抽象类。

我们一般使用的是第三种方法,因为开发应用时一般是编写基于HTTP协议的Servlet类。

/************************************************************************************************************/

ServletContext非常非常重要

一个项目只有一个ServletContext对象。

我们可以在N多个Servlet中获取这个唯一的对象,使用它可以给多个Servlet传递数据,即这个对象是所有Servlet的快递员,完成数据的共享。

这个对象在Tomcat启动是就被创建,在Tomcat关闭时才会死去。生命周期很长。

1.ServletContext概述

服务器会为每一个应用创建一个ServletContext对象:

--》ServletContext对象的创建是在服务器启动时完成的;

--》ServletContext对象的销毁是在服务器关闭时完成的。

ServletContext对象的作用是在整个Web应用的动态资源之间共享数据。例如在AServlet中向ServletContext对象中保存一个值,然后再BServlet中就可以获取这个值,这就是共享数据了。


2.获取ServletContext对象

(1)在Servlet中获取ServletContext对象:

在void init(ServletConfig config)中:ServletContext context=config.getServletContext();

 即ServletConfig类中的getServletContext()方法可以获取ServletContext对象;

package com.ch02.myservlet;

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

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletContextTest implements Servlet {

	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		ServletContext context=config.getServletContext();
	}

	public void service(ServletRequest req, ServletResponse res)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		
	}
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public ServletConfig getServletConfig() {
		// TODO Auto-generated method stub
		return null;
	}

	public String getServletInfo() {
		// TODO Auto-generated method stub
		return null;
	}

}


(2)在GenericServlet或HttpServlet中获取ServletContext对象:

GenericServlet中有getServletContext()方法,所以可以直接使用this.getServletContext()来获取;

package com.ch02.myservlet;

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;

public class ServletContextByHttpServlet extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

			ServletContext context=this.getServletContext();
	}

}

(3)其他方法:

可以通过HttpSession对象的getServletContext()方法获取。

可以通过ServletContextEvent对象的getgetServletContext()方法来获取。


3.域对象的功能

域对象就是用来在多个Servlet中传递数据

域对象必须要有存数据的功能;

域对象必须要有取数据的功能;

域对象内部其实有一个Map,多个键值对,键不能相同。

ServletContext是JavaWeb四大域对象之一:

四大与对象分别是:PageContext(page)、ServletRequest(request)、HttpSession(session)、ServletContext(application)

所有与对象都有寻去数据的功能,因为与对象内部有一个Map,用来存储数据,下面是ServletContext对象用来操作数据的方法:

(1)void setAttribute(String name,Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute("xxx","XXX"),在ServletContext中保存一个域属性,域属性的名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用了相同的name,那么会覆盖上一次的值,这种特性与Map相同。

(2)Object getAttribute(String name):用来获取ServletContext中的数据,当前在获取值前需要先去存储才行,例如String value=(String)servletContext.getAttribute("xxx");获取名为xxx的域属性。

(3)void removeAttribute(String name):用来移除ServletContext中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做。

(4)Enumeration getAttributeNames():获取所有域属性的名称。


4.获取应用初始化参数

(1)Servlet也可以获取Servlet初始化参数,但它是局部的参数,也就是说一个Servlet只能获取自己的初始化参数,不能获取别人的,即初始化参数只为一个Servlet准备!

(2)可以配置公共的初始化参数,为所有Servlet而用。这需要使用ServletContext才能获取。


	public-name
	zhangsan



	public-sex
	male



	public-age
	20



	AServlet
	com.servletcontext.test.AServlet
	
		username
		admin
	
	
		password
		123456
	



	BServlet
	com.servletcontext.test.BServlet
	
		username1
		admin1
	
	
		password1
		1234567
	



	AServlet
	/servlet/AServlet



	BServlet
	/servlet/BServlet



 5.获取资源相关方法 
  

(1)获取真实路径,得到的是有盘符的路径

可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源,就可以使用ServletContext来获取。

--》获取a.txt的真是路径:String realPath=servletContext.getRealPath("/a.txt"),realPath的值为a.txt文件的绝对路径:F:\tomcat6\webapps\hello\a.txt;

(2)获取资源流

不仅可以通过servletContext获取资源的路径,还可以通过ServletContext获取资源流,即把资源以输入流的方式获取。

--》获取a.txt资源流:InputStream in=ServletContext。getResourceStream("/a.txt");

(3)获取指定目录下的所有资源路径

使用ServletContext获取指定目录下的所有资源路径,例如获取/WEB-INF下的所有资源的路径。

Set set=context.getResourcePaths("/WEB-INF");

注意,本方法必须以“/”开头!!!

6.获取类路径下资源

获取类路径资源,类路径对一个JavaWeb项目而言,就是/WEB-INF/classes/WEB-INF/lib/每个jar包!

--》Class

--》ClassLoader

获取类路径下的资源,对于JavaWeb应用而言,就是获取classes目录下的资源。

		InputStream in = this.getClass().getResourceAsStream("/xxx.txt");
		System.out.println(IOUtils.toString(in));
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("xxx.txt");
		System.out.println(IOUtils.toString(in));

 --》Class类的getResourceAsStream(Stringpath):

  路径以“/”开头,相对classes路径;

  路径不以“/”开头,相对当前class文件所有路径,例如在cn.itcast.servlet.MyServlet中执行,那么相对/classes/cn/itcast/servlet/路径;

--》 ClassLoader类的getResourceAsStream(Stringpath):

  相对classes路径;




你可能感兴趣的:(java,javaWeb,ServletContext)