您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > javascript

用 JSON 处理缓存

时间:2019-07-11 11:09:19  来源:  作者:

用 JSON 处理缓存

了解如何在客户端缓存验证元数据

每个应用程序的开发都是为了解决某个领域的问题。而每个领域都有自己的一套约束数据的规则和规范。应用程序将这些约束应用于数据时,约束也就成了验证。所有应用程序都需要验证用户输入的数据。

目前,应用程序一般都使用 if-else 语句组合来验证数据。这些语句包含了开发人员硬编码或通过服务器端代码置入的验证数据。通常,开发人员会使用服务器端代码来避免可能导致 JAVAServer Page(JSP)的细微数据更改。

您可以使用 JavaScript Object Notation(JSON)来分组和缓存元数据,并使用 JavaScript 函数来访问元数据以验证用户输入。

JavaScript 中有分散的元数据时,您无法控制服务器将评估多少数据以及有多少数据传递到客户机。所有服务器端代码片段都将被评估并发送到服务器上。但是,使用 JSON 缓存数据时,您可以完全控制向客户机发送的元数据量,因为服务器端代码将生成 JSON 形式的元数据。这有助于仅将元数据发送至与看到或输入数据的用户相对应的客户机上。

您还可以使用 JSON 来缓存用户输入的数据。程序缓存数据后,将擦除数据字段而不是刷新屏幕,这与 Ajax 类似。通过这种方法,用户可以为同一属性输入另一组数据。

让我们一起来探究一下如何使用 JSON 来缓存元数据。

JSON 概览

使用 JSON(即 JavaScript Object Notation),将以一种特定的字符串形式来表示 JavaScript 对象。如果将具有这样一种形式的字符串赋给任意一个 JavaScript 变量,该变量随后将引用一个通过指定给该变量的字符串构建的对象。

例如,假定有一个 policy 对象,它拥有以下属性:

  • 计划名称
  • 描述
  • 持续时间

您可以使用以下这种 JSON 形式的字符串来表示该 policy 对象:

{"Plane":{"Full Life Cover"}, "Description":{"The best life insurance plan"}, "Term":{"20 years"}}

如果将此字符串赋给任意一个 JavaScript 变量,则该变量将接受以这种对象为单位的数据。要访问数据,请提供需要访问的属性所在的路径。对于本例,将以上字符串赋给一个名为 policy 的变量:

var policy = {"Plane":{"Full Life Cover"}, "Description":{"The best life insurance plan"}, "Term":{"20 years"}}

将此字符串粘贴到 html 页面的标题部分中,然后编写以下警报:

alert(policy.Plan)

如果在任何支持 JavaScript 的浏览器中查看此页面,您都会看到显示策略计划的警报。

示例

为了演示 JSON 的性能,我们来看一个有 vehicle 对象列表的 person 对象和一个可以拥有一台或多台车辆的 person 对象。每台车辆都有以下属性:

  • 品牌
  • 注册码
  • CC

浏览器 UI 应当允许用户添加多台具有优秀应用性能的车辆(通常为固有要求)。每个属性都有一些与之关联的限制或验证规则。您需要指定以下规则:

  • 品牌名称
  • 品牌名称决不能包含数字。
  • 品牌名称最多可包含两个单词,中间可加一个空格。
  • 注册码
  • 注册码必须全都是数字。
  • CC
  • CC 必须全都是数字。
  • CC 的最小值为 50,最大值为 5000。

将有三个与车辆属性相对应的输入字段,用户可在其中输入信息。接下来,您将看到如何将验证消息分组到 JSON 组中以及如何访问这些验证消息。

传统方法

现在,当用户输入的车辆数据为 40CC 时,程序必须显示一条消息,说明输入的数据不在有效的 CC 范围内。您可以用 清单 1 中的代码简单地显示这条消息:

清单 1. 传统代码

if(cc < <%= minCC %> || cc > <%= maxCC %>) {
 alert(<%= ResourceList.vehicleCCRangeMsg >);
}

ResourceList 是一个服务器端类,该类中含有关于车辆的国际化消息(如 vehicleCCRangeMsg)。这种方法解决问题时略显混乱:

  1. 在这种方法中,您将把服务器端代码添加到所有客户端验证函数中,以检查条件并显示消息。
  2. 如果更改了元数据和消息(例如服务器端类或变量)的组织方法,您将会为更改使用这些元数据和消息的客户机脚本验证函数感到十分头痛。

JSON 能帮助您做什么?

如果只需在条件语句和警报中引用一个 JavaScript 变量而不是服务器端代码,您感觉怎么样?不需要把服务器端代码包含在 JavaScript 中,而保存的服务器端元数据和消息中的更改也不会影响客户端脚本。这种方法太棒了,是不是?好的,那就是使用基于 JSON 缓存元数据时要做的。

您将使用一个 JavaScript 对象把我们的验证数据和消息分组到一个层级中。然后就像访问层级的 JavaScript 对象一样访问这些消息。就是这样,您已经做到了!

当此 JSON 元数据对象就绪后,先前的 JavaScript 代码片段将类似于 清单 2。

清单 2. 带有 JSON 元数据缓存对象的警报

if(cc < vehicleValidationsMetadata.CC.minCC || 
 cc > vehicleValidationsMetadata.CC.maxCC) {
 alert(vehicleValidationsMetadata.CC.RangeMessage);
}

现在,问题是谁来准备 JSON 元数据对象?嗯,只有服务器能做这项工作。服务器必须生成这个 JSON 对象,并将其提供给客户机(浏览器)。一些 Java API 可以帮助您准备此类(事实上是任意一类)JSON 对象。请参阅 参考资料 来查看那些 API。

生成 JSON 元数据对象的典型方法为:

  1. 为实体及其验证消息准备一个层级 Java 对象。
  2. 对这些实体及其验证消息调用 toString()。这些实体及其验证消息最有可能把一个 JSON 形式的字符串提供给您。
  3. 将该字符串另存到一个请求范围内。
  4. 在 JSP 中,获取该字符串,并将其指派到 JavaScript 变量值的大括号内。

最终的车辆元数据对象看上去就会像 清单 3 一样。

清单 3. 验证元数据 JSON 对象

var vehicleValidationsMetadata = {
 "BrandName":{
 "CanContainDigits":{false},
 "Maxwords":{2},
 "FormatMessage":{"Brand Name cannot contain digits."}, 
 "WordLimitMessage":{"Brand Name cannot contain more than two words"}
 },<br> "RegistrationNumber":{
 "CanContainAlphabets":{false},
 "CanContainDigits":{"true"},
 "FormatMessage":{"Registration Number can contain only digits."}
 },
 "CC":{
 "minCC":{50},
 "maxCC":{5000},
 "FormatMessage":
 {"CC can only be numeric"}, 
 "RangeMessage":{"CC can be within range of 50 and 5000"}
 }
 }

服务器必须生成整个字符串,第一行和最后一行除外,因为当前的用户语言环境可能要求使用这些消息(并且只有服务器端代码能完成这项工作)。在这里,需要注意的一点是此元数据对象仅用于验证车辆。更理想的情况是将 vehicle 元数据对象封装到 person 元数据对象中。那样,您就不需要再创建另一个 JavaScript 变量,而只需将该元数据对象包含到 person 元数据对象中。

在将此元数据对象准备好后,您可以使用该对象中的元数据和消息来验证数据输入和显示消息。现在,验证车辆输入信息的 JavaScript 函数看上去就会跟 清单 4 一样。

清单 4. 车辆数据验证函数

function validateVehicleData() {
 var brandName = //get brand name from form field
 var registrationNumber = //get Registration Number from form field.
 var CC = //get CC from form field
 var brandNameTokens = brandName.split(' ');
 if(brandNameTokens.length > vehicleValidationsMetadata.BrandName.MaxWords) {
 alert(vehicleValidationMessages.BrandName.WordLimitMessage);
 }
 .
 .
 .
 if((!vehicleValidationsMetadata.RegistrationNumber.CanContainAlphabets) && 
 isNaN(parseInt(registrationNumber))) {
 alert(vehicleValidationMessages.RegistrationNumber.FormatMessage);
 }
 var ccNum = parseInt(CC);
 if(ccNum < vehicleValidationMessages.CC.minCC || 
 ccNum > vehicleValidationMessages.CC.maxCC) {
 alert(vehicleValidationMessages.CC.RangeMessage);
 }
}

这段代码看上去是不是好多了?它没有在 JavaScript 中混入服务器代码。如果服务器端更改存储元数据的方法,则无需再重写客户机脚本。这会使 JSP 编程人员的日子更轻松些。

扩展客户端数据缓存

某些 Web 应用程序要求用户为同一个属性或对象输入多个数据。例如,person-vehicle 要求人员为其拥有的每台车辆都输入数据。如果此人拥有多台车辆,应用程序必须允许输入多台车辆的数据。我将把此类对象作为一个 多组属性 来引用。如果多组属性包含任何可以保存多个数据实例的属性,我将称之为 多值属性

现在,多组属性和多值属性面临的问题是必须将数据输入到相同的输入字段中。那意味着在输入第二台车辆的数据之前,必须先保存已输入的第一台车辆的数据。您可以通过两种方法来解决此问题:

  1. 将第一台车辆的数据发送到服务器上并清空输入字段,以允许用户输入下一台车辆的数据。
  2. 将数据缓存到客户机上并清空输入字段,以允许用户输入下一台车辆的数据。

第一种方法存在的问题是每输入一台车辆的数据就需要访问一次服务器。这不太好;如果在输入车辆数据后都必须等待服务器响应,用户会觉得很失望。换种方法,第二种方法的响应时间几乎为零。用户可以快速输入所有车辆数据而无需等待。但这里需要考虑的是如何将数据存储到客户端上。这里有更多方法可将数据存储到客户机上:

  1. 在用户单击以添加下一台车辆的数据时将数据以某种形式缓存到隐藏的表字段中。
  2. 将数据缓存到一个 JavaScript 对象中。

如果要将数据存储到隐藏字段中,您会为用户每次输入新的车辆数据都要处理很多隐藏字段或处理隐藏字段数据而感到烦恼。这就像有字符串操作就需要频繁处理字符串一样。

但是第二种缓存数据的方法提供了一种面向对象的方法来缓存。当用户输入新车辆数据时,您将在数组对象中创建一个新元素。不需要任何笨拙的字符串操作。当用户输完所有车辆数据后,您只需构建一个源于该对象的 JSON 字符串,并通过存储到某个隐藏字段中的方式将该字符串发送至服务器。这种方法要比第一种方法好得多。

JSON、数据缓存和 Ajax 功能

当使用 JSON 将数据缓存到客户端时,系统将在用户每次单击 Add Vehicle 按钮时更新数据缓存对象。用于完成此项任务的 JavaScript 函数看起来可能跟 清单 5 一样。

清单 5. 用于将车辆数据添加到 JavaScript 对象中以进行客户端缓存的函数

function addVehicleData() {
 var brand = //get vehicle brand;<br> var regNo = //get registration number;
 var cc = //get cc;
 
 vehicleData[vehicleData.length] = new Object();
 vehicleData[vehicleData.length].brandName = new Object();
 vehicleData[vehicleData.length].brandName = brand;
 //same way update other two properties
 }

在这里,vehicleData 是用于在用户装入页面时进行初始化的 JavaScript 变量。它被初始化为一个新的数组对象,该数组对象为空或者含有用户先前输入的车辆的车辆元素。

当此函数将数据保存到 JavaScript 对象中后,程序可以调用另一个函数来清空输入字段以允许用户输入新数据。

在此类应用程序中,要求用户输入出现次数最少或出现次数最多的多组或多值属性。您可以将这些限制置入 JSON 元数据对象中。在这种情况下,先前的元数据对象将变为 清单 6 中所示的代码。

清单 6. 带有出现次数限制的 JSON 元数据对象

var vehicleValidationsMetadata = {
 "MIN_OCC":{0},
 "MAX_OCC":{10},
 "MAX_OCC_MSG":{"...."},
 "MIN_OCC_MSG":{".....},
 //Everything else is the same
 }

然后,addVehicleData() 函数将先验证数据的出现次数,然后在仅当总出现次数未超出允许的限制时再将数据添加到 JavaScript 对象中。清单 7 显示了检查方法。

清单 7. JSON 元数据对象限制检查

function addVehicleData() {
 if(vehicleData.length == vehicleValidationsMetadata.MAX_OCC-1) {
 alert(vehicleValidationsMetadata.MAX_OCC_MSG);
 }<br> //Everything else is the same
}

当用户提交一个页面时调用的函数实际上用于验证最少的出现次数。这种方法的最大好处是屏幕不需要刷新以输入新车辆数据。提供此类静态屏幕曾经是 Ajax 技术的主要目标,而您现在用 JSON 也能完成此目标。这是关于更新 JSON 数据对象和通过 JavaScript 处理 HTML DOM 树的全部内容。用户响应时间是最小值,因为所有操作仅在客户端上执行。您可以使用 JSON 来为应用程序提供 Ajax 功能。

当用户单击 Save 按钮时,程序将调用另一个 JavaScript 函数,该函数将把此 JSON 对象 字符串化 并将其存储到程序提交到服务器上的隐藏表字段中。JSON.js(请参阅 参考资料)有一个 JSON.stringify()函数,该函数将获取 JavaScript 对象作为输入并返回字符串输出。

服务器端必须能够理解 JSON 形式的字符串并生成一个服务器端对象,以处理和保存数据。Web 站点 http://www.json.org/java/index.html 提供了一个 Java API,该 API 用于处理基于 Java 的应用程序的大部分需求。

结束语

您在本文中看到了 JSON 的强大用途。归结如下:

  1. JSON 提供了一种优秀的面向对象的方法,以便将元数据缓存到客户机上。
  2. JSON 帮助分离了验证数据和逻辑。
  3. JSON 帮助为 Web 应用程序提供了 Ajax 的本质。


Tags:JSON   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言几乎所有.NET序列化程序的实现基础都是反射。下列代码是Newtonsoft.Json的实现:protectedvirtualJsonPropertyCreateProperty(MemberInfomember,MemberSerializationmemb...【详细内容】
2021-12-28  Tags: JSON  点击:(2)  评论:(0)  加入收藏
前言JDBC访问Postgresql的jsonb类型字段当然可以使用Postgresql jdbc驱动中提供的PGobject,但是这样在需要兼容多种数据库的系统开发中显得不那么通用,需要特殊处理。本文介绍...【详细内容】
2021-12-23  Tags: JSON  点击:(13)  评论:(0)  加入收藏
前言前几天有粉丝在群里问了一个json文件处理的问题。看上去他只需要follower和ddate这两个字段下的对应的值。我们知道json是一种常见的数据传输形式,所以对于爬取数据的数...【详细内容】
2021-12-07  Tags: JSON  点击:(40)  评论:(0)  加入收藏
Json 和 Xml 的目的是相似的,他们都是将方便理解和易读的方式将复杂数据组织到各种接口和语言中,这种类型的技术当然是不能缺少的,我们通过他们构建数据也能很好的去共享他们,但...【详细内容】
2021-06-04  Tags: JSON  点击:(129)  评论:(0)  加入收藏
基于 el-form 封装了一个表单控件,包括表单的子控件。 既然要封装,那么就要完善一些,把能想到的功能都要实现出来,不想留遗憾。 毕竟UI库提供的功能都很强大了,不能浪费了对吧。 ...【详细内容】
2021-05-19  Tags: JSON  点击:(195)  评论:(0)  加入收藏
基于Hive SQL 提取加工数据是每个数据分析师的工作日常,但屏幕面前的你是否遇到过这样的囧境:数仓表中的某个字段并非是以往那种一行一个实体信息的结构化数据,而是 json格式的...【详细内容】
2021-02-03  Tags: JSON  点击:(145)  评论:(0)  加入收藏
前言大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀。在被大家取关之前,我立下一个“远大的理想”,一定要在这周更新文章。现在看来,flag有用了。。。本篇文章是我这一个多月...【详细内容】
2021-01-14  Tags: JSON  点击:(192)  评论:(0)  加入收藏
生活中,你我一定都看到过这种「xx元爆改出租屋」,「爆改小汽车」之类的文章,做为IT人,折腾的劲头一点也不差。软件开发过程中,你是否有时候,会拿着业务提供的一个个CSV或者JSON的...【详细内容】
2021-01-06  Tags: JSON  点击:(159)  评论:(0)  加入收藏
最近工作中测试一款客户端exe程序,web框架基于CEF,认证用的是jwt。说实话jwt这个东西实际运用真的很少,前几年完整撸过一次,结果这次又碰到了就基本忘光了之前的测试过程和方向...【详细内容】
2020-12-30  Tags: JSON  点击:(171)  评论:(0)  加入收藏
JSON 文件非常棒,因为它们以人类可读的格式存储数据集合。然而,如果 JSON 文件被最小化过,那么阅读 JSON 文件可能会很痛苦。&bull; 来源:linux.cn &bull; 作者:Abhishek Prakas...【详细内容】
2020-12-14  Tags: JSON  点击:(222)  评论:(0)  加入收藏
▌简易百科推荐
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === &#39;a&#39;) { b = true} else { b = false}// goodb = a === &#39;a&#39;2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Mason程    Tags:JavaScript   点击:(6)  评论:(0)  加入收藏
给新手朋友分享我收藏的前端必备javascript已经写好的封装好的方法函数,直接可用。方法函数总计:41个;以下给大家介绍有35个,需要整体文档的朋友私信我,1、输入一个值,将其返回数...【详细内容】
2021-12-15  未来讲IT    Tags:JavaScript   点击:(20)  评论:(0)  加入收藏
1. 检测一个对象是不是纯对象,检测数据类型// 检测数据类型的方法封装(function () { var getProto = Object.getPrototypeOf; // 获取实列的原型对象。 var class2type =...【详细内容】
2021-12-08  前端明明    Tags:js   点击:(23)  评论:(0)  加入收藏
作者:一川来源:前端万有引力 1 写在前面Javascript中的apply、call、bind方法是前端代码开发中相当重要的概念,并且与this的指向密切相关。本篇文章我们将深入探讨这个关键词的...【详细内容】
2021-12-06  Nodejs开发    Tags:Javascript   点击:(19)  评论:(0)  加入收藏
概述DOM全称Document Object Model,即文档对象模型。是HTML和XML文档的编程接口,DOM将文档(HTML或XML)描绘成一个多节点构成的结构。使用JavaScript可以改变文档的结构、样式和...【详细内容】
2021-11-16  海人为记    Tags:DOM模型   点击:(35)  评论:(0)  加入收藏
入口函数 /*js加载完成事件*/ window.onload=function(){ console.log("页面和资源完全加载完毕"); } /*jQuery的ready函数*/ $(document).ready(function(){ co...【详细内容】
2021-11-12  codercyh的开发日记    Tags:jQuery   点击:(36)  评论:(0)  加入收藏
一、判断是否IE浏览器(支持判断IE11与edge)function IEVersion() {var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isIE = userAgent.indexOf("comp...【详细内容】
2021-11-02  V面包V    Tags:Javascript   点击:(40)  评论:(0)  加入收藏
Null、Undefined、空检查普通写法: if (username1 !== null || username1 !== undefined || username1 !== &#39;&#39;) { let username = username1; }优化后...【详细内容】
2021-10-28  前端掘金    Tags:JavaScript   点击:(51)  评论:(0)  加入收藏
今天我们将尝试下花 1 分钟的时间简单地了解下什么是 JS 代理对象(proxies)?我们可以这样理解,JS 代理就相当于在对象的外层加了一层拦截,在拦截方法里我们可以自定义一些个性化...【详细内容】
2021-10-18  前端达人    Tags:JS   点击:(51)  评论:(0)  加入收藏
带有多个条件的 if 语句把多个值放在一个数组中,然后调用数组的 includes 方法。// bad if (x === "abc" || x === "def" || x === "ghi" || x === "jkl") { //logic } // be...【详细内容】
2021-09-27  羲和时代    Tags:JS   点击:(58)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条