欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    i,TDengine 的用戶朋友們,為防止過(guò)多的共性問(wèn)題困擾大家,方便大家學(xué)習(xí)、吸收經(jīng)驗(yàn),從今天開(kāi)始我們會(huì)對(duì)近期社區(qū)內(nèi)用戶遇到的共性問(wèn)題進(jìn)行精選、匯總,每?jī)芍芙o大家?guī)?lái)一次分享。 這是此類專欄的第一期內(nèi)容,為大家分享如下七個(gè)常見(jiàn)問(wèn)題:

    1. 客戶端連接串如何保證高可用?
    2. Java 應(yīng)用使用 taos-jdbcdriver 連接 TDengine 時(shí), RESTful 與原生 ( JNI ) 接口性能相比如何,該如何選型?
    3. TDengine 如何做表關(guān)聯(lián)?是使用 JOIN 嗎?
    4. 為什么 RESTful 接口無(wú)響應(yīng)、Grafana 無(wú)法添加 TDengine 為數(shù)據(jù)源、TDengineGUI 選了 6041 端口還是無(wú)法連接成功?
    5. TDengine 數(shù)據(jù)備份工具 taosdump 如何使用?
    6. Windows 客戶端無(wú)法正常顯示中文字符?
    7. 發(fā)生了 OOM 怎么辦?

    1. 客戶端連接串如何保證高可用?

    本周有較多的用戶提到了這個(gè)問(wèn)題,類似的還有 「如何給多節(jié)點(diǎn) TDengine 集群的鏈接配置高可用」。這個(gè)問(wèn)題時(shí)常出現(xiàn)在社區(qū)中,DBA、運(yùn)維同學(xué)較為關(guān)心。我們已經(jīng)整理成了文章,詳情可看博客:「GitHub問(wèn)題精選」TDengine 如何做到客戶端高可用? - TDengine | 濤思數(shù)據(jù)

    2. Java 應(yīng)用使用 taos-jdbcdriver 連接 TDengine 時(shí), RESTful 與原生 ( jni ) 接口性能相比如何,該如何選型?

    使用 RESTful 連接時(shí),不依賴 TDengine 客戶端驅(qū)動(dòng),可以跨平臺(tái),RESTful 連接支持所有能運(yùn)行 Java 的平臺(tái)。原生連接支持的平臺(tái)則和 TDengine 客戶端驅(qū)動(dòng)支持的平臺(tái)一致。 因此 RESTful 相比于原生連接使用起來(lái)更加靈活、方便,但采用 RESTful 的方式連接,其性能相較于原生連接會(huì)低 30% 左右。

    推薦在每秒寫入量小于 200 萬(wàn)條記錄的場(chǎng)景下,優(yōu)先選擇 RESTful 。用戶也可根據(jù)自己場(chǎng)景做性能測(cè)試,若使用 RESTful 連接時(shí)性能完全能滿足業(yè)務(wù)操作需求則優(yōu)先選擇 RESTful ,反之選擇原生連接。

    3. TDengine 如何做表關(guān)聯(lián)?是使用 JOIN 嗎?

    TDengine 支持在 「普通表與普通表」、「超級(jí)表與超級(jí)表」、「子查詢與子查詢」之間進(jìn)行自然連接,其語(yǔ)法相較于 INNER JOIN 有所不同,并且各種表進(jìn)行關(guān)聯(lián)查詢的限制也不盡相同。

    詳細(xì)內(nèi)容請(qǐng)看文檔:數(shù)據(jù)查詢 | TDengine 文檔

    4. 為什么 RESTful 接口無(wú)響應(yīng)、Grafana 無(wú)法添加 TDengine 為數(shù)據(jù)源、TDengineGUI 選了 6041 端口還是無(wú)法連接成功?

    上述問(wèn)題也間歇性的出現(xiàn)在社區(qū)中,許多用戶充滿了疑問(wèn),特別是一些從 TDengine 舊版本升到 2.4 及之后版本的用戶們,這是因?yàn)樵?2.4 之前的版本中沒(méi)有單獨(dú)的 taosAdapter 組件,RESTful 接口是由 taosd 內(nèi)置的 HTTP 服務(wù)提供的,而如今要實(shí)現(xiàn)上述功能需要執(zhí)行:systemctl start taosadapter 命令來(lái)啟動(dòng) taosAdapter 服務(wù)。

    需要說(shuō)明的是,taosAdapter 的日志路徑 path 需要單獨(dú)配置,默認(rèn)路徑是 /var/log/taos ;日志等級(jí) logLevel 有 8 個(gè)等級(jí),默認(rèn)等級(jí)是 info ,配置成 panic 可關(guān)閉日志輸出。請(qǐng)注意操作系統(tǒng) / 目錄的空間大小,可通過(guò)命令行參數(shù)、環(huán)境變量或配置文件來(lái)修改配置,默認(rèn)配置文件是 /etc/taos/taosadapter.toml 。

    有關(guān) taosAdapter 組件的詳細(xì)介紹請(qǐng)看文檔:taosAdapter | TDengine 文檔

    5. TDengine 數(shù)據(jù)備份工具 taosdump 如何使用?

    taosdump 是 TDengine 集群的數(shù)據(jù)備份、還原工具,使用前請(qǐng)先查看文檔中的說(shuō)明及注意事項(xiàng) :taosdump | TDengine 文檔

    需要注意的是,taosdump 采用邏輯備份的方式進(jìn)行備份,其不應(yīng)被用于備份任何原始數(shù)據(jù)、環(huán)境設(shè)置、 硬件信息、服務(wù)端配置或集群的拓?fù)浣Y(jié)構(gòu);并且當(dāng)備份的表數(shù)量很多時(shí)很容易導(dǎo)致文件系統(tǒng)卡住(一個(gè)表一個(gè)備份文件),推薦書寫腳本循環(huán)調(diào)用 taosdump 按照較細(xì)的粒度備份到不同目錄。

    6. Windows 客戶端無(wú)法正常顯示中文字符?

    Windows 系統(tǒng)中一般是采用 GBK/GB18030 存儲(chǔ)中文字符,而 TDengine 的默認(rèn)字符集為 UTF-8 ,在 Windows 系統(tǒng)中使用 TDengine 客戶端時(shí),客戶端驅(qū)動(dòng)會(huì)將字符統(tǒng)一轉(zhuǎn)換為 UTF-8 編碼后發(fā)送到服務(wù)端存儲(chǔ),因此在應(yīng)用開(kāi)發(fā)過(guò)程中,調(diào)用接口時(shí)正確配置當(dāng)前的中文字符集即可。

    【 v2.2.1.5以后版本 】在 Windows 10 環(huán)境下運(yùn)行 TDengine 客戶端命令行工具 taos 時(shí),若無(wú)法正常輸入、顯示中文,可以對(duì)客戶端 taos.cfg 做如下配置:

    locale C 
    charset UTF-8

    再次運(yùn)行客戶端命令行工具 taos ,即能正常進(jìn)行操作。

    另外,在 TDengine 中,中文字符或其他多字節(jié)字符需用 nchar 類型存儲(chǔ),不要用 binary 類型進(jìn)行存儲(chǔ),否則在用 taosdump 工具導(dǎo)出導(dǎo)入時(shí)將出現(xiàn)亂碼,導(dǎo)致不可修復(fù)的異常,binary 建議只用于存儲(chǔ) ASCII 可見(jiàn)字符。

    7. 發(fā)生了 OOM 怎么辦?

    OOM 是操作系統(tǒng)的保護(hù)機(jī)制,當(dāng)操作系統(tǒng)內(nèi)存(包括 SWAP )不足時(shí),會(huì)殺掉某些進(jìn)程,從而保證操作系統(tǒng)的穩(wěn)定運(yùn)行。通常內(nèi)存不足主要是如下兩個(gè)原因?qū)е拢皇鞘S鄡?nèi)存小于 vm.min_free_kbytes ;二是程序請(qǐng)求的內(nèi)存大于剩余內(nèi)存。還有一種情況是內(nèi)存充足但程序占用了特殊的內(nèi)存地址,也會(huì)觸發(fā) OOM 。

    TDengine 會(huì)預(yù)先為每個(gè) VNode 分配好內(nèi)存,每個(gè) Database 的 VNode 個(gè)數(shù)受 maxVgroupsPerDb 影響,每個(gè) VNode 占用的內(nèi)存大小受 Blocks 和 Cache 影響。要防止 OOM,需要在項(xiàng)目建設(shè)之初合理規(guī)劃內(nèi)存,并合理設(shè)置 SWAP ,除此之外查詢過(guò)量的數(shù)據(jù)也有可能導(dǎo)致內(nèi)存暴漲,這取決于具體的查詢語(yǔ)句。TDengine 企業(yè)版對(duì)內(nèi)存管理做了優(yōu)化,采用了新的內(nèi)存分配器,對(duì)穩(wěn)定性有更高要求的用戶可以考慮選擇企業(yè)版。


    結(jié)尾語(yǔ)

    感謝您閱讀本期問(wèn)題精選,希望以上內(nèi)容對(duì)您有幫助。您在使用 TDengine 的過(guò)程中,若遇到棘手的問(wèn)題或?qū)?TDengine 有改進(jìn)意見(jiàn),歡迎在 GitHub 上給我們提 Issue ,內(nèi)容越詳細(xì)越好,也可微信掃下方二維碼加入社區(qū),與大家進(jìn)行交流 ~ 最后,感謝使用 TDengine Time-Series Database !

    加小 T 為好友,立即加入到物聯(lián)網(wǎng)大數(shù)據(jù)技術(shù)交流群

    TDengine Database | 開(kāi)源、高性能、分布式、支持 SQL 的時(shí)序數(shù)據(jù)庫(kù) | 濤思數(shù)據(jù)點(diǎn)擊了解更多 TDengine Database 的具體細(xì)節(jié)。

    1、 HTTP協(xié)議請(qǐng)求報(bào)文以及響應(yīng)報(bào)文

    2、 JAVA Socket編程 Socket以及ServerSocket

    3、 WEB服務(wù)器概念 Tomcat服務(wù)器目錄結(jié)構(gòu)和基本配置server.xml文件

    4、 什么是Servlet? 怎樣實(shí)現(xiàn)一個(gè)自定義Servlet?

    5、 Servlet基本配置

    6、 ServletAPI 包括HttpServlet、HttpServletRequest、HttpServletResponse、ServletConfig、ServletContext

    7、 service方法以及doGet和doPost方法

    8、 servlet生命周期

    9、 怎樣獲取網(wǎng)頁(yè)提交的參數(shù)?

    10、 會(huì)話HttpSession和Cookie

    11、 調(diào)用一個(gè)已定義好的Servlet有哪些方式

    12、 表單提交數(shù)據(jù)到Servlet 中文亂碼處理

    13、 客戶端頁(yè)面向服務(wù)端servlet傳遞參數(shù)有哪些方式

    14、 JSP的運(yùn)行原理以及基本語(yǔ)法

    15、 JSP隱式對(duì)象

    16、 JavaScript基本語(yǔ)法

    17、 JavaScript中的對(duì)象

    18、 JavaScript與AJAX

    19、 基于對(duì)象的Javascript以及繼承的實(shí)現(xiàn)



    客戶端/服務(wù)器的優(yōu)勢(shì)在于:

    服務(wù)器和客戶端分?jǐn)側(cè)蝿?wù),分別負(fù)責(zé)部分處理工作;

    服務(wù)器可以同時(shí)為多臺(tái)客戶端服務(wù);

    多個(gè)客戶端可以同時(shí)訪問(wèn)服務(wù)器上的相同數(shù)據(jù)。


    IP

    網(wǎng)絡(luò)ID:網(wǎng)絡(luò)ID標(biāo)識(shí)了計(jì)算機(jī)或網(wǎng)絡(luò)設(shè)備所在的網(wǎng)段;

    主機(jī)ID:主機(jī)ID標(biāo)識(shí)了特定的主機(jī)或網(wǎng)絡(luò)設(shè)備


    特殊IP地址:

    0.0.0.0和127.0.0.1就是兩個(gè)此類地址,第一個(gè)稱為缺省路由,后一個(gè)是環(huán)回地址;

    127.0.0.1被保留用于用戶主機(jī)的本地IP話務(wù),它被分配給一個(gè)特殊接口,即起到閉合電路作用的環(huán)回接口


    端口

    端口使用一個(gè)16位的數(shù)字來(lái)表示,它的范圍是0~65535,1024以下的端口號(hào)保留給預(yù)定義的服務(wù),如:http使用80端口;


    java.net包

    java.net包可以實(shí)現(xiàn)Java的網(wǎng)絡(luò)功能,


    InetAddress:

    InetAddress getByName(String host) 在給定主機(jī)名的情況下確定主機(jī)的 IP 地址

    注:host可以是主機(jī)名 IP地址 或者域名

    InetAddress getLocalHost() 返回本地主機(jī)的InetAddress對(duì)象

    InetAddress[] getAllByName(String host) 在給定主機(jī)名的情況下,根據(jù)系統(tǒng)上配置的名稱服務(wù)返回其 IP 地址所組成的數(shù)組可能一個(gè)主機(jī)名對(duì)應(yīng)多個(gè)服務(wù)器(負(fù)載均衡)


    JAVA Socket編程

    socket用于描述IP地址和端口,應(yīng)用程序通過(guò)套接字向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求;

    套接字會(huì)因?yàn)榫W(wǎng)絡(luò)的連接中斷而失效,所以對(duì)它的操作都有可能拋出IOException

    Socket以及ServerSocket

    客戶端流程:向服務(wù)端請(qǐng)求,獲取輸入輸出流,進(jìn)行收發(fā)數(shù)據(jù),關(guān)閉io流,關(guān)閉套接字


    服務(wù)器流程:創(chuàng)建套接字,獲得客戶端請(qǐng)求,獲得輸入輸出流,收發(fā)信息,關(guān)閉io流,關(guān)閉套接字

    包裝以提高效率(用BufferedReader包裝輸入流,用PrintWriter包裝輸出流)

    BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));


    PrintWriter(OutputStream out, boolean autoFlush) 利用現(xiàn)有的OutputStream構(gòu)造格式打印流,由參數(shù)autoFlush指定是否帶自動(dòng)刷新緩存的功能


    進(jìn)程與線程的區(qū)別

    進(jìn)程是指系統(tǒng)中正在運(yùn)行中的應(yīng)用程序,它擁有自己獨(dú)立的內(nèi)存空間;

    線程是指進(jìn)程中一個(gè)執(zhí)行流程,一個(gè)進(jìn)程中允許同時(shí)啟動(dòng)多個(gè)線程,他們分別執(zhí)行不同的任務(wù);

    線程與進(jìn)程的主要區(qū)別在于:每個(gè)進(jìn)程都需要操作系統(tǒng)為其分配獨(dú)立的內(nèi)存地址空間,而同一進(jìn)程中的所有線程在同一塊地址空間中,這些線程可以共享數(shù)據(jù),因此線程間的通信比較簡(jiǎn)單,消耗的系統(tǒng)開(kāi)銷也相對(duì)較小。


    在Java中實(shí)現(xiàn)線程有兩種方式,分別是:

    擴(kuò)展java.lang.Thread類

    實(shí)現(xiàn)java.lang.Runnable接口


    線程start()調(diào)用run()方法,重寫的是run()


    線程生命周期


    線程狀態(tài):

    新建狀態(tài)(New):使用new關(guān)鍵字創(chuàng)建線程對(duì)象,僅僅被分配了內(nèi)存;

    就緒狀態(tài)(Ready):線程對(duì)象被創(chuàng)建后,等待它的start方法被調(diào)用,以獲得CPU的使用權(quán);

    運(yùn)行狀態(tài)(Running):執(zhí)行run方法,此時(shí)的線程的對(duì)象正占用CPU;

    睡眠狀態(tài)(Sleeping):調(diào)用sleep方法,線程被暫停,睡眠時(shí)間結(jié)束后,線程回到就緒狀態(tài),睡眠狀態(tài)的線程不占用CPU;

    死亡狀態(tài)(Dead):run方法執(zhí)行完畢后,線程進(jìn)入死亡狀態(tài);

    阻塞狀態(tài)(Blocked):線程由于某些事件(如等待鍵盤輸入)放棄CPU,暫停運(yùn)行,直到線程重新進(jìn)入就緒狀態(tài),才有機(jī)會(huì)轉(zhuǎn)到運(yùn)行狀態(tài);


    Yield()和join()的不同


    HTTP協(xié)議

    HTTP (HyperText Transfer Protocol)協(xié)議即超文本傳輸協(xié)議,是基于網(wǎng)絡(luò)應(yīng)用層的協(xié)議,它建立在TCP/IP協(xié)議的基礎(chǔ)上;

    該協(xié)議使用可靠的TCP連接,默認(rèn)端口是80;

    HTTP協(xié)議基于客戶端/服務(wù)器模式,客戶端主動(dòng)發(fā)出HTTP請(qǐng)求,服務(wù)器接收HTTP請(qǐng)求,返回HTTP響應(yīng)結(jié)果。


    HTTP協(xié)議是指超文本傳輸協(xié)議,專門用于在Internet上傳輸信息的協(xié)議,目前的版本是1.1;

    HTTP是應(yīng)用層的協(xié)議,它基于請(qǐng)求/響應(yīng)模式;

    HTTP協(xié)議默認(rèn)使用80端口進(jìn)行通訊;

    HTTP協(xié)議是無(wú)狀態(tài)的的協(xié)議。


    請(qǐng)求報(bào)文實(shí)例:

    請(qǐng)求報(bào)文是指客戶端瀏覽器向網(wǎng)絡(luò)服務(wù)器請(qǐng)求頁(yè)面時(shí),發(fā)送到服務(wù)器端的字符串,必須符合HTTP協(xié)議的格式要求,它可能包含如下組成部分:

    GET /index.html HTTP/1.1

    Accept: image/gif, image/x-xbitmap, image/jpeg, …, */*

    Accept-Language: zh-cn

    UA-CPU: x86

    Accept-Encoding: gzip, deflate

    User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

    Host: www.163.com:80

    Connection: Keep-Alive

    <空行>


    請(qǐng)求報(bào)文中的大部分項(xiàng)目是可選的,只有GET和Host部分是必需的;

    GET部分的格式是:

    GET<空格>/[請(qǐng)求的URL]<空格>HTTP/協(xié)議版本號(hào)

    如:GET /index.html HTTP/1.1

    Host部分的格式是:

    Host:<空格>服務(wù)器域名或IP地址:端口號(hào)

    如:Host: www.newer.com.cn:80

    換言之,請(qǐng)求報(bào)文中只要包含以上兩部分,就可以向網(wǎng)絡(luò)站點(diǎn)服務(wù)器請(qǐng)求到頁(yè)面。


    //拼湊請(qǐng)求報(bào)文

    String strHttp="GET / HTTP/1.1\r\n";

    strHttp +="Host: " + hostName + ":" + WEB_PORT + "\r\n";


    響應(yīng)報(bào)文實(shí)例:

    響應(yīng)報(bào)文是指網(wǎng)絡(luò)服務(wù)器收到來(lái)自客戶端的請(qǐng)求后,發(fā)回到客戶端的字符串,它用來(lái)告訴客服端:服務(wù)器已經(jīng)接受請(qǐng)求,隨后跟隨的是被請(qǐng)求的網(wǎng)頁(yè)內(nèi)容;

    響應(yīng)報(bào)文可能包含如下組成部分:

    HTTP/1.1 200 OK

    Date: Sat, 11 Aug 2007 11:58:37 GMT

    Server: Apache/1.3.37(Unix)

    Accept-Ranges: bytes

    Content-Length: 11503

    Content-Type: text/html

    <空行>


    響應(yīng)報(bào)文中也有兩部分是必需的:

    HTTP/協(xié)議版本號(hào)<空格>狀態(tài)碼<空格>OK

    狀態(tài)碼是一個(gè)3位整數(shù),用來(lái)表示不同的狀態(tài),200表示響應(yīng)成功,

    如:HTTP/1.1 200 OK

    狀態(tài)碼的具體描述請(qǐng)參閱本課件最后的附表。

    Content-Type:<空格>text/html;<空格>charset=字符集編碼

    用來(lái)描述服務(wù)器發(fā)回響應(yīng)的文件類型以及字符集編碼,text/html說(shuō)明是文本文件或超文本文件,

    如:Content-Type: text/html; charset=GB2312


    模擬:

    out.println("Http/1.1 200 OK");

    out.println("Content-Type:text/html; charset=GB2312");


    狀態(tài)碼:


    Web應(yīng)用的優(yōu)勢(shì)

    相對(duì)于傳統(tǒng)的C/S結(jié)構(gòu)(Client客戶端/Server服務(wù)器)的應(yīng)用程序而言,B/S結(jié)構(gòu)的Web應(yīng)用程序具備以下優(yōu)勢(shì):

    集中部署,無(wú)需安裝客戶端程序;

    集中管理,業(yè)務(wù)邏輯在服務(wù)端進(jìn)行維護(hù);

    數(shù)據(jù)共享,所有客戶端訪問(wèn)同一服務(wù)器的數(shù)據(jù);

    覆蓋面廣,只要有Internet覆蓋的區(qū)域都可通過(guò)瀏覽器享受服務(wù);

    更強(qiáng)的平臺(tái)無(wú)關(guān)性,不必關(guān)心客戶端的軟硬件平臺(tái),只要遵循HTTP協(xié)議,都可獲得支持。


    WEB服務(wù)器概念

    Web服務(wù)器可以解析(handles)HTTP協(xié)議。當(dāng)Web服務(wù)器接收到一個(gè)HTTP請(qǐng)求(request),會(huì)返回一個(gè)HTTP響應(yīng)(response),例如送回一個(gè)HTML頁(yè)面。為了處理一個(gè)請(qǐng)求(request),Web服務(wù)器可以響應(yīng)(response)一個(gè)靜態(tài)頁(yè)面或圖片,進(jìn)行頁(yè)面跳轉(zhuǎn)(redirect),或者把動(dòng)態(tài)響應(yīng)(dynamic response)的產(chǎn)生委托(delegate)給一些其它的程序例如CGI腳本,JSP(JavaServer Pages)腳本,servlets,ASP(Active Server Pages)腳本,服務(wù)器端(server-side)JavaScript,或者一些其它的服務(wù)器端(server-side)技術(shù)。無(wú)論它們(譯者注:腳本)的目的如何,這些服務(wù)器端(server-side)的程序通常產(chǎn)生一個(gè)HTML的響應(yīng)(response)來(lái)讓瀏覽器可以瀏覽。



    Tomcat服務(wù)器目錄結(jié)構(gòu)和基本配置server.xml文件

    博客http://blog.csdn.net/mycomein/article/details/45798161


    tomcat環(huán)境變量的設(shè)置:

    首先添加TOMCAT_HOME的環(huán)境變量,值為d:\Program Files\tomcat7。

    添加CATALINA_HOME環(huán)境變量,值為%TOMCAT_HOME%,

    添加CATALINA_BASE環(huán)境變量,值為%TOMCAT_HOME%。


    Tomcat是以面向?qū)ο蟮姆绞竭\(yùn)作的;在執(zhí)行期間,它會(huì)基于配置文件的設(shè)定動(dòng)態(tài)地組建其對(duì)象結(jié)構(gòu)。

    Server.xml文件中的每個(gè)主要元素都會(huì)創(chuàng)建軟件“對(duì)象”、排序及進(jìn)程管道中設(shè)置的這些元素嵌套方,讓您能執(zhí)行過(guò)濾、分組等工作。


    什么是Servlet? 怎樣實(shí)現(xiàn)一個(gè)自定義Servlet?

    Servlet是用Java語(yǔ)言編寫的程序,它運(yùn)行在Web服務(wù)器上,用以處理來(lái)自客戶端的請(qǐng)求;

    它一般會(huì)把處理的結(jié)果以為HTML的形式返回,在客戶端形成動(dòng)態(tài)網(wǎng)頁(yè)

    Servlet的優(yōu)點(diǎn)

    Servlet運(yùn)行在Web服務(wù)器中,可以擴(kuò)展服務(wù)器的功能;

    Servlet可以和其他資源交互,從而生成返回給客戶端響應(yīng)的內(nèi)容,即動(dòng)態(tài)網(wǎng)頁(yè);

    使用Java編寫,所以能夠跨平臺(tái);

    Java的所有優(yōu)點(diǎn)都可以在Servlet中體現(xiàn);

    Servlet很安全,因?yàn)樵L問(wèn)Servlet的唯一途徑是通過(guò)服務(wù)器;

    只要符合Servlet規(guī)范的Servlet容器都可以運(yùn)行Servlet。


    自定義servlet

    一個(gè)類繼承HttpServlet,重寫doGet()和doPost()方法,如果需要看到創(chuàng)建和銷毀的過(guò)程,可以重寫init()和destroy()方法。

    Servlet基本配置

    在web.xml中加入servlet的配置:

    <servlet>

    <servlet-name>LoginServlet</servlet-name>

    <servlet-class>com.tkclm.servlet.LoginServlet</servlet-class>

    </servlet

    <servlet-mapping>

    <servlet-name>LoginServlet</servlet-name>

    <url-pattern>/login</url-pattern>

    </servlet-mapping>將action與class對(duì)應(yīng)起來(lái)


    ServletAPI 包括HttpServlet、HttpServletRequest、HttpServletResponse、ServletConfig、ServletContext

    HttpServletRequest


    HttpServletResponse


    Javaweb容器的四種作用域

    幾乎所有web應(yīng)用容器都提供了四種類似Map的結(jié)構(gòu):application session request page,Jsp或者Servlet通過(guò)向著這四個(gè)對(duì)象放入數(shù)據(jù),從而實(shí)現(xiàn)Jsp和Servlet之間數(shù)據(jù)的共享。

    application:整個(gè)應(yīng)用 對(duì)應(yīng)servlet中ServletContext

    session:會(huì)話    對(duì)應(yīng)servlet中HttpSession

    request:一次請(qǐng)求  對(duì)應(yīng)servlet中的HttpServletRequest

    page:當(dāng)前頁(yè)面

    ServletConfig:此接口定義Servlet配置對(duì)象,以便于容器將信息傳遞給Servlet。

    ServletContext:此接口定義了一組方法,用于Servlet與容器進(jìn)行通信。

    service方法以及doGet和doPost方法、

    public void service(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException

    service方法是接口中的方法,servlet容器把所有請(qǐng)求發(fā)送到該方法,該方法默認(rèn)行為是轉(zhuǎn)發(fā)http請(qǐng)求到doXXX方法中,如果你重載了該方法,默認(rèn)操作被覆蓋,不再進(jìn)行轉(zhuǎn)發(fā)操作!此方法用來(lái)調(diào)度客戶端的請(qǐng)求,API文檔中明確規(guī)定,請(qǐng)勿重寫該方法

    servlet生命周期


    怎樣獲取網(wǎng)頁(yè)提交的參數(shù)?

    ①String str=request.getParameter("參數(shù)名稱")方法可以獲得參數(shù)值。

    對(duì)于復(fù)選框類的數(shù)據(jù),可以通過(guò)
    ②String[] str=request.getParameterValues("參數(shù)名稱")方法獲得。

    會(huì)話HttpSession和Cookie

    Cookie通過(guò)在客戶端記錄信息確定用戶身份Session通過(guò)在服務(wù)器端記錄信息確定用戶身份。Cookie由服務(wù)器產(chǎn)生,給客戶端頒發(fā)的通行證,每一個(gè)Cookie只能保存一個(gè)變量,

    若需要修改(包括刪除)需要服務(wù)器重新頒發(fā)Cookie。

    會(huì)話對(duì)象(它主要解決了HTTP協(xié)議是無(wú)狀態(tài)的問(wèn)題。)

    所謂的會(huì)話是指:在一段時(shí)間內(nèi),某客戶端與服務(wù)器之間的一連串的請(qǐng)求與響應(yīng);

    會(huì)話對(duì)象可以使用戶訪問(wèn)一個(gè)站點(diǎn)的多個(gè)頁(yè)面時(shí)共享信息;

    javax.servlet.http.HttpSession接口用來(lái)提供會(huì)話對(duì)象,如果我們?cè)诔绦蛑行枰僮鲿?huì)話,就可以使用它;

    可以通過(guò)HttpServletRequest的getSession方法獲得(或創(chuàng)建)HttpSession對(duì)象。


    調(diào)用一個(gè)已定義好的Servlet有哪些方式

    發(fā)送請(qǐng)求(包括表單() a標(biāo)簽 js的)重定向(重定向跟轉(zhuǎn)發(fā))

    重定向:response.sendRedirect("success.jsp");
    r轉(zhuǎn)發(fā):equest.getRequestDispatcher("success.jsp").forward(request,response);
    1.轉(zhuǎn)發(fā)在服務(wù)器端完成的;重定向是在客戶端完成的
    2.轉(zhuǎn)發(fā)的速度快;重定向速度慢
    3.轉(zhuǎn)發(fā)的是同一次請(qǐng)求;重定向是兩次不同請(qǐng)求
    ★4.轉(zhuǎn)發(fā)不會(huì)執(zhí)行轉(zhuǎn)發(fā)后的代碼;重定向會(huì)執(zhí)行重定向之后的代碼
    ★5.轉(zhuǎn)發(fā)地址欄沒(méi)有變化;重定向地址欄有變化
    6.轉(zhuǎn)發(fā)必須是在同一臺(tái)服務(wù)器下完成;重定向可以在不同的服務(wù)器下完成


    表單提交數(shù)據(jù)到Servlet 中文亂碼處理

    可以通過(guò)字符集轉(zhuǎn)碼來(lái)解決此問(wèn)題:

    對(duì)于get

    new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");

    對(duì)于post

    request.setCharacterEncoding("UTF-8");

    客戶端頁(yè)面向服務(wù)端servlet傳遞參數(shù)有哪些方式

    表單

    a標(biāo)簽

    Ajax即js

    <jsp:param>

    <%setAttributr();%>

    JSP的運(yùn)行原理以及基本語(yǔ)法

    Jsp執(zhí)行過(guò)程:


    JSP 頁(yè)面內(nèi)容


    JSP元素包括JSP腳本元素(包括注釋,聲明,表達(dá)式,scriptlet),指令元素(page,include,taglib),動(dòng)作元素。


    Jsp聲明:

    需求:某系統(tǒng)計(jì)算的金額中有兩種形式,一種是帶有兩位小數(shù)的,另一種是整數(shù),現(xiàn)在要求你在JSP頁(yè)面將不帶小數(shù)的金額轉(zhuǎn)換為帶兩位小數(shù)的金額。

    <%

    String trans(String money){

    Int index=money.indexOf(“.”);

    If(index==-1){

    Money=money +”.00”;

    }

    Retrun money;

    }

    %>

    <%=trans(money)%>

    Jsp注釋<%-- comment--%>>不會(huì)顯示在網(wǎng)頁(yè)上,html<!-- comment-->注釋會(huì)顯示在網(wǎng)頁(yè)中


    Jsp指令包括 page,include,taglib

    例:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    <%@ include file="../jsp/Header.jsp"%>

    格式:<%@ 指令名稱 屬性1="屬性值1" 屬性2="屬性值2" … 屬性n="屬性值n"%>


    l page 指令用于設(shè)置JSP 頁(yè)面的屬性,這個(gè)屬性將被用于和容器通信

    <%@ page %>指令作用于整個(gè)JSP頁(yè)面,同樣包括靜態(tài)的包含文件。

    無(wú)論你把<% @ page %>指令放在JSP的文件的哪個(gè)地方,它的作用范圍都是整個(gè)JSP頁(yè)面。

    [ language=“java” ]

    主要指定JSP容器要用什么語(yǔ)言來(lái)編譯JSP的元素

    [ import=“{package.class | package.*}, ...” ]

    JSP程序可以使用哪些包

    [pageEncoding=“UTF-8”]

    Jsp程序用什么編碼格式編碼


    l include指令

    用來(lái)在JSP文件被編譯時(shí)導(dǎo)入一個(gè)指定的文件,語(yǔ)法形式

    <%@ include file=”relativeURLspec” %>

    include 指令告訴編譯器在編譯當(dāng)前的JSP程序時(shí),將由relativeURLspec所指定的外部文件代碼插入到include編譯指令所在的位置,并把它作為當(dāng)前JSP程序的一部分編譯.如果被嵌入文件在包含它們的主JSP程序被裝載到內(nèi)存之后被修改,那么主JSP程序連同被嵌入的文件將在下一次請(qǐng)求產(chǎn)生時(shí)被重新編譯.

    這個(gè)包含的過(guò)程是靜態(tài)的,而包含的文件可以是HTML文件、JSP頁(yè)面、文本文件或是一段java程序


    l Taglib指令

    taglib 指令允許用戶創(chuàng)建自定義標(biāo)簽 jstl

    總結(jié):

    JSP 腳本由三個(gè)元素組成,即 JSP 表達(dá)式、JSP Scriptlet 和 JSP 指令

    JSP 表達(dá)式包括在 <%=%>內(nèi); Scriptlet 包含在<% %>內(nèi);聲明包含在<%! %>內(nèi)

    JSP 指令共有三種類型,即 page、include 和 taglib。JSP 指令包括在 <%@ 和 %>內(nèi)

    page 指令用于設(shè)置 JSP 頁(yè)面的屬性;include 指令用于在 JSP 頁(yè)面嵌入其他文件

    JSP隱式對(duì)象


    l request表示客戶端對(duì)網(wǎng)頁(yè)的請(qǐng)求

    l response實(shí)現(xiàn) javax.servlet.http.HttpServletResponse 接口使用 HTTP 協(xié)議將響應(yīng)發(fā)送給客戶端

    l out表示輸出流

    l Session

    l Application 表示 JSP 頁(yè)面所屬的應(yīng)用程序

    l pageContext使用戶可以訪問(wèn)頁(yè)面作用域中定義的所有隱式對(duì)象它的作用范圍是在同一頁(yè)面

    l Page使用 page 對(duì)象可以訪問(wèn) Servlet 類的所有變量和方法

    l config實(shí)現(xiàn)javax.servlet.ServletConfig接口,表示Servlet 的配置,其常用方法有:

    getInitParameter() 獲取初始化的參數(shù)

    getServletContext() 獲取環(huán)境

    getServletName() 獲取Servlet名字

    l exception對(duì)象用于處理 JSP 頁(yè)面中的錯(cuò)誤

    JavaScript基本語(yǔ)法

    Js特點(diǎn):腳本語(yǔ)言,基于對(duì)象,事件驅(qū)動(dòng),平臺(tái)無(wú)關(guān)


    將JavaScript嵌入網(wǎng)頁(yè)(三種方式):

    1.使用 <script>…</script> 標(biāo)簽將語(yǔ)句嵌入文檔

    2.將 外部JavaScript 源文件鏈接到 html 文檔中

    <script src="test.js"></script>

    可使多個(gè)網(wǎng)頁(yè)共享一個(gè)腳本文件內(nèi)的代碼

    一般在其中定義一系列在多個(gè)網(wǎng)頁(yè)中都可能要用到的函數(shù)

    3.作為網(wǎng)頁(yè)元素的事件處理程序,當(dāng)事件觸發(fā)時(shí)自動(dòng)運(yùn)行

    <marquee onmouseover=“this.stop()”>


    JavaScript基本語(yǔ)法部分:

    語(yǔ)句:一條由計(jì)算機(jī)完成的、幫助你達(dá)到某種目的的指令,JavaScript中的每一行都可認(rèn)為是一條語(yǔ)句

    變量:一個(gè)代表某個(gè)值的名字就是變量

    表達(dá)式:A-1+B 就是表達(dá)式

    函數(shù):具有一定功能的程序段


    數(shù)據(jù)類型:


    變量

    JS是弱類型的語(yǔ)言,即聲明變量時(shí)不需指定數(shù)據(jù)類型,為它賦值時(shí)其類型才確定,而且再次為其賦值可改變它的數(shù)據(jù)類型.

    變量的命名: 只能包含數(shù)字,字母,下劃線("_"),但不能以數(shù)字開(kāi)頭,不能是保留字(關(guān)鍵字)

    JS區(qū)分大小寫

    用var聲明變量


    函數(shù)的聲明與調(diào)用

    方式一、

    function 函數(shù)名([參數(shù)[,參數(shù)...]]){
    <語(yǔ)句組>
    [return <表達(dá)式>;]
    }

    方式二、

    函數(shù)名=function ([參數(shù)[,參數(shù)...]]) {

    }

    方式三、(較不常用)

    Function類

    函數(shù)名=new Function ([“參數(shù)名”[,“參數(shù)名”...]],“函數(shù)體”)


    arguments對(duì)象

    1:arguments是收到的實(shí)參副本
      在詞法分析中, 首先按形參形成AO的屬性,值為undefined
      當(dāng)實(shí)參傳來(lái)時(shí), 再修改AO的相應(yīng)屬性.
      2:并把所有收到實(shí)參收集起來(lái),放到一個(gè)arguments對(duì)象里
      t(a,b,c){},
      調(diào)用時(shí): t(1,2,3,4,5) 5個(gè)參數(shù)
      此時(shí) , AO屬性只有a,bc,3個(gè)屬性, arguments里有1,2,3,4,5, 所有的值

      對(duì)于超出形參個(gè)數(shù)之外的實(shí)參, 可以通過(guò)arguments來(lái)獲得
      3:arguments 的索引 從 0, 1,2,....遞增,與實(shí)參逐個(gè)對(duì)應(yīng)
      4:arguments.length 屬性代表實(shí)參的個(gè)數(shù)
      5:arguments一定不是數(shù)組, 是長(zhǎng)的比較像數(shù)組的一個(gè)對(duì)象,雖然也有l(wèi)ength屬性
      6:arguments每個(gè)函數(shù)都會(huì)有,因此,arguemnts只會(huì)在內(nèi)部找自身的arguments,
      無(wú)法引用到外層的arguments
      <script type="text/javascript">
      // 求圓形面積,矩形面積, 三角形面積
      function area () {
      if(arguments.length==1) {
      alert(3.14 * arguments[0] * arguments[0]);
      } else if(arguments.length==2) {
      alert(arguments[0] * arguments[1]);
      } else if(arguments.length==3) {
      alert(arguments[0] + arguments[1] + arguments[2]);
      } else {
      return null;
      }
      }
      area(10,20,30);
      
      </script>

    內(nèi)部函數(shù)

    function a( d){
    var i=0;

    Function c(){

    //....

    }
    function b(){

    c();
    alert(++i);
    }
    return b;
    }
    var c=a();
    c();

    閉包:允許使用內(nèi)部函數(shù)--即函數(shù)定義和函數(shù)表達(dá)式位于另一個(gè)函數(shù)的函數(shù)體內(nèi)。而且,這些內(nèi)部函數(shù)可以訪問(wèn)它們所在的外部函數(shù)中聲明的所有局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)。


    類型轉(zhuǎn)換

    強(qiáng)制類型轉(zhuǎn)換,ECMAScript中可用的3種強(qiáng)制類型轉(zhuǎn)換:
    Boolean(value);
    Number(value);
    String(value);

    NaN --- 不是一個(gè)數(shù)字類型

    NaN 值非常特殊,因?yàn)樗安皇菙?shù)字”,所以任何數(shù)跟它都不相等,甚至 NaN 本身也不等于 NaN 。

    isNaN(testValue) 計(jì)算一個(gè)參數(shù),檢查它是否為數(shù)值。


    var iNum=10;

    var snum=iNum.toString(8); 12 進(jìn)制

    var iNum1=parseInt("12.6"); 12

    var iNum2=parseInt("hello"); NaN

    var iNum3=parseInt("123world");123

    var fNum4=parseFloat("25.12.6");25.12

    var b1=Boolean("");false

    var b2=Boolean(undefined);false

    var b3=Boolean(0);false

    var iNum=Number("25.12.6");NaN

    var bl=isNaN(Number("13f"))true

    JavaScript中的對(duì)象

    本地對(duì)象

    Object Function Array String Boolean Number Date RegExp Error EvalError RangeError TypeError ReferenceError SyntaxError URIError

    內(nèi)置對(duì)象

    Global Math

    宿主對(duì)象(自定義對(duì)象)


    對(duì)象是用關(guān)鍵字new后跟要實(shí)例化的類的名字創(chuàng)建,例如:

    var oObj=new Object();

    如果構(gòu)造 函數(shù)無(wú)參數(shù),括號(hào)可省略

    var oObj=new Object;


    Object 對(duì)象:


    可以對(duì)object對(duì)象增加函數(shù)屬性


    判斷對(duì)象是否有某個(gè)屬性:


    alert(oPerson.hasOwnProperty(“age”));



    字符串對(duì)象 String

    屬性:length


    數(shù)組對(duì)象 Array

    創(chuàng)建數(shù)組對(duì)象

    myArr=new Array(); myArr [10]=“array”; //MyArray數(shù)組的長(zhǎng)度為10

    myArr=new Array(3); //可存放三個(gè)元素

    myArr=new Array(“a”,”c”,”d”);//存放了三個(gè)元素的數(shù)組

    myArr=[“a”,”b”,”c”]; //存放了三個(gè)元素的數(shù)組

    下標(biāo)從0開(kāi)始編號(hào)


    數(shù)學(xué)對(duì)象 Math

    max(,,,,)方法:返回各個(gè)參數(shù)中最大的數(shù)

    min(,,,)方法:返回各個(gè)參數(shù)中最小的數(shù)

    abs()方法:返回絕對(duì)值

    sin()方法:返回參數(shù)的正弦值,參數(shù)為弧度

    sqrt()方法:求輸入?yún)?shù)的平方根

    round():四舍五入為整數(shù)

    random():返回0-1的隨機(jī)小數(shù)

    返回 n 到 m之間的隨機(jī)整數(shù):

    var iNum=Math.floor(Math.random() * (m-n+1) +n);

    floor():取整,返回比參數(shù)小的最大整數(shù)

    ceil():返回大于或等于參數(shù)的最近整數(shù)

    Grobal對(duì)象:對(duì)象從不直接使用,并且不能用 new 運(yùn)算符創(chuàng)建。它在 Scripting 引擎被初始化時(shí)創(chuàng)建,并立即使其方法和屬性可用。


    日期時(shí)間對(duì)象Date

    日期對(duì)象的創(chuàng)建:

    mydate=new Date()
    創(chuàng)建代表當(dāng)前日期時(shí)間的日期對(duì)象

    mydate=new Date(“October 1,2005,12:00:00”)
    創(chuàng)建代表2005年國(guó)慶午時(shí)的日期對(duì)象

    Mydate=new Date(2005, 9, 1)

    創(chuàng)建代表2005年10月1日的日期對(duì)象

    日期對(duì)象以系統(tǒng)內(nèi)存中以數(shù)值表示,以1970年1月1日0時(shí)0分0秒0毫秒為起始點(diǎn),每過(guò)一毫秒增加一.

    get方法組à從日期對(duì)象中分解出它所處的年月日,星期幾,時(shí)分秒,毫秒值

    getYear()à返回年份數(shù)

    getMonth()à返回月份數(shù):0-11,應(yīng)加上1.

    getDate()à返回當(dāng)前Date對(duì)象的日期數(shù):1-31

    getDay()à返回星期幾:0-6, 0代表星期日

    getHours()à返回小時(shí)數(shù):0-23

    getMinutes()à返回分鐘數(shù):0-59

    getSeconds()à返回秒數(shù):0-59

    getTime()à返回毫秒數(shù):自起始時(shí)刻開(kāi)始

    set方法組à設(shè)置(改變)日期對(duì)象的某一部分

    setYear()à設(shè)置年份數(shù)

    setMonth()à設(shè)置月份數(shù):參數(shù)0-11

    setDate()à設(shè)置日期數(shù):參數(shù)1-31

    setHours()à設(shè)置小時(shí)數(shù):參數(shù)0-23

    setMinutes()à設(shè)置分鐘數(shù):參數(shù)0-59

    setSeconds()à設(shè)置秒數(shù):參數(shù)0-59


    JavaScript與AJAX

    1.1XMLHttpRequst對(duì)象的概述

      在使用XMLHttpRequest對(duì)象發(fā)送請(qǐng)求和處理響應(yīng)之前,必須先調(diào)用JavaScript創(chuàng)建一個(gè)XMLHttpRequest對(duì)象。由于XMLHttpRequest不是一個(gè)W3C標(biāo)準(zhǔn),所以可以采用很多JavaScript方法來(lái)創(chuàng)建XMLHttpRequest的實(shí)例,IE把XMLHttpRequest實(shí)現(xiàn)為一個(gè)ActiveX對(duì)象,其他瀏覽器則把它實(shí)現(xiàn)為一個(gè)本地的JavaScript對(duì)象,由于存在這些差別,JavaScript必須包含有關(guān)的邏輯,從而使用ActiveX技術(shù)與使用本地的JavaScript對(duì)象技術(shù)創(chuàng)建XMLHttpRequst的一個(gè)實(shí)例。

      很多人可能還記得從前的那段日子,那時(shí)不同瀏覽器上的JavaScript與DOM簡(jiǎn)直千差萬(wàn)別,聽(tīng)了這段話后有人可能不寒而栗。幸運(yùn)的是,在這里為了明確該如何創(chuàng)建XMLHttpRequst對(duì)象的實(shí)例,并不需要那么詳細(xì)的編寫代碼來(lái)區(qū)別瀏覽器的類型。你要做的只是檢查瀏覽器是否提供對(duì)ActiveX對(duì)象的支持。如果瀏覽器支持ActiveX對(duì)象,就可以使用ActiveX對(duì)象來(lái)創(chuàng)建XMLHttpRequest對(duì)象。否則,就要使用本地的JavaScript對(duì)象技術(shù)來(lái)創(chuàng)建。下面的代碼展示了編寫跨瀏覽器的JavaScript代碼來(lái)創(chuàng)建XMLHttpRequst是多么的簡(jiǎn)單。

      創(chuàng)建XMLHttpRequest的一個(gè)實(shí)例:

    var xmlHttp; function createXMLHttpRequst(){ if(window.ActiveXObject){
          xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");     }
        else if(window.XMLHttpRequst){
          xmlHttp=new XMLHttpRequest();
        } }

      可以看到,創(chuàng)建一個(gè)XMLHttpRequest相當(dāng)容易。首先,要?jiǎng)?chuàng)建一個(gè)全局作用域變量xmlHttp來(lái)保存這個(gè)對(duì)象的引用。createXMLHttpRequst方法完成創(chuàng)建XMLHttpRequst對(duì)象的具體工作。這個(gè)方法中只有簡(jiǎn)單的分支邏輯(選擇邏輯)來(lái)確定如何創(chuàng)建對(duì)象。對(duì)window.ActiveXObject的調(diào)用會(huì)返回一個(gè)對(duì)象,也可能返回一個(gè)null,if語(yǔ)句會(huì)把調(diào)用返回的結(jié)果看作是true或false(如果返回對(duì)象則為true,返回null則為false),以此指示瀏覽器是否支持ActiveX控件,相應(yīng)地得知瀏覽器是不是IE,如果確實(shí)是,則通過(guò)實(shí)例化一個(gè)ActiveX的一個(gè)新實(shí)例來(lái)創(chuàng)建XMLHttpRequst對(duì)象,并傳入一個(gè)串指令指示要?jiǎng)?chuàng)建何種類型的ActiveX對(duì)象

    。在這個(gè)例子中為構(gòu)造函數(shù)提供的字符串是Microsoft。XMLHTTP,這說(shuō)明你想創(chuàng)建一個(gè)XMLHttpRequst的一個(gè)實(shí)例。

      如果window.ActiveXObjec調(diào)用失敗(返回null),JavaScript就會(huì)轉(zhuǎn)到else語(yǔ)句的分支確定瀏覽器是否把XMLHttpRequst實(shí)現(xiàn)為一個(gè)本地的JavaScript對(duì)象。如果存在window.XMLHttpRequest,就會(huì)創(chuàng)建XMLHttpRequst的一個(gè)實(shí)例。

      由于ajax具有動(dòng)態(tài)類型特性,而且XMLHttpRequst在不同瀏覽器上的實(shí)現(xiàn)是兼容的,所以可以用同樣的方式訪問(wèn)XMLHttpRequst實(shí)例的屬性和方法,而不論這個(gè)實(shí)例創(chuàng)建的方法是什么。這就大大地簡(jiǎn)化了開(kāi)發(fā)過(guò)程,而且在JavaScript中也不必編寫特定于瀏覽器的邏輯。

    1.2方法和屬性

      abort()  停止當(dāng)前請(qǐng)求;

      getAllResponseHeaders()  把HTTP請(qǐng)求的所有響應(yīng)首部作為鍵值對(duì)返回;

      getResponseHeader("header")  返回指定首部的串值;

      open("method","url")  建立對(duì)服務(wù)器的調(diào)用。method參數(shù)可以使GET POST 或PUT。url可以使相對(duì)url或絕對(duì)url,這個(gè)方法還包括三個(gè)可選的參數(shù);

      send(content)  向服務(wù)器發(fā)送請(qǐng)求;

      setRequstHeader("header","value")  把指定首部設(shè)置為所提供的值。在設(shè)置任何首部之前必須先調(diào)用open();

      下面來(lái)更詳細(xì)地討論這些方法。

      void open(string method, string url, boolean asynch ,string usename ,string password); 這個(gè)方法會(huì)建立對(duì)服務(wù)器的調(diào)用。這是初始化一個(gè)請(qǐng)求的純腳本方法。它有兩個(gè)必要的參數(shù)三個(gè)可選的參數(shù)。要提供調(diào)用的特定方法(get/post/put),還要提供所調(diào)用資源的url。另外還可以傳遞一個(gè)Boolean值,這是這個(gè)調(diào)用是異步的還是同步的。默認(rèn)值為true,表示本質(zhì)上是異步的,如果這個(gè)參數(shù)為false,處理就會(huì)等待,知道服務(wù)器返回響應(yīng)為止。由于異步調(diào)用是ajax主要優(yōu)勢(shì)之一,所以倘若這個(gè)參數(shù)設(shè)為false,從某種程度上講與使用XMLHttpRequst對(duì)象的初衷不太相符。不過(guò)在某些情況下見(jiàn)這個(gè)參數(shù)設(shè)為fals也是有用的,比如持久存儲(chǔ)頁(yè)面之前可以先驗(yàn)證用戶的輸入。最后兩個(gè)參數(shù)不說(shuō)自明,允許你指定一個(gè)特定的用戶名和密碼。

      void send(content) 這個(gè)方法具體向服務(wù)器發(fā)送請(qǐng)求。如果請(qǐng)求聲明為異步的,這個(gè)方法就會(huì)立即返回,否則它會(huì)等到直到接收到響應(yīng)為止。可選參數(shù)可以是DOM對(duì)象的實(shí)例、輸入流,或串。傳入這個(gè)方法的內(nèi)容會(huì)作為一個(gè)請(qǐng)求體的一部分發(fā)送。

      void setRequstHeader(string header,string value);這個(gè)方法為為HTTP請(qǐng)求中一個(gè)給定的首部設(shè)置值,它有兩個(gè)參數(shù),第一個(gè)串表示要設(shè)置的首部,第二個(gè)串表示要在首部中放置的值。注意,這個(gè)方法必須在調(diào)用opend()之后才能調(diào)用。

      在所有的這些方法中,最有可能用到的就是opend()和send()。XMLHttpRequest對(duì)象還有很多屬性,在設(shè)計(jì)Ajax交互時(shí)這些屬性非常有用。

      void abort() 顧名思義,這個(gè)方法就是要停止請(qǐng)求。

      string getAllResponseHeaders() 這個(gè)方法的核心功能對(duì)開(kāi)發(fā)人員應(yīng)該很熟悉,它返回一個(gè)串,其中包含HTTP請(qǐng)求的所有響應(yīng)首部,首部包括Content-Length/Data和URI

      string getReponseHeader(string header) 這個(gè)方法與getAllResponseHeaders()是對(duì)應(yīng)的,不過(guò)它有一個(gè)參數(shù)表示您希望的指定收不到的值,并把這個(gè)值作為串返回。除了這些標(biāo)準(zhǔn)方法,處理XMLHttpRequst可以大量使用這些屬性。

      onreadystatechange 每個(gè)狀態(tài)改變時(shí)都會(huì)觸發(fā)這個(gè)事件處理器,通常會(huì)調(diào)用一個(gè)javacript函數(shù);

      readyState 請(qǐng)求狀態(tài)。有5個(gè)可取的值:0:=未初始化,1=正在加載,2=已加載,3=交互中,4=完成;

      responseText服務(wù)器的響應(yīng),表示為一個(gè)串;

      responseXML服務(wù)器的響應(yīng),表示為XML,這個(gè)對(duì)象可解釋為DOM對(duì)象;

      status服務(wù)器HTTP狀態(tài)碼(200對(duì)應(yīng)Ok 404對(duì)應(yīng) not found ,等)

      statusText HTTP狀態(tài)碼的相應(yīng)文本(ok或not found等)

    1.3AJAX交互設(shè)計(jì)

      1.一個(gè)客戶端事件觸發(fā)一個(gè)Ajax事件。從簡(jiǎn)單的onchange事件到某個(gè)特定的用戶動(dòng)作,很多這樣的事都可以觸發(fā)Ajax事件。

    <input type="text" d="email" name="email" onblur="validateEmail()"/>


      2.創(chuàng)建XMLHttpRequst對(duì)象的一個(gè)實(shí)例。使用open()方法建立調(diào)用,并調(diào)用url及所希望的HTTP方法(通常是post/get)。請(qǐng)求實(shí)際上是通過(guò)一個(gè)send()方法調(diào)用觸發(fā),代碼如下:

    var xmlHttp; function validateEmail(){   var email=document.getElementById("email");
      var url="validate?email="+escape(email.value);
      if(window.ActiveObject){
        xmlHttp=new ActiveObject("Microsoft.XMLHTTP");
      }
      else if(window.XMLHttpRequst){
        xmlHttp=new XMLHttpRequst();
      }
      xmlHttp.open("get",url);
      xmlHttp.onreadystatechange=callback;
      xmlHttp.send(null);
    }

      3.向服務(wù)器做出請(qǐng)求。可能調(diào)用servlet、CGI腳本,或者任何服務(wù)器端技術(shù)。

      4.服務(wù)器可以做你想做的事情,包括訪問(wèn)時(shí)數(shù)據(jù)庫(kù),甚至訪問(wèn)另一個(gè)系統(tǒng)。

      5.請(qǐng)求返回到瀏覽器。content-type設(shè)置為text/xml ,XMLHttpRequst的對(duì)象只能處理text/html類型的結(jié)果。在另外一些更復(fù)雜的示例中

      6.在這個(gè)demo中,XMLHttpRequst對(duì)象配置為處理返回結(jié)果時(shí)要調(diào)用callback()函數(shù),這個(gè)函數(shù)會(huì)檢查XMLHttpRequst對(duì)象的readyState屬性,然后查看服務(wù)器返回的狀態(tài)碼。如果一切正常,callback()函數(shù)就會(huì)在客戶端做一些有意思的工作。一下就是一個(gè)典型的回調(diào)方法:

    function callback(){   if(xmlHttp.readyState==4){
        if(xmlHttp.status==200){
          //do something interesting here
        }
      } }

      可以看到,正常的請(qǐng)求/響應(yīng)模式有所不同,但對(duì)于web開(kāi)發(fā)人員來(lái)說(shuō),并不是完全陌生的。顯然,在創(chuàng)建和建立XMLHttpRequst對(duì)象時(shí)還可以做些事情,另外當(dāng)“回調(diào)”函數(shù)完成狀態(tài)檢查之后也可以有所作為。一般的,你會(huì)把這些標(biāo)準(zhǔn)調(diào)用包裝在一個(gè)庫(kù)中,一便在整個(gè)應(yīng)用中使用,或者可以使用web上提供的庫(kù)


    基于對(duì)象的Javascript以及繼承的實(shí)現(xiàn)


    關(guān)鍵字this

    指向調(diào)用該方法的“當(dāng)前”對(duì)象

    this使用的幾種場(chǎng)合:

    用在對(duì)象的方法中

    構(gòu)造函數(shù)

    事件處理函數(shù)

    原型-prototype

    objectName.prototype

    objectName 是對(duì)象的名稱。

    objectName.prototype本身也是對(duì)象

    用 prototype 屬性提供對(duì)象的類的一組基本功能。 對(duì)象的新實(shí)例“繼承”賦予該對(duì)象原型的操作。

    prototype 對(duì)象是個(gè)模板,要實(shí)例化的對(duì)象都以這個(gè)為基礎(chǔ)。

    prototype 對(duì)象的任何屬性和方法都被傳遞給那個(gè)類的所有實(shí)例

    利用prototype修改本地對(duì)象

    個(gè)本地對(duì)象也有prototype屬性

    通過(guò)prototype屬性創(chuàng)建新方法

    通過(guò)prototype屬性重定義已有方法

    var books=new Array("java","C","VB"); Array.prototype.hasItem=function(oItem){ for(i=0; i<books.length; i++){ if(oItem==books[i]){ return true; } } return false;}


    var books=new Array("java","C","VB");


    Array.prototype.pop=function(){

    return "pop object";

    }

    var o=books.pop(); //原本為VB -à 重載后 pop object


    自定義對(duì)象的4種方式

    1.通過(guò)工廠方式創(chuàng)建

    此工廠創(chuàng)建的對(duì)象各屬性都一樣

    function createPerson(){

    var oPerson=new Object();

    oPerson.name="張三";

    oPerson.age=22;

    oPerson.showAge=function(){

    alert(this.age);

    }

    return oPerson;

    }

    var oPerson1=createPerson();

    var oPerson2=createPerson();

    此工廠根據(jù)傳參的不同 創(chuàng)建不同的屬性

    function createPerson(sName, iAge){

    var oPerson=new Object();

    oPerson.name=sName;

    oPerson.age=iAge;

    oPerson.showAge=function(){ //或者函數(shù)外定義

    alert(this.age);

    }


    return oPerson;

    }


    var oPerson1=createPerson("張三",22);

    var oPerson2=createPerson("李四", 20);

    oPerson1.showAge();

    oPerson2.showAge();

    2.通過(guò)構(gòu)造函數(shù)方式創(chuàng)建

    function Person(sName, iAge){

    this.name=sName;

    this.age=iAge;

    this.showAge=function(){ //或者函數(shù)外定義

    alert(this.age);

    }

    }


    var oPerson1=new Person("張三",22);

    var oPerson2=new Person("李四", 20);

    oPerson1.showAge();

    oPerson2.showAge();

    3.通過(guò)原型方式創(chuàng)建

    function Person(){

    }

    Person.prototype.name="張三";

    Person.prototype.age=22;

    Person.prototype.showAge=function(){

    alert(this.age);

    }


    var oPerson1=new Person();

    var oPerson2=new Person();


    function Person(){

    }

    Person.prototype.name="張三";

    Person.prototype.age=22;

    Person.prototype.books=new Array("java","C");

    Person.prototype.showAge=function(){

    alert(this.age);

    }


    var oPerson1=new Person();

    var oPerson2=new Person();

    oPerson1.books.push("VB");


    alert(oPerson1.books); // java,C,VB

    alert(oPerson2.books); // java,C,VB

    4.混合的構(gòu)造函數(shù)/原型方式創(chuàng)建

    function Car(sColor, iDoors, iMpg) {

    this.color=sColor;

    this.doors=iDoors;

    this.mpg=iMpg;

    this.drivers=new Array("Mike", "Sue");

    }

    Car.prototype.showColor=function () {

    alert(this.color);

    };

    var oCar1=new Car("red", 4, 23);

    var oCar2=new Car("blue", 3, 25);


    oCar1.drivers.push("Matt");


    alert(oCar1.drivers); //outputs "Mike,Sue,Matt"

    alert(oCar2.drivers); //outputs "Mike,Sue"



    原型(prototype)鏈

    prototype類似于模板,要實(shí)例化的對(duì)象都以這個(gè)模板為基礎(chǔ), prototype對(duì)象的任何屬性和方法都被傳遞給類的所有實(shí)例。


    所有 JavaScript 內(nèi)部類的 prototype 屬性都是只讀的,所以:不能更改內(nèi)部對(duì)象的 prototype ,只能為內(nèi)部對(duì)象的原型添加或重載屬性和方法


    自定義對(duì)象可以更改其prototype ,即:

    子類類名.prototype=父類對(duì)象實(shí)例;


    1、創(chuàng)建基類

    function Polygon(iSides){ //多邊形

    this.iSides=iSides;

    }

    Polygon.prototype.getArea=function(){

    return 0;

    }


    2、創(chuàng)建子類

    function Triangle(iBase,iHeight){ //三角形對(duì)象

    this.iBase=iBase;

    this.iHeight=iHeight;

    }

    Triangle.prototype=new Polygon(3);

    Triangle.prototype.getArea=function(){

    return 0.5 * this.iBase * this.iHeight;

    }


    function Rectangle(iLength,iWidth){ //矩形對(duì)象

    this.iLength=iLength;

    this.iWidth=iWidth;

    }

    Rectangle.prototype=new Polygon(4);

    Rectangle.prototype.getArea=function(){

    return this.iLength * this.iWidth;

    }


    3、測(cè)試

    var triangle=new Triangle(10,4);

    var rectangle=new Rectangle(8,4);


    alert(triangle.iSides);

    alert(rectangle.iSides);


    alert(triangle.getArea());

    alert(rectangle.getArea());

網(wǎng)站首頁(yè)   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有