AJAX应用【股票案例、验证码校验】
一、股票案例
我們要做的是股票的案例,它能夠無刷新地更新股票的數據。當鼠標移動到具體的股票中,它會顯示具體的信息。
我們首先來看一下要做出來的效果:
1.1服務器端分析
首先,從效果圖我們可以看見很多股票基本信息:昨天收盤價、今天開盤價、最高價、最低價、當前價格、漲幅。這些信息我們用一個類來描述出來。
我們發現數據是定時刷新的,于是我們需要一個定時器。
服務器端的數據和客戶端交互,我們使用JSON吧
1.2服務器端代碼
1.2.1Stock股票類的代碼
- 股票基本信息:
- Stock的構造函數:
- setCurrent()方法代碼:
1.2.2Servlet的代碼
- init()初始化代碼:
- 服務器一啟動就應該初始化Servlet
- doPost()代碼:
- 拼接成的JSON數據:
1.3客戶端分析之一
客戶端要做的就是顯示數據,每隔兩秒就和服務器進行一次交互
- 用到Ajax和setInterval()方法
1.3.1html代碼
使用div嵌套span和a標簽來進行顯示,span裝載的就是服務端返回json的current數據
<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,并設置span的內容
- 效果
1.4客戶端分析之二
當鼠標移動到具體的股票超鏈接的時候,會顯示具體的數據,并且數據是動態的
- 在超鏈接上綁定事件
- 取出和服務器交互的數據,顯示在頁面上
1.4.1html代碼:
綁定事件,只要鼠標移動到超鏈接上就觸發事件
<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>當前:<span id="current"></span></div><div>最高:<span id="high"></span></div><div>漲幅:<span id="range"></span></div> </div></body>1.4.2css代碼
詳細框的信息默認是隱藏的
<style type="text/css">#toolTip {border: 1px solid #000;width: 150px;position: absolute;display: none;}</style>1.4.3javaScript代碼
得到交互的數據,設置span里面的值
function update() {var stock = json[sid];//得到相對應的控件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");//設置具體信息的值high.innerHTML = stock.high;range.innerHTML = stock.range;current.innerHTML = stock.current;yesterday.innerHTML = stock.yesterday;today.innerHTML = stock.today;low.innerHTML = stock.low;//如果數值比昨天開盤價低,反則就是紅色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';}//如果現在的價格比昨天開盤高,那么漲幅是紅色if (stock.current > stock.yesterday) {range.style.color = 'red';current.style.color = 'red';} else {range.style.color = 'green';current.style.color = 'green';} }只有鼠標移到超鏈接上,才明確id的值是多少!
function callBackFunction() {if (httpRequest.readyState == 4) {if (httpRequest.status == 200) {//得到服務器端返回的JSON數據json= eval(httpRequest.responseText);//更新詳細框的數據,當鼠標移動到超鏈接上才確定有id,于是判斷有沒有idif(sid) {update();}//遍歷出每個JSON對象【也就是json的id】for (var id in json) {//得到每個stock對象var stock = json[id];//將當前的價格設置到span節點里面document.getElementById(id).innerHTML = stock.current;//比較當前價格和昨天開盤價格,如果大于就是紅色,小于就是綠色if (stock.current > stock.yesterday) {document.getElementById(id).style.color = 'red';} else {document.getElementById(id).style.color = 'green';}}}} }function showTool(node) {//得到鼠標移動到具體股票的idsid = node.parentNode.getElementsByTagName("span")[0].id;//把詳細框框顯示出來document.getElementById("toolTip").style.display = 'block';} function clearTool() {document.getElementById("toolTip").style.display = 'none'; }1.5最終效果:
1.6總結要點
①:這是由AJAX來實現的,因為它無刷新的動態交互數據。
②:服務器端應該保存著股票的基本信息。于是乎,我們用一個類來裝載著這些信息【信息之間的關系就不一一說明了,因為每個案例用的可能都不一樣】
③:用到了DecimalFormat類來格式化小數變為自己想要的格式
④:使用HashMap來裝載這些股票,使用Map集合主要是在客戶端中,可以通過鍵來訪問具體的股票,只要能訪問到股票了,那么一切就好說了。
⑤:當然啦,裝載股票的任務就交給init()方法,因為只需要裝載一次。
⑥:我們會發現,股票的信息是不斷會變化的,所以我們使用定時器和Random類來不斷修改股票的信息
⑦:JavaScript和服務端交互使用AJAX,要么使用XML,要么就是JSON,這次我們采用的是JSON
⑧:JavaScript使用XMLHttpRequest對象得到Servlet返回給瀏覽器的JSON數據,解析JSON數據,變成是JavaScript對象
⑨:在頁面上顯示服務端帶過來的數據,一般都是使用div來顯示【塊級】,用控件綁定id,在JavaScript中得到控件,填充數據。這樣就是動態地修改頁面的數據了。
⑩:瀏覽器想要不斷地從服務端獲取股票的數據,那么就需要不斷地與服務端交互,解析JSON,填充數據.....這種我們可以通過setInterval()定時器來做
①①:想要修改字體的顏色,只要獲取它的控件再style.color就可以修改了。
①②:鼠標移動到具體的股票鏈接的時候,會出現股票的詳細信息時,這明顯就是為超鏈接綁定了事件
①③:股票的詳細信息用一個框框裝載著,那么我們就在css中初始化這個框框,它平時是不顯示出來的,只用在鼠標移到它那里的時候才顯示,我們把display=“none”就行了。
①④:在響應事件的時候,我們需要知道用戶是移動到哪一個超鏈接上,所以要獲取得到具體的超鏈接id。知道id以后,我們就知道用戶想要知道的股票是哪一個了。
①⑤:股票的信息也想要及時的更新,那么我們想把它抽取成一個方法,在AJAX回調方法中加入進去就行了。當然了,id和具體股票對象應該是全局的變量【這樣才能夠在別的方法中用到】
二、驗證碼校驗
對于驗證碼檢查我們并不會陌生,我們在學習Session的時候已經使用過了驗證碼檢查了。詳細可參考:http://blog.csdn.net/hon_3y/article/details/54799494#t11
我們當時是同步檢查驗證碼是否正確的,其實沒有必要。因為就驗證一個輸入框的數據,沒必要使用同步的方式驗證【使用異步對用戶體驗更加友好】
2.1分析
當用戶輸入完4位數字的時候,就去服務器端驗證是否需要相同,如果相同,那么返回一個打鉤的圖片。如果不同,那么就返回一個打叉的圖片
2.1.1前臺分析
- 綁定鍵盤輸入事件
- 當輸入數達到4的時候,就與服務器交互
- 得到服務器帶過來的圖片,使用DOM添加到對應的位置
2.1.2后臺分析
- 得到前臺帶過來的值
- 判斷該值與Session保存的是否相同
- 根據判斷值返回對應的圖片
2.2編寫JSP
值得注意的是:要獲取td定義的id,外邊一定要套上table標簽。。。我在剛開始寫的時候,是沒有table標簽的。然后死活得不到td的標簽....很煩...
<%--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>驗證碼校驗</title><script type="text/javascript" src="js/ajax.js"></script> </head> <body><%--###################展示頁面#############################--%><table><tr><td>驗證碼:</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><%--###################綁定鍵盤事件#############################--%><script type="text/javascript">document.getElementById("checkCode").onkeyup = function () {//得到輸入框的內容,把的前后空格都去除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回調函數*******************************/ajax.onreadystatechange = function () {if (ajax.readyState == 4) {if (ajax.status == 200) {//得到服務器帶過來的數據var tip = ajax.responseText;/*******************使用DOM把數據添加到頁面上*******************************/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 {//清空圖片var td = document.getElementById("result");td.innerHTML = "";}};</script></body> </html>- 處理請求的Servlet
2.3測試
2.4總結
-
使用AJAX驗證校驗碼主要是監聽鍵盤的響應事件
- 要獲取td標簽的數據,外邊一定要套有table標簽!【別偷懶不寫table標簽】
- 當輸入框的數值數為4的時候就與服務器進行交互,服務器返回一張圖片。
- 可以用自定義的trim()把數據的前后空格去掉,通過正則表達式來去除空格。
- 當輸入框的數值數不為4的時候就把圖片的內容清空
如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y
總結
以上是生活随笔為你收集整理的AJAX应用【股票案例、验证码校验】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript:this 关键字
- 下一篇: 关于喝酒的心情说说222个