用 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 = https://www.isolves.com/it/cxkf/yy/js/2019-07-11/{ "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 < vehicleValidationMessages.CC.minCC ||ccNum > vehicleValidationMessages.CC.maxCC) { alert(vehicleValidationMessages.CC.RangeMessage); }}这段代码看上去是不是好多了?它没有在 JavaScript 中混入服务器代码 。如果服务器端更改存储元数据的方法,则无需再重写客户机脚本 。这会使 JSP 编程人员的日子更轻松些 。
扩展客户端数据缓存
某些 Web 应用程序要求用户为同一个属性或对象输入多个数据 。例如,person-vehicle 要求人员为其拥有的每台车辆都输入数据 。如果此人拥有多台车辆,应用程序必须允许输入多台车辆的数据 。我将把此类对象作为一个 


推荐阅读