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