生成 JSON 元數(shù)據(jù)對(duì)象的典型方法
如果只需在條件語(yǔ)句和警報(bào)中引用一個(gè) JavaScript 變量而不是服務(wù)器端代碼,您感覺(jué)怎么樣?這段代碼看上去是不是好多了?它沒(méi)有在 JavaScript 中混入服務(wù)器代碼。如果服務(wù)器端更改存儲(chǔ)元數(shù)據(jù)的方法,則無(wú)需再重寫(xiě)客戶機(jī)腳本。這會(huì)使 JSON 對(duì)象的日子更輕松些。#t#
您將使用一個(gè) JavaScript 對(duì)象把我們的驗(yàn)證數(shù)據(jù)和消息分組到一個(gè)層級(jí)中。然后就像訪問(wèn)層級(jí)的 JavaScript 對(duì)象一樣訪問(wèn)這些消息。就是這樣,您已經(jīng)做到了!當(dāng)此 JSON 元數(shù)據(jù)對(duì)象就緒后,先前的 JavaScript 代碼片段將類似。
- if(cc < vehicleValidationsMetadata.CC.minCC ||
- cc > vehicleValidationsMetadata.CC.maxCC) {
- alert(vehicleValidationsMetadata.CC.RangeMessage);
- }
現(xiàn)在,問(wèn)題是誰(shuí)來(lái)準(zhǔn)備 JSON 元數(shù)據(jù)對(duì)象?嗯,只有服務(wù)器能做這項(xiàng)工作。服務(wù)器必須生成這個(gè) JSON 對(duì)象,并將其提供給客戶機(jī)(瀏覽器)。一些 Java API 可以幫助您準(zhǔn)備此類(事實(shí)上是任意一類)JSON 對(duì)象。請(qǐng)參閱 參考資料 來(lái)查看那些 API。
生成 JSON 元數(shù)據(jù)對(duì)象的典型方法為:
- 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"}
- }
- }
為實(shí)體及其驗(yàn)證消息準(zhǔn)備一個(gè)層級(jí) Java 對(duì)象。 對(duì)這些實(shí)體及其驗(yàn)證消息調(diào)用 toString()。這些實(shí)體及其驗(yàn)證消息最有可能把一個(gè) JSON 形式的字符串提供給您。
將該字符串另存到一個(gè)請(qǐng)求范圍內(nèi)。 在 JSP 中,獲取該字符串,并將其指派到 JavaScript 變量值的大括號(hào)內(nèi)。
最終的車輛元數(shù)據(jù)對(duì)象。
- 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 brandNamebrandNameTokens = 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);
- }
- }
服務(wù)器必須生成整個(gè)字符串,第一行和最后一行除外,因?yàn)楫?dāng)前的用戶語(yǔ)言環(huán)境可能要求使用這些消息(并且只有服務(wù)器端代碼能完成這項(xiàng)工作)。在這里,需要注意的一點(diǎn)是此元數(shù)據(jù)對(duì)象僅用于驗(yàn)證車輛。更理想的情況是將 JSON 對(duì)象對(duì)象封裝到 person 元數(shù)據(jù)對(duì)象中。
那樣,您就不需要再創(chuàng)建另一個(gè) JSON 對(duì)象,而只需將該元數(shù)據(jù)對(duì)象包含到 person 元數(shù)據(jù)對(duì)象中。在將此元數(shù)據(jù)對(duì)象準(zhǔn)備好后,您可以使用該對(duì)象中的元數(shù)據(jù)和消息來(lái)驗(yàn)證數(shù)據(jù)輸入和顯示消息。現(xiàn)在,驗(yàn)證車輛輸入信息的 JavaScript 函數(shù)看上去就會(huì)跟 清單 4 一樣。