首頁 web前端 js教程 用 JSON 处理缓存_json

用 JSON 处理缓存_json

May 16, 2016 pm 07:14 PM
json

数据验证是每个企业 Web 应用程序中最富于挑战性、日新月异的部分。通常验证元数据会使 JavaScript 模块中混入服务器端代码。在本文中,您将了解如何在服务器代码的帮助下将元数据缓存在客户端的优秀方法,服务器代码将提供 JSON(JavaScript Object Notation)形式的字符串化元数据。这种方法还允许以类似 Ajax 的方式来处理多值和多组属性。
每个应用程序的开发都是为了解决某个领域的问题。而每个领域都有自己的一套约束数据的规则和规范。应用程序将这些约束应用于数据时,约束也就成了验证。所有应用程序都需要验证用户输入的数据。

目前,应用程序一般都使用 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  || cc > ) {
    alert();
    } 


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


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

JSON 能帮助您做什么?

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

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

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


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

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


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

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

为实体及其验证消息准备一个层级 Java 对象。 
对这些实体及其验证消息调用 toString()。这些实体及其验证消息最有可能把一个 JSON 形式的字符串提供给您。 
将该字符串另存到一个请求范围内。 
在 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"}
        }, "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                     ccNum > vehicleValidationMessages.CC.maxCC) {
              alert(vehicleValidationMessages.CC.RangeMessage);
 }



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

扩展客户端数据缓存

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

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

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

在用户单击以添加下一台车辆的数据时将数据以某种形式缓存到隐藏的表字段中。 
将数据缓存到一个 JavaScript 对象中。 
如果要将数据存储到隐藏字段中,您会为用户每次输入新的车辆数据都要处理很多隐藏字段或处理隐藏字段数据而感到烦恼。这就像有字符串操作就需要频繁处理字符串一样。

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

JSON、数据缓存和 Ajax 功能

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


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

function addVehicleData() {
    var brand = //get vehicle brand;   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);
    }  //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/i... 提供了一个 Java API,该 API 用于处理基于 Java 的应用程序的大部分需求。

结束语

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

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

golang WebSocket與JSON的結合:實現資料傳輸與解析 golang WebSocket與JSON的結合:實現資料傳輸與解析 Dec 17, 2023 pm 03:06 PM

golangWebSocket與JSON的結合:實現資料傳輸和解析在現代的Web開發中,即時資料傳輸變得越來越重要。 WebSocket是一種用於實現雙向通訊的協議,與傳統的HTTP請求-回應模型不同,WebSocket允許伺服器向客戶端主動推送資料。而JSON(JavaScriptObjectNotation)是一種用於資料交換的輕量級格式,它簡潔易讀

PHP 數組轉 JSON 的效能最佳化技巧 PHP 數組轉 JSON 的效能最佳化技巧 May 04, 2024 pm 06:15 PM

PHP數組轉JSON的效能最佳化方法包括:使用JSON擴充和json_encode()函數;新增JSON_UNESCAPED_UNICODE選項以避免字元轉義;使用緩衝區提高循環編碼效能;快取JSON編碼結果;考慮使用第三方JSON編碼庫。

MySQL5.7和MySQL8.0的差別是什麼? MySQL5.7和MySQL8.0的差別是什麼? Feb 19, 2024 am 11:21 AM

MySQL5.7和MySQL8.0是兩個不同的MySQL資料庫版本,它們之間有以下一些主要差異:效能改進:MySQL8.0相對於MySQL5.7有一些效能改進。其中包括更好的查詢優化器、更有效率的查詢執行計劃產生、更好的索引演算法和平行查詢等。這些改進可以提高查詢效能和整體系統效能。 JSON支援:MySQL8.0引入了對JSON資料類型的原生支持,包括JSON資料的儲存、查詢和索引。這使得在MySQL中處理和操作JSON資料變得更加方便和有效率。事務特性:MySQL8.0引進了一些新的事務特性,如原子

使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串 使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串 Nov 18, 2023 pm 01:59 PM

使用golang中的json.MarshalIndent函數將結構體轉換為格式化的JSON字串在使用Golang編寫程式時,我們經常需要將結構體轉換為JSON字串,在這個過程中,json.MarshalIndent函數可以幫助我們實現格式化的輸出。下面我們將詳細介紹如何使用這個函數,並提供具體的程式碼範例。首先,讓我們建立一個包含一些資料的結構體。以下是示

C#開發中如何處理XML和JSON資料格式 C#開發中如何處理XML和JSON資料格式 Oct 09, 2023 pm 06:15 PM

C#開發中如何處理XML和JSON資料格式,需要具體程式碼範例在現代軟體開發中,XML和JSON是廣泛應用的兩種資料格式。 XML(可擴展標記語言)是一種用於儲存和傳輸資料的標記語言,而JSON(JavaScript物件表示)是一種輕量級的資料交換格式。在C#開發中,我們經常需要處理和操作XML和JSON數據,本文將重點放在如何使用C#處理這兩種數據格式,並附上

Jackson庫中註解如何控制JSON序列化和反序列化? Jackson庫中註解如何控制JSON序列化和反序列化? May 06, 2024 pm 10:09 PM

Jackson庫中的註解可控制JSON序列化和反序列化:序列化:@JsonIgnore:忽略屬性@JsonProperty:指定名稱@JsonGetter:使用獲取方法@JsonSetter:使用設定方法反序列化:@JsonIgnoreProperties:忽略屬性@ JsonProperty:指定名稱@JsonCreator:使用建構子@JsonDeserialize:自訂邏輯

使用PHP的json_encode()函數將陣列或物件轉換為JSON字串並格式化輸出 使用PHP的json_encode()函數將陣列或物件轉換為JSON字串並格式化輸出 Nov 03, 2023 pm 03:44 PM

使用PHP的json_encode()函數將陣列或物件轉換為JSON字串並格式化輸出,可以讓資料在不同的平台和語言之間進行傳遞和交換變得更加容易。本文將介紹json_encode()函數的基本用法,以及如何將JSON字串格式化輸出。一、json_encode()函數的基本用法json_encode()函數的基本語法如下:stringjson_encod

Pandas使用教學:讀取JSON檔案的快速入門 Pandas使用教學:讀取JSON檔案的快速入門 Jan 13, 2024 am 10:15 AM

快速入門:Pandas讀取JSON檔案的方法,需要具體程式碼範例引言:在資料分析和資料科學領域,Pandas是一個重要的Python庫之一。它提供了豐富的功能和靈活的資料結構,能夠方便地對各種資料進行處理和分析。在實際應用中,我們經常會遇到需要讀取JSON檔案的情況。本文將介紹如何使用Pandas來讀取JSON文件,並附上特定的程式碼範例。一、Pandas的安裝

See all articles