AJAX应用【股票案例、验证码校验】
一、股票案例
我們要做的是股票的案例,它能夠無(wú)刷新地更新股票的數(shù)據(jù)。當(dāng)鼠標(biāo)移動(dòng)到具體的股票中,它會(huì)顯示具體的信息。
我們首先來(lái)看一下要做出來(lái)的效果:
1.1服務(wù)器端分析
首先,從效果圖我們可以看見(jiàn)很多股票基本信息:昨天收盤(pán)價(jià)、今天開(kāi)盤(pán)價(jià)、最高價(jià)、最低價(jià)、當(dāng)前價(jià)格、漲幅。這些信息我們用一個(gè)類來(lái)描述出來(lái)。
我們發(fā)現(xiàn)數(shù)據(jù)是定時(shí)刷新的,于是我們需要一個(gè)定時(shí)器。
服務(wù)器端的數(shù)據(jù)和客戶端交互,我們使用JSON吧
1.2服務(wù)器端代碼
1.2.1Stock股票類的代碼
- 股票基本信息:
- Stock的構(gòu)造函數(shù):
- setCurrent()方法代碼:
1.2.2Servlet的代碼
- init()初始化代碼:
- 服務(wù)器一啟動(dòng)就應(yīng)該初始化Servlet
- doPost()代碼:
- 拼接成的JSON數(shù)據(jù):
1.3客戶端分析之一
客戶端要做的就是顯示數(shù)據(jù),每隔兩秒就和服務(wù)器進(jìn)行一次交互
- 用到Ajax和setInterval()方法
1.3.1html代碼
使用div嵌套span和a標(biāo)簽來(lái)進(jìn)行顯示,span裝載的就是服務(wù)端返回json的current數(shù)據(jù)
<body onload="show()"><div><a href="#">百度:</a><span id="1"></span> </div> <div><a href="#">阿里巴巴:</a><span id="2"></span> </div> <div><a href="#">騰訊:</a><span id="3"></span> </div> <div><a href="#">谷歌:</a><span id="4"></span> </div></body>1.3.2javaScript代碼
- 解析JSON,并設(shè)置span的內(nèi)容
- 效果
1.4客戶端分析之二
當(dāng)鼠標(biāo)移動(dòng)到具體的股票超鏈接的時(shí)候,會(huì)顯示具體的數(shù)據(jù),并且數(shù)據(jù)是動(dòng)態(tài)的
- 在超鏈接上綁定事件
- 取出和服務(wù)器交互的數(shù)據(jù),顯示在頁(yè)面上
1.4.1html代碼:
綁定事件,只要鼠標(biāo)移動(dòng)到超鏈接上就觸發(fā)事件
<body onload="show()"><div><a href="#" onmouseover="showTool(this)" onmouseleave="clearTool()">百度:</a><span id="1"></span> </div> <div><a href="#" onmouseover="showTool(this)" onmouseleave="clearTool()">阿里巴巴:</a><span id="2"></span> </div> <div><a href="#" onmouseover="showTool(this)" onmouseleave="clearTool()">騰訊:</a><span id="3"></span> </div> <div><a href="#" onmouseover="showTool(this)" onmouseleave="clearTool()">谷歌:</a><span id="4"></span> </div><div id="toolTip"><div>昨收:<span id="yesterday"></span></div><div>今收:<span id="today"></span></div><div>最低:<span id="low"></span></div><div>當(dāng)前:<span id="current"></span></div><div>最高:<span id="high"></span></div><div>漲幅:<span id="range"></span></div> </div></body>1.4.2css代碼
詳細(xì)框的信息默認(rèn)是隱藏的
<style type="text/css">#toolTip {border: 1px solid #000;width: 150px;position: absolute;display: none;}</style>1.4.3javaScript代碼
得到交互的數(shù)據(jù),設(shè)置span里面的值
function update() {var stock = json[sid];//得到相對(duì)應(yīng)的控件var yesterday = document.getElementById("yesterday");var today = document.getElementById("today");var low = document.getElementById("low");var high = document.getElementById("high");var range = document.getElementById("range");var current = document.getElementById("current");//設(shè)置具體信息的值high.innerHTML = stock.high;range.innerHTML = stock.range;current.innerHTML = stock.current;yesterday.innerHTML = stock.yesterday;today.innerHTML = stock.today;low.innerHTML = stock.low;//如果數(shù)值比昨天開(kāi)盤(pán)價(jià)低,反則就是紅色if (stock.today > stock.yesterday) {today.style.color = 'red';} else {today.style.color = 'green';}if (stock.low > stock.yesterday) {low.style.color = 'red';} else {low.style.color = 'green';}if (stock.high > stock.yesterday) {high.style.color = 'red';} else {high.style.color = 'green';}//如果現(xiàn)在的價(jià)格比昨天開(kāi)盤(pán)高,那么漲幅是紅色if (stock.current > stock.yesterday) {range.style.color = 'red';current.style.color = 'red';} else {range.style.color = 'green';current.style.color = 'green';} }只有鼠標(biāo)移到超鏈接上,才明確id的值是多少!
function callBackFunction() {if (httpRequest.readyState == 4) {if (httpRequest.status == 200) {//得到服務(wù)器端返回的JSON數(shù)據(jù)json= eval(httpRequest.responseText);//更新詳細(xì)框的數(shù)據(jù),當(dāng)鼠標(biāo)移動(dòng)到超鏈接上才確定有id,于是判斷有沒(méi)有idif(sid) {update();}//遍歷出每個(gè)JSON對(duì)象【也就是json的id】for (var id in json) {//得到每個(gè)stock對(duì)象var stock = json[id];//將當(dāng)前的價(jià)格設(shè)置到span節(jié)點(diǎn)里面document.getElementById(id).innerHTML = stock.current;//比較當(dāng)前價(jià)格和昨天開(kāi)盤(pán)價(jià)格,如果大于就是紅色,小于就是綠色if (stock.current > stock.yesterday) {document.getElementById(id).style.color = 'red';} else {document.getElementById(id).style.color = 'green';}}}} }function showTool(node) {//得到鼠標(biāo)移動(dòng)到具體股票的idsid = node.parentNode.getElementsByTagName("span")[0].id;//把詳細(xì)框框顯示出來(lái)document.getElementById("toolTip").style.display = 'block';} function clearTool() {document.getElementById("toolTip").style.display = 'none'; }1.5最終效果:
1.6總結(jié)要點(diǎn)
①:這是由AJAX來(lái)實(shí)現(xiàn)的,因?yàn)樗鼰o(wú)刷新的動(dòng)態(tài)交互數(shù)據(jù)。
②:服務(wù)器端應(yīng)該保存著股票的基本信息。于是乎,我們用一個(gè)類來(lái)裝載著這些信息【信息之間的關(guān)系就不一一說(shuō)明了,因?yàn)槊總€(gè)案例用的可能都不一樣】
③:用到了DecimalFormat類來(lái)格式化小數(shù)變?yōu)樽约合胍母袷?/p>
④:使用HashMap來(lái)裝載這些股票,使用Map集合主要是在客戶端中,可以通過(guò)鍵來(lái)訪問(wèn)具體的股票,只要能訪問(wèn)到股票了,那么一切就好說(shuō)了。
⑤:當(dāng)然啦,裝載股票的任務(wù)就交給init()方法,因?yàn)橹恍枰b載一次。
⑥:我們會(huì)發(fā)現(xiàn),股票的信息是不斷會(huì)變化的,所以我們使用定時(shí)器和Random類來(lái)不斷修改股票的信息
⑦:JavaScript和服務(wù)端交互使用AJAX,要么使用XML,要么就是JSON,這次我們采用的是JSON
⑧:JavaScript使用XMLHttpRequest對(duì)象得到Servlet返回給瀏覽器的JSON數(shù)據(jù),解析JSON數(shù)據(jù),變成是JavaScript對(duì)象
⑨:在頁(yè)面上顯示服務(wù)端帶過(guò)來(lái)的數(shù)據(jù),一般都是使用div來(lái)顯示【塊級(jí)】,用控件綁定id,在JavaScript中得到控件,填充數(shù)據(jù)。這樣就是動(dòng)態(tài)地修改頁(yè)面的數(shù)據(jù)了。
⑩:瀏覽器想要不斷地從服務(wù)端獲取股票的數(shù)據(jù),那么就需要不斷地與服務(wù)端交互,解析JSON,填充數(shù)據(jù).....這種我們可以通過(guò)setInterval()定時(shí)器來(lái)做
①①:想要修改字體的顏色,只要獲取它的控件再style.color就可以修改了。
①②:鼠標(biāo)移動(dòng)到具體的股票鏈接的時(shí)候,會(huì)出現(xiàn)股票的詳細(xì)信息時(shí),這明顯就是為超鏈接綁定了事件
①③:股票的詳細(xì)信息用一個(gè)框框裝載著,那么我們就在css中初始化這個(gè)框框,它平時(shí)是不顯示出來(lái)的,只用在鼠標(biāo)移到它那里的時(shí)候才顯示,我們把display=“none”就行了。
①④:在響應(yīng)事件的時(shí)候,我們需要知道用戶是移動(dòng)到哪一個(gè)超鏈接上,所以要獲取得到具體的超鏈接id。知道id以后,我們就知道用戶想要知道的股票是哪一個(gè)了。
①⑤:股票的信息也想要及時(shí)的更新,那么我們想把它抽取成一個(gè)方法,在AJAX回調(diào)方法中加入進(jìn)去就行了。當(dāng)然了,id和具體股票對(duì)象應(yīng)該是全局的變量【這樣才能夠在別的方法中用到】
二、驗(yàn)證碼校驗(yàn)
對(duì)于驗(yàn)證碼檢查我們并不會(huì)陌生,我們?cè)趯W(xué)習(xí)Session的時(shí)候已經(jīng)使用過(guò)了驗(yàn)證碼檢查了。詳細(xì)可參考:http://blog.csdn.net/hon_3y/article/details/54799494#t11
我們當(dāng)時(shí)是同步檢查驗(yàn)證碼是否正確的,其實(shí)沒(méi)有必要。因?yàn)?strong>就驗(yàn)證一個(gè)輸入框的數(shù)據(jù),沒(méi)必要使用同步的方式驗(yàn)證【使用異步對(duì)用戶體驗(yàn)更加友好】
2.1分析
當(dāng)用戶輸入完4位數(shù)字的時(shí)候,就去服務(wù)器端驗(yàn)證是否需要相同,如果相同,那么返回一個(gè)打鉤的圖片。如果不同,那么就返回一個(gè)打叉的圖片
2.1.1前臺(tái)分析
- 綁定鍵盤(pán)輸入事件
- 當(dāng)輸入數(shù)達(dá)到4的時(shí)候,就與服務(wù)器交互
- 得到服務(wù)器帶過(guò)來(lái)的圖片,使用DOM添加到對(duì)應(yīng)的位置
2.1.2后臺(tái)分析
- 得到前臺(tái)帶過(guò)來(lái)的值
- 判斷該值與Session保存的是否相同
- 根據(jù)判斷值返回對(duì)應(yīng)的圖片
2.2編寫(xiě)JSP
值得注意的是:要獲取td定義的id,外邊一定要套上table標(biāo)簽。。。我在剛開(kāi)始寫(xiě)的時(shí)候,是沒(méi)有table標(biāo)簽的。然后死活得不到td的標(biāo)簽....很煩...
<%--Created by IntelliJ IDEA.User: ozcDate: 2017/5/17Time: 20:52To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>驗(yàn)證碼校驗(yàn)</title><script type="text/javascript" src="js/ajax.js"></script> </head> <body><%--###################展示頁(yè)面#############################--%><table><tr><td>驗(yàn)證碼:</td><td><input type="text" id="checkCode" name="checkCode"></td><td><img src="01_image.jsp"/></td><td id="result"></td></tr> </table><%--###################去除空格方法#############################--%> <script type="text/javascript">function trim(str) {//去除左邊的空格str.replace("/^\s*/", "");//去除右邊的空格str.replace("/\s*$/", "");return str;} </script><%--###################綁定鍵盤(pán)事件#############################--%><script type="text/javascript">document.getElementById("checkCode").onkeyup = function () {//得到輸入框的內(nèi)容,把的前后空格都去除var keyValue = this.value;keyValue = trim(keyValue);/*******************ajax代碼*******************************/if (keyValue.length == 4) {var ajax = createAJAX();var method = "post";var url = "${pageContext.request.contextPath}/CheckCodeServlet?time=" + new Date().getTime();ajax.open(method, url);ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");ajax.send("keyValue=" + keyValue);/*******************ajax回調(diào)函數(shù)*******************************/ajax.onreadystatechange = function () {if (ajax.readyState == 4) {if (ajax.status == 200) {//得到服務(wù)器帶過(guò)來(lái)的數(shù)據(jù)var tip = ajax.responseText;/*******************使用DOM把數(shù)據(jù)添加到頁(yè)面上*******************************/var img = document.createElement("img");img.src = tip;img.style.width = "14px";img.style.height = "14px";var td = document.getElementById("result");td.innerHTML = "";td.appendChild(img);}}};}else {//清空?qǐng)D片var td = document.getElementById("result");td.innerHTML = "";}};</script></body> </html>- 處理請(qǐng)求的Servlet
2.3測(cè)試
2.4總結(jié)
-
使用AJAX驗(yàn)證校驗(yàn)碼主要是監(jiān)聽(tīng)鍵盤(pán)的響應(yīng)事件
- 要獲取td標(biāo)簽的數(shù)據(jù),外邊一定要套有table標(biāo)簽!【別偷懶不寫(xiě)table標(biāo)簽】
- 當(dāng)輸入框的數(shù)值數(shù)為4的時(shí)候就與服務(wù)器進(jìn)行交互,服務(wù)器返回一張圖片。
- 可以用自定義的trim()把數(shù)據(jù)的前后空格去掉,通過(guò)正則表達(dá)式來(lái)去除空格。
- 當(dāng)輸入框的數(shù)值數(shù)不為4的時(shí)候就把圖片的內(nèi)容清空
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章的同學(xué),可以關(guān)注微信公眾號(hào):Java3y
總結(jié)
以上是生活随笔為你收集整理的AJAX应用【股票案例、验证码校验】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javascript:this 关键字
- 下一篇: 关于喝酒的心情说说222个