ServletCofig和ServletContext與ajax
其實09與10期間還有一個網頁項目,因為還沒做完,暫時就不發了
-
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()
-
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); } }
-
功能三–擷取資源路徑
a. 相對路徑
conf.properties
直接書寫要擷取的資源路徑名稱,再通過File讀取,發現讀取的路徑結果,是tomcat啟動的目錄路徑,這個路徑是錯誤,是以在讀取檔案的時候,不能夠直接書寫某一個檔案的相對路徑。
b. 絕對路徑
/conf.properties
使用絕對路徑擷取資源路徑名稱,再通過File讀取,讀取結果為盤符加上檔案名稱,從磁盤的根目錄尋找對應路徑的檔案,這種檔案讀取路徑也是錯誤的。是以在讀取檔案時,不能直接書寫絕對路徑。
c. 全路徑
書寫從盤符到檔案的全路徑名稱,的确可以擷取到指定路徑的檔案,但是如果路徑稍作修改,擷取存放檔案的路徑發生改變,則所有用到全路徑的位置都需要修改,十分不便。是以盡管可以得到正确的路徑,也不推薦使用。
d. ServletContext擷取路徑
可以擷取到從盤符到web應用名稱的全路徑。在getRealPath()中添加上web應用内的檔案相對路徑,即可擷取到目前檔案的全路徑名稱。這種擷取方式擷取到的路徑是正确的,并且也是動态擷取的(如果路徑修改,此處擷取的路徑也會跟着修改)。是以推薦使用這種形式。
e. 通過類加載器擷取檔案路徑
使用類的位元組碼,擷取類加載器,再擷取src目錄,最後讀取目錄中的某一個檔案。這種讀取方式可以擷取到盤符到目前檔案的全路徑,而且是全部動态擷取,可以便捷的得到檔案路徑。是以推薦使用這種方式來擷取檔案路徑名稱。
ServletContext.class.getClassLoader().getResource(“fileName”).getPath()
-
ajax概述
AJAX asynchronous js and xml: 異步的js和xml
AJAX是一個異步請求的操作,可以在頁面大部分内不變情況下完成局部重新整理的操作。
ajax是通過js來實作的。其中異步請求發送的資料是xml格式的資料。
随着技術的發展,ajax發送和接收的資料格式有以下幾種:
xml
json 字元串
text 純文字
ajaj -> aj
-
ajax運作原理
同步互動:
請求發出,浏覽器必須得到響應結果之後,才可以繼續發送下一次的請求,在等待過程中,浏覽器不能進行任何操作。
異步互動:
請求發出,浏覽器可以繼續進行更多的操作,不必等待響應結果,仍然可以發送更多的請求。伺服器會根據每一個請求依次作出響應。浏覽器在這個過程中,可以任意操作。
a. 實踐場景:
異步:
搜尋框 、注冊–使用者名是否存在校驗
同步:
百度搜尋框後的按鈕
b. 異步請求
優點:
使用者體驗較好。減少伺服器通路壓力。
缺點:
增加伺服器通路壓力。
-
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; } } }
-