天天看點

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才能擷取。

<pre name="code" class="html"><context-param>
	<param-name>public-name</param-name>
	<param-value>zhangsan</param-value>
</context-param>

<context-param>
	<param-name>public-sex</param-name>
	<param-value>male</param-value>
</context-param>

<context-param>
	<param-name>public-age</param-name>
	<param-value>20</param-value>
</context-param>

<servlet>
	<servlet-name>AServlet</servlet-name>
	<servlet-class>com.servletcontext.test.AServlet</servlet-class>
	<init-param>
		<param-name>username</param-name>
		<param-value>admin</param-value>
	</init-param>
	<init-param>
		<param-name>password</param-name>
		<param-value>123456</param-value>
	</init-param>
</servlet>

<servlet>
	<servlet-name>BServlet</servlet-name>
	<servlet-class>com.servletcontext.test.BServlet</servlet-class>
	<init-param>
		<param-name>username1</param-name>
		<param-value>admin1</param-value>
	</init-param>
	<init-param>
		<param-name>password1</param-name>
		<param-value>1234567</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>AServlet</servlet-name>
	<url-pattern>/servlet/AServlet</url-pattern>
</servlet-mapping>

<servlet-mapping>
	<servlet-name>BServlet</servlet-name>
	<url-pattern>/servlet/BServlet</url-pattern>
</servlet-mapping>
<!--  
在繼承了HttpServlet抽象類的Servlet子類中,各作用域初始化參數擷取方法:
(1)對于<context-param>...</context-param>中的初始化參數,它是公共的初始化參數,為所有Servlet所共用。擷取方法:
String name=this.getServletContext().getInitParameter("public-name");
String name=this.getServletContext().getInitParameter("public-name");
String name=this.getServletContext().getInitParameter("public-name");
Enumeration e=this.getServletContext().getInitParameterNames();//擷取所有的context-param參數名稱。
(2)對于<servlet><init-param>...</init-param></servlet>中的初始化參數,它們是每個Servlet自己的初始化參數,是以不用使用上下文參數對象ServletContext。
擷取參數值的方法:
String username=this.getInitParameter("username");
String password=this.getInitParameter("password");
Enumeration e=this.getInitParameterNames();//擷取該servlet中所有的初始化參數名稱。
-->
           

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路徑;