天天看點

web基礎day10ServletCofig和ServletContext與ajax

ServletCofig和ServletContext與ajax

其實09與10期間還有一個網頁項目,因為還沒做完,暫時就不發了

  1. ServletConfig

    代表web.xml中目前servlet的初始化配置資訊的對象。

    在每一個servlet身上的注冊servlet标簽中都可以添加一些初始化配置資訊參數,這些參數可以在通路時,通過ServletConfig擷取。

    a. 功能一:擷取初始化配置資訊

    i. 擷取方式:

    1) 重寫init方法,擷取ServletConfig對象。雖然可以得到,但是它是一個局部變量,如果要在全局操作,則需要将其轉換為全局變量。并且若有多個servlet都需要擷取初始化配置資訊,多次重寫init方法,十分不便。不推薦使用。

    2) 通過目前對象調用getServletConfig()方法,可以直接擷取一個ServletConfig對象,并且可以在任意的位置調用。

    ii. 擷取ServletConfig對象的api

    this.getServletConfig()

    iii. 擷取初始化參數的api

    this.getServletConfig().getInitParameter(String name)

    iv. 代碼實作

    1) 建立SConfigDemo.java

    import java.io.IOException;
     			
     			import javax.servlet.ServletConfig;
     			import javax.servlet.ServletException;
     			import javax.servlet.http.HttpServlet;
     			import javax.servlet.http.HttpServletRequest;
     			import javax.servlet.http.HttpServletResponse;
     			//使用方法直接産生一個ServletConfig對象
     			public class SConfigDemo2 extends HttpServlet {
     			
     			        public void doGet(HttpServletRequest request, HttpServletResponse response)
     			                throws ServletException, IOException {
     			                ServletConfig config = this.getServletConfig();
     			                String driver = config.getInitParameter("driver");
     			                //擷取第二個初始化配置資訊
     			                String url = config.getInitParameter("url");
     			                System.out.println("driver:"+driver+">>url:"+url);
     			        }
     			
     			        public void doPost(HttpServletRequest request, HttpServletResponse response)
     			                throws ServletException, IOException {
     			                doGet(request, response);
     			
     			        }
     			
     			}
     		2) 修改web.xml檔案
     			 <servlet>
     			    <servlet-name>SConfigDemo2</servlet-name>
     			    <servlet-class>cn.tedu.SConfig.SConfigDemo2</servlet-class>
     			 	<init-param>
     			  		<param-name>driver</param-name>
     			  		<param-value>com.mysql.jdbc.Driver</param-value>
     			  	</init-param>
     			  	<init-param>
     			  		<param-name>url</param-name>
     			  		<param-value>localhost:3306/mydb1</param-value>
     			  	</init-param>
     			  </servlet>
     	v. 可以在每一個servlet身上添加多個初始化配置資訊參數。通過來初始化參數名稱,依次擷取。
     	vi. 注意:每一個servlet隻能擷取目前servlet身上的初始化配置參數。其他的servlet無法擷取。
     b. 功能二--擷取ServletContext對象
     	this.getServletConfig().getServletContext()
               
    1. ServletContext對象

      代表目前web應用的對象

      若有多個Servlet同時需要同一份配置資訊,可以把這些資訊配置為一個全局的配置資訊,這樣web應用範圍内的全部servlet都可以讀取到。

      a. 擷取ServletContext對象

      this.getServletConfig().getServletContext()

      this.getServletContext()

      b. 功能一:擷取全局初始化配置資訊

      SerlvetContext.getInitParameter(String name)

      i. 代碼實作:

      import java.io.IOException;
       	
       	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 SContextDemo1 extends HttpServlet {
       	
       	        public void doGet(HttpServletRequest request, HttpServletResponse response)
       	                throws ServletException, IOException {
       	//		擷取ServletContext對象
       	        ServletContext sc = this.getServletConfig().getServletContext();
       	        ServletContext sc1 = this.getServletContext();
       	        //擷取全局配置資訊
       	//		String name = sc.getInitParameter("name");
       	//		System.out.println("name:"+name);
       	        String name = sc1.getInitParameter("name");
       	        System.out.println("sc1:name:"+name);
       	        }
       	
       	        public void doPost(HttpServletRequest request, HttpServletResponse response)
       	                throws ServletException, IOException {
       	                doGet(request, response);
       	
       	        }
       	
       	}
       ii. 全局配置資訊
       	<!-- 目前web應用的全局配置資訊 -->
       	  <context-param>
       	  	<param-name>name</param-name>
       	  	<param-value>value</param-value>
       	  </context-param>
                 

      c. 功能二:作為域對象使用

      i. 域對象:如果一個對象身上有一個可以被看見的範圍,在這個範圍内利用對象身上的map實作資料的共享,那麼這個對象就可以稱之為域對象。

      ii. 域對象的API:

      setAttribute(String name,Object obj) 設定域屬性

      getAttribute(String name) 擷取域屬性

      removeAttribute(String name) 删除域屬性

      getAttributeNames() 擷取全部域屬性的名稱

      iii. 生命周期

      随着web應用的加載,ServletContext對象建立。

      随着web應用的銷毀,ServletContext對象銷毀。

      iv. 作用範圍

      整個web應用。

      v. 主要功能

      在整個web應用的範圍内共享資料。

      1) 代碼實作

      a) 建立ServletContextDemo2.java

      import java.io.IOException;
       			
       			import javax.servlet.ServletContext;
       			import javax.servlet.ServletException;
       			import javax.servlet.http.HttpServlet;
       			import javax.servlet.http.HttpServletRequest;
       			import javax.servlet.http.HttpServletResponse;
       			//作為域對象使用--在web應用範圍内共享資料
       			public class SContextDemo2 extends HttpServlet {
       			
       			        public void doGet(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                //1.擷取代表web應用的域對象
       			                ServletContext sc = this.getServletContext();	
       			                //2.向域中設定域屬性
       			                sc.setAttribute("name", "曹洋");
       			        }
       			
       			        public void doPost(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                doGet(request, response);
       			
       			        }
       			
       			}
       		b) 修改ServletContextDemo1:
       			package cn.tedu.SContext;
       			
       			import java.io.IOException;
       			
       			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 SContextDemo1 extends HttpServlet {
       			
       			        public void doGet(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			        
       			        
       			        //讀取web域屬性
       			        ServletContext sc = this.getServletContext();
       			        String name = (String) sc.getAttribute("name");
       			        System.out.println("name:"+name);
       			        
       			        }
       			
       			        public void doPost(HttpServletRequest request, HttpServletResponse response)
       			                throws ServletException, IOException {
       			                doGet(request, response);
       			
       			        }
       			
       			}
                 
    2. 功能三–擷取資源路徑

      a. 相對路徑

      conf.properties

      直接書寫要擷取的資源路徑名稱,再通過File讀取,發現讀取的路徑結果,是tomcat啟動的目錄路徑,這個路徑是錯誤,是以在讀取檔案的時候,不能夠直接書寫某一個檔案的相對路徑。

      b. 絕對路徑

      /conf.properties

      使用絕對路徑擷取資源路徑名稱,再通過File讀取,讀取結果為盤符加上檔案名稱,從磁盤的根目錄尋找對應路徑的檔案,這種檔案讀取路徑也是錯誤的。是以在讀取檔案時,不能直接書寫絕對路徑。

      c. 全路徑

      書寫從盤符到檔案的全路徑名稱,的确可以擷取到指定路徑的檔案,但是如果路徑稍作修改,擷取存放檔案的路徑發生改變,則所有用到全路徑的位置都需要修改,十分不便。是以盡管可以得到正确的路徑,也不推薦使用。

      d. ServletContext擷取路徑

      可以擷取到從盤符到web應用名稱的全路徑。在getRealPath()中添加上web應用内的檔案相對路徑,即可擷取到目前檔案的全路徑名稱。這種擷取方式擷取到的路徑是正确的,并且也是動态擷取的(如果路徑修改,此處擷取的路徑也會跟着修改)。是以推薦使用這種形式。

      e. 通過類加載器擷取檔案路徑

      使用類的位元組碼,擷取類加載器,再擷取src目錄,最後讀取目錄中的某一個檔案。這種讀取方式可以擷取到盤符到目前檔案的全路徑,而且是全部動态擷取,可以便捷的得到檔案路徑。是以推薦使用這種方式來擷取檔案路徑名稱。

      ServletContext.class.getClassLoader().getResource(“fileName”).getPath()

    3. ajax概述

      AJAX asynchronous js and xml: 異步的js和xml

      AJAX是一個異步請求的操作,可以在頁面大部分内不變情況下完成局部重新整理的操作。

      ajax是通過js來實作的。其中異步請求發送的資料是xml格式的資料。

      随着技術的發展,ajax發送和接收的資料格式有以下幾種:

      xml

      json 字元串

      text 純文字

      ajaj -> aj

    4. ajax運作原理

      同步互動:

      請求發出,浏覽器必須得到響應結果之後,才可以繼續發送下一次的請求,在等待過程中,浏覽器不能進行任何操作。

      異步互動:

      請求發出,浏覽器可以繼續進行更多的操作,不必等待響應結果,仍然可以發送更多的請求。伺服器會根據每一個請求依次作出響應。浏覽器在這個過程中,可以任意操作。

      a. 實踐場景:

      異步:

      搜尋框 、注冊–使用者名是否存在校驗

      同步:

      百度搜尋框後的按鈕

      b. 異步請求

      優點:

      使用者體驗較好。減少伺服器通路壓力。

      缺點:

      增加伺服器通路壓力。

    5. AJAX實作

      a. .JavaScript實作AJAX(隻需四步)

      i. 第一步, 擷取XMLHttpRequest對象

      var xmlHttp = ajaxFunction();

      function ajaxFunction(){

      var xmlHttp;

      try{

      //現代浏覽器(IE7+、Firefox、Chrome、Safari 和 Opera)都有内建的 XMLHttpRequest 對象

      xmlHttp = new XMLHttpRequest();

      }catch(e){

      try{

      //IE6.0

      xmlHttp = new ActiveXObject(“Msxml2.XMLHTTP”);

      }catch(e){

      try{

      //IE5.0及更早版本

      xmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);

      }catch(e){

      alert("…");

      throw e;

      }

      }

      }

      return xmlHttp;

      }

      第二步, 打開與伺服器的連接配接
      
       xmlHttp.open(method, url, async);
       	> method: 請求方式, 可以是GET或POST
       	> url: 所要通路的伺服器中資源的路徑 如: /Day10/servlet/AServlet
       	> async: 是否為異步傳輸, true 表示為異步傳輸 一般都是true
       iii. 第三步, 發送請求
       xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");	//通知伺服器發送的資料是請求參數
       xmlHttp.send("xxx"); //注意, 如果不給參數可能會造成部分浏覽器無法發送請求
       > 參數: 
       	如果是GET請求, 可以是null, 因為GET送出參數會拼接在url後面
       	如果是POST請求, 傳入的就是請求參數
       		"username=張飛&psw=123"
       iv. 第四步, 注冊監聽
       > 在XMLHttpRequest對象的一個事件上注冊監聽器: 	
       	onreadystatechange
       > 一共有五個狀态:(xmlHttp.readyState)
       	0狀态: 表示剛建立XMLHttpRequest對象, 還未調用open()方法
       	1狀态: 表示剛調用open()方法, 但是還沒有調用send()方法發送請求 
       	2狀态: 調用完了send()方法了, 請求已經開始
       	3狀态: 伺服器已經開始響應, 但是不代表響應結束 
       	4狀态: 伺服器響應結束!(通常我們隻關心這個狀态) 
       > 擷取xmlHttp對象的狀态:
       	var state = xmlHttp.readyState;//可能得到0, 1, 2, 3, 4 
       > 擷取伺服器響應的狀态碼
       	var status = xmlHttp.status;
       > 擷取伺服器響應的内容
       	var data = xmlHttp.responseText;//得到伺服器響應的文本格式的資料  
       	xmlHttp.onreadystatechange = function(){
       		//當伺服器已經處理完請求之後
       		if(xmlHttp.readyState == 4){
       			if( xmlHttp.status == 200 ){
       				//擷取響應資料
       				var result = xmlHttp.responseText;
       				result = xmlHttp.responseXML;
       			}
       		}
       	}