WEB容器在啟動(dòng)時(shí),它會(huì)為每個(gè)WEB應(yīng)用程序都創(chuàng)建一個(gè)對(duì)應(yīng)的ServletContext對(duì)象,它代表當(dāng)前web應(yīng)用。 ServletConfig對(duì)象中維護(hù)了ServletContext對(duì)象的引用,開發(fā)人員在編寫servlet時(shí),可以通過ServletConfig.getServletContext方法獲得ServletContext對(duì)象。 由于一個(gè)WEB應(yīng)用中的所有Servlet共享同一個(gè)ServletContext對(duì)象,因此Servlet對(duì)象之間可以通過ServletContext對(duì)象來實(shí)現(xiàn)通訊。ServletContext對(duì)象通常也被稱之為context域?qū)ο蟆? 1.多個(gè)Servlet通過ServletContext對(duì)象實(shí)現(xiàn)數(shù)據(jù)共享。 在InitServlet的Service方法中利用ServletContext對(duì)象存入需要共享的數(shù)據(jù) /*獲取ServletContext對(duì)象*/ ServletContext context = this.getServletContext(); //存入共享的數(shù)據(jù) context.setAttribute("name", "haha"); 在其它的Servlet中利用ServletContext對(duì)象獲取共享的數(shù)據(jù) /*獲取ServletContext對(duì)象*/ ServletContext context = this.getServletContext(); //獲取共享的數(shù)據(jù) String name = context.getAttribute("name"); System.out.println("共享的內(nèi)容值是:"+name); 2.獲取WEB應(yīng)用的初始化參數(shù)。 在web.xml文件中配置需要初始化的參數(shù)信息。 <web-app> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql://localhost:3306/4g</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>1314qr</param-value> </context-param> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> </web-app> 在DemoServlet的doPost方法中測(cè)試獲取初始化參數(shù)的步驟如下: /*獲取ServletContext對(duì)象*/ ServletContext context = this.getServletContext(); /*獲取初始化參數(shù)*/ //獲取指定名稱的初始化參數(shù) String url = context.getInitParameter("url"); //獲取web.xml文件中所有的初始化應(yīng)用參數(shù) Enumeration<String> enumer = context.getInitParameterNames(); while(enumer.hasMoreElements()){ String name = enumer.nextElement(); String value = context.getInitParameter(name); System.out.println(name+"=========="+value); } 2.實(shí)現(xiàn)Servlet的轉(zhuǎn)發(fā): 在測(cè)試的Servlet中實(shí)現(xiàn)轉(zhuǎn)發(fā)的步驟如下: /*要利用ServletContext對(duì)象實(shí)現(xiàn)轉(zhuǎn)發(fā)獲取對(duì)象*/ ServletContext context = this.getServletContext(); //在request對(duì)象中存入name屬性 request.setAttribute("name", "haha"); /*根據(jù)轉(zhuǎn)發(fā)的地址獲取 RequestDispatcher對(duì)象*/ RequestDispatcher rd = context.getRequestDispatcher("/index.jsp"); //調(diào)用轉(zhuǎn)發(fā)方法 以下采用任意方法即可 rd.forward(request, response); //rd.include(request, response); 注意:forward與include的區(qū)別 forward方法是把請(qǐng)求的內(nèi)容轉(zhuǎn)發(fā)到另外的一個(gè)servlet.而include是把另一個(gè)servlet處理過后的內(nèi)容拿過來. (forward方法調(diào)用后在響應(yīng)中的沒有提交的內(nèi)容被自動(dòng)消除。將請(qǐng)求轉(zhuǎn)發(fā)給其他的Servlet后,由 被調(diào)用的Servlet負(fù)責(zé)對(duì)請(qǐng)求做出響應(yīng),而原先Servlet的執(zhí)行則終止。 include方法使原先的Servlet和轉(zhuǎn)發(fā)到的Servlet都可以輸出響應(yīng)信息,即原先的Servlet還可以繼續(xù)輸出響應(yīng)信息) 3.利用ServletContext對(duì)象讀取資源文件。 讀取資源文件(properties文件(屬性文件))的三種方式 配置的properties的內(nèi)容如下: url=jdbc\:mysql\://localhost\:3306/3g ; user=root; password=root; 獲取實(shí)現(xiàn)的代碼如下: /*獲取ServletContext對(duì)象*/ ServletContext context = this.getServletContext(); //第一種方式 URL url = context.getResource("WEB-INF/classes/db.properties"); InputStream is = url.openStream(); //第二種方式 /*讀取db.properties文件*/ String path =context.getRealPath("WEB-INF/classes/db.properties"); /*根據(jù)文件的路徑 構(gòu)建文件對(duì)象*/ File file = new File(path); /*根據(jù)file文件對(duì)象 創(chuàng)建輸入流*/ InputStream is = new FileInputStream(file); //第三種方式 InputStream is = context.getResourceAsStream("WEB-INF/classes/db.properties "); 以三種方式任意一種可以: /*解析properties的文件*/ Properties prop = new Properties(); //從輸入流中讀取屬性列表(鍵和元素對(duì))。 prop.load(is); Set<String> set = prop.stringPropertyNames(); //遍歷set集合 Iterator<String> it = set.iterator(); while(it.hasNext()){ String key = it.next(); String value = prop.getProperty(key); System.out.println(key+"-----"+value); } |
|