日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AJAX应用【股票案例、验证码校验】

發布時間:2023/12/31 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AJAX应用【股票案例、验证码校验】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、股票案例

我們要做的是股票的案例,它能夠無刷新地更新股票的數據。當鼠標移動到具體的股票中,它會顯示具體的信息。

我們首先來看一下要做出來的效果:

1.1服務器端分析

首先,從效果圖我們可以看見很多股票基本信息:昨天收盤價、今天開盤價、最高價、最低價、當前價格、漲幅。這些信息我們用一個類來描述出來。

我們發現數據是定時刷新的,于是我們需要一個定時器。

服務器端的數據和客戶端交互,我們使用JSON吧

1.2服務器端代碼

1.2.1Stock股票類的代碼

  • 股票基本信息:
private String id;private String name;private double yesterday;private double today ;private double highest;private double lowest;private double current;private String range ;//各種setter和getter
  • Stock的構造函數:
/*** id,name,yesterday這三個參數都是固定的,其他的屬性都是可變的。* 因此我們構造函數就傳入這三個值* */ public Stock(String id, String name, double yesterday) {this.id = id;this.name = name;this.yesterday = yesterday;//把開盤價設定為-1,后面在定時器計算出來的隨機數,如果發現開盤價是-1,就設置第一次的隨機數為開盤價this.today = -1;//把最高、最低、當前的價格都暫且設置成昨天的開盤價,后面我們可以變化的this.highest = yesterday;this.current = yesterday;this.lowest = yesterday;}
  • setCurrent()方法代碼:
/*** 每次設置當前價錢的時候,最高、最低、漲幅都應該隨著當前價錢而變化的*/ public void setCurrent(double current) {//計算出漲幅或跌幅double range = (current - this.yesterday) / this.yesterday;//設置漲幅和跌幅不能超過10%,當前的價格只能是昨天開盤價的1.1倍或0.9倍//當前價格應該是兩位小數DecimalFormat formatPrice = new DecimalFormat("#.00");if (range > 0.1) {current = Double.parseDouble(formatPrice.format(this.yesterday * 1.1));}if (range < -0.1) {current = Double.parseDouble(formatPrice.format(this.yesterday * 0.9));}this.current = current;//如果今天開盤價沒設定,那么就將第一次的當前價作為今天的開盤價if (this.today == -1) {this.today = this.current;}//比較最大值和最小值if (this.current > this.highest) {this.highest = this.current;}if (this.current < this.lowest) {this.lowest = this.current;}//格式化漲幅的字符串,整數兩位,小數兩位DecimalFormat formatRange = new DecimalFormat("##.##%");this.range = formatRange.format(range); }

1.2.2Servlet的代碼

  • init()初始化代碼:
/*** 重寫init()方法,加入一些配置內容*/ @Override public void init(ServletConfig config) throws ServletException {map = new HashMap<>();//新建幾只固定的股票final Stock zhong = new Stock("1", "百度", 1110.1);final Stock fu = new Stock("2", "阿里", 222.2);final Stock cheng = new Stock("3", "騰訊", 333.3);final Stock ou = new Stock("4", "谷歌", 1133.5);//添加到容器中map.put("1", zhong);map.put("2", fu);map.put("3", cheng);map.put("4", ou);//生成隨機數final Random random = new Random();//格式化生成的隨機數final DecimalFormat format = new DecimalFormat("#.00");//Servlet被啟動后1秒開始,每兩秒掃描一次timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {double baidu = random.nextDouble() * 1.1;double ali = random.nextDouble() * 2;double tengxun = random.nextDouble() * 0.3;double geogle = random.nextDouble() * 4;//概率大致都是50%,我們用來做正負if (random.nextBoolean()) {baidu = 0 - baidu;}if (random.nextBoolean()) {ali = 0 - ali;}if (random.nextBoolean()) {tengxun = 0 - tengxun;}if (random.nextBoolean()) {geogle = 0 - geogle;}//設置它們的當前價格zhong.setCurrent(Double.parseDouble(format.format(zhong.getCurrent()+baidu)));fu.setCurrent(Double.parseDouble(format.format(fu.getCurrent()+ali)));cheng.setCurrent(Double.parseDouble(format.format(cheng.getCurrent()+tengxun)));ou.setCurrent(Double.parseDouble(format.format(ou.getCurrent()+geogle)));}}, 1000, 2000);}
  • 服務器一啟動就應該初始化Servlet
<servlet><servlet-name>Refresh</servlet-name><servlet-class>Refresh</servlet-class><load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><servlet-name>Refresh</servlet-name><url-pattern>/Refresh</url-pattern> </servlet-mapping>
  • doPost()代碼:
//封裝成JSON格式,返回給瀏覽器 StringBuffer buffer = new StringBuffer();//這里我們拼接成4個對象 buffer.append("({"); for (Map.Entry<String, Stock> entry : map.entrySet()) {String id = entry.getKey();Stock stock = entry.getValue();buffer.append(id).append(":{yesterday:").append(stock.getYesterday()).append(",today:").append(stock.getToday()).append(",high:").append(stock.getHighest()).append(",low:").append(stock.getLowest()).append(",current:").append(stock.getCurrent()).append(",range:'").append(stock.getRange()).append("'}").append(",");} //消除最后一個逗號 buffer.deleteCharAt(buffer.lastIndexOf(","));//最后補上括號 buffer.append("})");//返回給瀏覽器 response.getWriter().write(buffer.toString());
  • 拼接成的JSON數據:
({3:{yesterday:333.3,today:333.48,high:333.48,low:333.3,current:333.48,range:'0.05%'},2:{yesterday:222.2,today:223.46,high:223.46,low:222.2,current:223.46,range:'0.57%'},1:{yesterday:1110.1,today:1109.73,high:1110.1,low:1109.73,current:1109.73,range:'-0.03%'},4:{yesterday:1133.5,today:1135.49,high:1135.49,low:1133.5,current:1135.49,range:'0.18%'} })

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的內容
function show() {getStock();//每兩秒就取一次數據setInterval(getStock, 2000);} var httpRequest; function getStock() {//力求是最新的響應數據,如果存在httpRequest,那么將上次的httpRequest終止if(httpRequest) {httpRequest.abort();}httpRequest= new XMLHttpRequest();httpRequest.open("GET", "Refresh", true);httpRequest.onreadystatechange = callBackFunction;httpRequest.send(null);}function callBackFunction() {if(httpRequest.readyState==4) {if(httpRequest.status==200) {//得到服務器端返回的JSON數據var text = httpRequest.responseText;//解析成JavaScript對象var json = eval(text);//遍歷出每個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';}}}} }
  • 效果


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
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;/*** Created by ozc on 2017/5/17.*/ @WebServlet(name = "CheckCodeServlet",urlPatterns = "/CheckCodeServlet") public class CheckCodeServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到帶過來的數據String keyValue = request.getParameter("keyValue");//得到Session中的數據String checkCodeInSession = (String) request.getSession().getAttribute("CHECKNUM");response.setContentType("text/html;charset=UTF-8");String src = "images/MsgError.gif";//判斷倆數據是否相同if (keyValue.equals(checkCodeInSession)) {src = "images/MsgSent.gif";}PrintWriter writer = response.getWriter();writer.write(src);writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }

2.3測試


2.4總結

  • 使用AJAX驗證校驗碼主要是監聽鍵盤的響應事件

    • 要獲取td標簽的數據,外邊一定要套有table標簽!【別偷懶不寫table標簽】
    • 當輸入框的數值數為4的時候就與服務器進行交互,服務器返回一張圖片。
    • 可以用自定義的trim()把數據的前后空格去掉,通過正則表達式來去除空格。
    • 當輸入框的數值數不為4的時候就把圖片的內容清空

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章的同學,可以關注微信公眾號:Java3y

總結

以上是生活随笔為你收集整理的AJAX应用【股票案例、验证码校验】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜视频大全 | 中文字幕在线字幕中文 | 私人av| 交hdsexvideos娇小 | 五月天福利视频 | 日韩av激情 | xxxx日本高清 | wwwxxx色| 国产刺激视频 | www.黄色一片 | 久久精品国产一区二区电影 | 金8天国av | 波多野结衣电影在线播放 | 91精品影视 | 免费激情视频网站 | 亚洲欧洲在线播放 | 国产xxx69麻豆国语对白 | 91视频播放 | 国产精品久久久av | 国产精品夫妻自拍 | 国产骚b| 色www亚洲国产阿娇yao | 色狠久| 国产视频第一页 | 日日干综合| 福利影院av| 美女xx网站 | 久久国产一 | 日本一区三区 | 日本加勒比一区 | 五月婷婷一区二区三区 | www欧美日韩 | 99久久精品国产亚洲 | 国产精品一区二区在线播放 | 天堂网a| 国内一级黄色片 | 中文字幕永久 | 国产一级做a爱片久久毛片a | 特黄特黄视频 | 国产精品99久久久久久久 | 欧洲美女av | 精品一区二区日韩 | 中文不卡av| 色综合九九 | 国产色呦呦| 国产911视频| 天天干天天爽天天射 | 日本免费电影一区二区三区 | 日本在线视频一区 | 在线看日韩 | 性色av网址 | 国产欧美一区二区三区在线 | 黑人巨大精品欧美黑寡妇 | 办公室荡乳欲伦交换bd电影 | 成人av播放| 毛片网站在线 | 欧美性xxxx图片 | 十八岁世界在线观看高清免费韩剧 | 精品亚洲一区二区 | 国产日产亚洲系列最新 | 成人合集 | 成人一级影片 | 欧美黄色一级视频 | 亚洲精品白浆 | 久久久99精品 | 色男人天堂av | 精品国产一区二区三区在线 | 免费在线观看一区二区三区 | 欧美另类极品videosbest使用方法 | 人与禽一级全黄 | 日韩一区二区不卡 | 亚州一二区 | 日本免费www | 98成人网| 婷婷日 | 蜜桃视频一区二区三区 | 亚洲免费国产视频 | 成人无高清96免费 | 怡红院国产 | 伊人一区二区三区四区 | 五月婷婷视频在线观看 | 国产凹凸一区二二区 | 亚洲欧美一区二区三区在线 | 亚洲乱码国产乱码精品精软件 | 樱花影院最新免费观看攻略 | 国产中年熟女高潮大集合 | 久久久精品蜜桃 | av综合站| 婷婷伊人久久 | 国产精品无码久久久久 | 亚洲天堂免费观看 | 青青草福利视频 | 欧美mv日韩mv国产 | 久久女人网 | 久久夜色精品国产噜噜亚洲av | 国产波霸爆乳一区二区 | 精品成人在线 | 三上悠亚ssⅰn939无码播放 | 欧美黑人xxx|