JavaScript中淺講ajax圖文詳解
1.ajax入門(mén)案例
1.1 搭建Web環(huán)境
ajax對(duì)于各位來(lái)說(shuō),應(yīng)該都不陌生,正因?yàn)閍jax的產(chǎn)生,導(dǎo)致前臺(tái)頁(yè)面和服務(wù)器之間的數(shù)據(jù)傳輸變得非常容易,同時(shí)還可以實(shí)現(xiàn)頁(yè)面的局部刷新。通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,AJAX 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。
對(duì)于JavaWeb項(xiàng)目而言,ajax主要用于瀏覽器和服務(wù)器之間數(shù)據(jù)的傳輸。
如果是單單地堆砌知識(shí)點(diǎn),會(huì)顯得比較無(wú)聊,那么根據(jù)慣例,我先不繼續(xù)介紹ajax,而是來(lái)寫(xiě)一個(gè)案例吧。
打開(kāi)eclipse,新建一個(gè)web項(xiàng)目。
如果對(duì)JavaWeb項(xiàng)目還不太清楚的,可以去參考我之前的文章。我
目錄結(jié)構(gòu):
<?xml version="1.0" encoding="UTF-8"?> <web-app> </web-app>
這樣就好了,web項(xiàng)目搭建完畢。
暫時(shí)不要往下寫(xiě),先確保我們到目前為止的工作是沒(méi)問(wèn)題的。
驗(yàn)證方法就是在WebContent目錄下,新建一個(gè)空的jsp頁(yè)面,里面隨便寫(xiě)的什么。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body style="padding:100px"> <h1>Hello World</h1> </body> </html>
啟動(dòng)tomcat,把這個(gè)項(xiàng)目跑起來(lái)。
沒(méi)報(bào)錯(cuò)。
打開(kāi)瀏覽器,輸入訪(fǎng)問(wèn)地址,我這里的tomcat端口號(hào)是80 ,默認(rèn)可以不寫(xiě)。
http://localhost/ajax/index.jsp
來(lái)了,沒(méi)問(wèn)題。
好的,這說(shuō)明我們的web項(xiàng)目搭建沒(méi)有問(wèn)題。
1.2 編寫(xiě)服務(wù)器程序Servlet
個(gè)人感悟,精粹整理
web環(huán)境已經(jīng)搭好,接下來(lái),讓我們來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的Servlet程序,tomcat是一個(gè)服務(wù)器,現(xiàn)在它里面有一個(gè)名字叫做ajax的web項(xiàng)目,那么這些Servlet就好比是web項(xiàng)目里面的一個(gè)個(gè)小功能。
你的電腦里面有QQ,Word,殺毒軟件等程序。一個(gè)web項(xiàng)目,也就是一個(gè)應(yīng)用程序。本質(zhì)上和你電腦上的QQ概念是一樣一樣的。
你打開(kāi)QQ,可以聊天,語(yǔ)音,視頻。這些小功能,類(lèi)比到JavaWeb項(xiàng)目,就是一個(gè)個(gè)Servlet。
很多人都知道框架,比如大名鼎鼎的SpringMVC,里面有一個(gè)個(gè)的Controller,其實(shí)這些Controller到底是什么玩意,不要怕,他們其實(shí)就是對(duì)Servlet做了一個(gè)封裝,本質(zhì)上還是一樣一樣的。
我們寫(xiě)一個(gè)Servlet,都需要去web.xml里面注冊(cè)一下,否則就用不了。你安裝一個(gè)QQ,注冊(cè)表里面是不是肯定也需要注冊(cè)一下啊,這不還是一樣一樣的嗎?
好了,閑話(huà)不多說(shuō)。我們來(lái)寫(xiě)一個(gè)小功能,也就是一個(gè)Servlet。
繼承HttpServlet,同時(shí)改寫(xiě)doGet方法
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("111"); } }
里面我們先什么也不寫(xiě)。
接下來(lái),我們要在web.xml里面把這個(gè)Servlet注冊(cè)一下。
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- 這里是servlet的名字 --> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> <!-- 這里寫(xiě)servlet類(lèi)在的包路徑 --> </servlet> <servlet-mapping> <!-- 這里是地址映射 --> <servlet-name>MyServlet</servlet-name> <!-- 這里寫(xiě)servlet映射地址 --> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> </web-app>
OK,Servlet注冊(cè)完畢,我們先來(lái)訪(fǎng)問(wèn)一下這個(gè)功能。
重啟tomcat。
訪(fǎng)問(wèn):http://localhost/ajax/MyServlet
1.3 前臺(tái)頁(yè)面設(shè)計(jì)
服務(wù)器小程序已經(jīng)差不多了,現(xiàn)在我們?yōu)榱撕头?wù)器進(jìn)行交互,就需要編寫(xiě)前臺(tái)頁(yè)面。這個(gè)頁(yè)面也就是給用戶(hù)看的。換言之,用戶(hù)只能通過(guò)前臺(tái)頁(yè)面來(lái)訪(fǎng)問(wèn)我們的Servlet。
我們來(lái)寫(xiě)一個(gè)小案例,在頁(yè)面上發(fā)送一句話(huà)到服務(wù)器,然后服務(wù)器給出一個(gè)回應(yīng)就行了。
就是這么一個(gè)簡(jiǎn)單的案例,主要用來(lái)熟悉一下流程。
為了簡(jiǎn)單起見(jiàn),我就不自己調(diào)css樣式了,直接用bootstrap吧。
引入bootstrap的核心css文件。
然后,修改index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="${pageContext.request.contextPath}/bootstrap/css/bootstrap.min.css"> <title>Insert title here</title> <style type="text/css"> .container { margin-top:100px; } </style> <script> window.onload = function(){ var btn = document.getElementById("submit"); btn.onclick = function(){ alert(); } }; </script> </head> <body> <div class="container"> <div class="row"> <div class="col-lg-8"> <div class="input-group"> <input type="text" class="form-control"> <span class="input-group-btn"> <button id="submit" class="btn btn-default" type="button">提交</button> </span> </div> </div> </div> </div> </body> </html>
頁(yè)面效果:
1.4 基于get方式的數(shù)據(jù)請(qǐng)求
當(dāng)我們點(diǎn)擊提交按鈕,就alert()一下,如果成功的話(huà),那么說(shuō)明點(diǎn)擊事件沒(méi)有問(wèn)題。然后,繼續(xù)往下寫(xiě)代碼。
如果是以往,我們都是通過(guò)form表單來(lái)進(jìn)行提交的,可是這樣的話(huà),就會(huì)有一個(gè)問(wèn)題,就是頁(yè)面會(huì)刷新,而且代碼也相對(duì)比較難懂。
自從ajax出來(lái)了之后,這種情況得到了巨大的改善,局部刷新技術(shù)在當(dāng)時(shí)來(lái)看,還是非常不錯(cuò)的。
我先把實(shí)現(xiàn)代碼給出:
btn.onclick = function(){ var xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("get","MyServlet?message="+document.getElementsByTagName("input")[0].value,true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200){ alert(xhr.responseText); } }; }
同時(shí)修改一下MyServlet
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg = req.getParameter("message"); System.out.println(msg); }
重啟 tomcat ,訪(fǎng)問(wèn)index.jsp頁(yè)面。
現(xiàn)在的瀏覽器一般都有調(diào)試功能,按一下F12,調(diào)試界面就出來(lái)了。然后,找到一個(gè)network,以谷歌瀏覽器為例
network視圖會(huì)把所有的數(shù)據(jù)交互顯示出來(lái),包括引入的 js , css文件,還有各種請(qǐng)求和回應(yīng),都會(huì)在這里顯示出來(lái)。
比如,現(xiàn)在我刷新一下頁(yè)面
我這么一刷新,首先服務(wù)器接收到的是這么一個(gè) URL: http://localhost/ajax/index.jsp
這就是一個(gè)請(qǐng)求,服務(wù)器收到這個(gè)請(qǐng)求后,返回給我 index.jsp頁(yè)面和bootstrap.min.css這個(gè)文件。
因?yàn)槲以趇ndex.jsp的確引入過(guò)bootstrap.min.css,所以他也就一起加載進(jìn)來(lái)了。
現(xiàn)在,我輸入一句話(huà),點(diǎn)擊提交,看看會(huì)發(fā)生什么?
我們把input框里面的內(nèi)容提交到服務(wù)器程序 MyServlet
控制臺(tái)已經(jīng)接受到了,這里比較幸運(yùn),沒(méi)有遇到中文亂碼的問(wèn)題,那么先不管亂碼了。
因?yàn)镸yServlet中沒(méi)有返回什么東西,所以alert出來(lái)的是空。
好的,那我們給瀏覽器也返回一句話(huà)吧。
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String msg = req.getParameter("message"); System.out.println(msg); resp.setContentType("text/html;charset=utf-8"); PrintWriter out=resp.getWriter(); out.println("你好,這是服務(wù)器返回的信息!"); out.flush(); out.close(); }
再次點(diǎn)擊提交按鈕
OK了。
接下來(lái),看一下請(qǐng)求的具體信息
在比對(duì)一下js代碼,就一目了然了。
btn.onclick = function(){ var xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("get","MyServlet?message="+document.getElementsByTagName("input")[0].value,true); xhr.send(); xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200){ alert(xhr.responseText); } }; }
readyState:
0: 請(qǐng)求未初始化
1: 服務(wù)器連接已建立,還沒(méi)發(fā)送
2: 請(qǐng)求已接收
3: 請(qǐng)求處理中
4: 請(qǐng)求已完成,且響應(yīng)已就緒
當(dāng) readyState 等于 4 且狀態(tài)為 200 時(shí),表示響應(yīng)已就緒.
請(qǐng)求方式是get,并且只有當(dāng)返回的狀態(tài)碼為200的時(shí)候,才會(huì)打印出responseText,這個(gè)就是對(duì)應(yīng)的
out.println("你好,這是服務(wù)器返回的信息!");
這句話(huà)。
1.5 基于post方式的數(shù)據(jù)請(qǐng)求
get方法會(huì)在URL地址欄里顯示你提交所帶的值,post方法不會(huì)。所以,相對(duì)來(lái)說(shuō),post方法比較安全。
post方法在流程上和get方式差不多,我就直接上代碼了:
window.onload = function(){ var btn = document.getElementById("submit"); btn.onclick = function(){ var xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); xhr.open("post","MyServlet",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); var postData = {message : document.getElementsByTagName("input")[0].value}; var postDataStr = (function(obj){ // 轉(zhuǎn)成post需要的字符串. var str = ""; for(var prop in obj){ str += prop + "=" + obj[prop] + "&" } return str; })(postData); alert(postDataStr); xhr.send(postDataStr); xhr.onreadystatechange = function(){ if(xhr.readyState==4 && xhr.status==200){ alert(xhr.responseText); } }; } };
MyServlet.java
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String msg = req.getParameter("message"); System.out.println(msg); resp.setContentType("text/html;charset=utf-8"); PrintWriter out=resp.getWriter(); out.println("你好,這是服務(wù)器返回的信息!"); out.flush(); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
以上所述是小編給大家介紹的JavaScript中淺講ajax圖文詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 詳解js的延遲對(duì)象、跨域、模板引擎、彈出層、AJAX【附實(shí)例下載】
- JavaScript Ajax實(shí)現(xiàn)異步通信
- JS 攔截全局ajax請(qǐng)求實(shí)例解析
- Ajax與用戶(hù)交互的JSON數(shù)據(jù)存儲(chǔ)格式
- $.ajax json數(shù)據(jù)傳遞方法
- jQuery Ajax異步處理Json數(shù)據(jù)詳解
- 淺析ajax請(qǐng)求json數(shù)據(jù)并用js解析(示例分析)
- javascript實(shí)現(xiàn)原生ajax的幾種方法介紹
- 用ajax動(dòng)態(tài)加載需要的js文件
- ThinkPHP中使用ajax接收json數(shù)據(jù)的方法
- ThinkPHP通過(guò)AJAX返回JSON的兩種實(shí)現(xiàn)方法
- JS實(shí)現(xiàn)Ajax的方法分析
相關(guān)文章
Svelte框架實(shí)現(xiàn)表格協(xié)同文檔的示例
本文主要介紹了Svelte框架實(shí)現(xiàn)表格協(xié)同文檔的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01http頭部字段Origin和Access-Control-Allow-Origin解決請(qǐng)求跨域
這篇文章主要為大家介紹了http頭部字段Origin和Access-Control-Allow-Origin解決請(qǐng)求跨域示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06容易造成JavaScript內(nèi)存泄露幾個(gè)方面
這篇文章主要介紹了容易造成JavaScript內(nèi)存泄露幾個(gè)方面,本文講解了多個(gè)會(huì)在Chrome V8中產(chǎn)生內(nèi)存泄漏的示例,需要的朋友可以參考下2014-09-09Web 開(kāi)發(fā)中Ajax的Session 超時(shí)處理方法
下面小編就為大家?guī)?lái)一篇Web 開(kāi)發(fā)中Ajax的Session 超時(shí)處理方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01javascript實(shí)現(xiàn)將文件保存到本地方法匯總
本文給大家匯總介紹了3中使用javascript實(shí)現(xiàn)將文件保存到本地的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-07-07基于JavaScript實(shí)現(xiàn)前端文件的斷點(diǎn)續(xù)傳
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)前端文件的斷點(diǎn)續(xù)傳的相關(guān)資料,需要的朋友可以參考下2016-10-10