使用Ajax实现本地化后的客户端消息验证

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

简介在构建一个能影响全球用户的Web应用程序时,有两点需要考虑。第一点是需要呈现本地化后的页面内容,第二点是验证用户输入以及本地化后的验证消息显示。使用资源包(特定于本地语言环境的属性文件)在服务器端构建此页面的本地化版本很容易。同样地,也可以使用服务器端验证来显示本地化后的验证消息。对于国际化而言,有很多具备良好支持的现成框架可用,比如JakartaStruts、Spring、Tapestry和Freemarker。不过,在几乎所有的这类框架内,都缺少对在客户端验证本地化消息的现成支持。如果验证是在客户端进行的,将很难显示本地化后的验证消息。通过在构建页面时提前处理整个页面(包括静态内容和必要的JavaScript验证消息)或从特定于本地语言环境的资源包解析出消息键,可以显示这些消息。不过,上述方式具有一个暗含的限制:整个JavaScript验证逻辑都应在JavaServerPage(JSP)本身内编写以便基于Java™的消息键解析逻辑可被重用。不要忘记,JavaScript通常都是由页面设计人员编写的,而这些设计人员并不一定同时也掌握Java的开发技术。混合Java代码和JavaScript可能会让Web应用程序的开发和维护复杂化。联合使用Ajax和资源包是另一种可以简化工作的方式。它让您能将此验证JavaScript移到另一个文件,而不是JSP。并且,只对需要的消息键进行解析,而不是像使用预先构造的本地化版本方法一样,对所有消息键进行解析。本文描述了如何联合使用Ajax和资源包来简化本地化后的客户端验证消息处理。我将侧重于使用Ajax的强大功能,而不会涉及现成框架的复杂性。本文所介绍的方式非常适合于需要快速响应的Web2.0应用程序,比如动态跟踪用户动作。在本文中,我不会过多涉及JSP页面内静态HTML内容的本地化。本文所侧重的是联合使用Ajax和资源包来实现本地化后的客户端验证消息处理。不过,用来在服务器端解析消息键的Java实用工具也可用于本地化JSP页面内的静态HTML内容。关键字国际化(Internationalization)—指一种应用程序设计过程,使应用程序不需要进行重大修改就可适用于各种语言和地区。有时,国际化这一术语常被缩写为i18n,因为在首字母“i”和最后一个字母“n”之间共有18个字母。本地化(Localization)—针对某个特定地区或语言调整软件的过程,添加特定于本地语言环境的组件和经过翻译的文本。本地化这一术语常被缩写为l10n,这是因为在字母“l”和“n”之间共有10个字母。本地化的首要任务是翻译用户界面元素和文档。本地化所涉及的不仅是互换语言,而且还会涉及更改相关元素,比如数字、日期、货币等的显示。其他类型的数据(比如声音和图像)若对文化敏感,可能也都需要进行本地化。应用程序的国际化越好,越容易针对特定的语言和字符编码模式对其进行本地化。Ajax是一种技术,用来创建更好、更快且更为交互的Web应用程序。借助Ajax,JavaScript代码可使用XMLHttpRequest对象与服务器直接通信。有了此对象,JavaScript代码可以在不重新装载页面的情况下与Web服务器进行数据交换。开发一个国际化的Web应用程序只要是针对全球(地理位置分散)用户开发Web应用程序,就要尊重和考虑用户对本地语言和文化的偏好。在Web应用程序内提供对国际化的支持时,需要考虑以下几点。识别出文化敏感数据在资源包中分离出可翻译文本处理混合消息格式化数字及货币格式化日期及时间使用Unicode字符属性正确地对比字符串将非Unicode文本转换为Unicode支持本地化了的客户端消息处理的高级步骤在构建具有国际化支持和本地化了的客户端消息处理机制的Web应用程序时,下列几点是必须要满足的。所有本地化了的页面都应支持UTF-8字符集(页面编码)。所有客户端消息都应使用特定于客户机本地语言环境的资源包从服务器端获取。资源包应存储键值对。数值要使用Unicode字符。使用Ajax将来自客户端JavaScript的请求发送给一个服务器端资源,该资源会解析此请求以针对此键获得特定于客户机本地语言环境的消息。解析所获取的消息并正确显示。使用Ajax实现本地化后的客户端消息处理的一种实用方式在本节中,我们会带您亲历构建基本结构所需执行的各种操作,并会用一个示例页面对它进测试,然后会在您的Web应用程序中反复使用。首先,要准备资源包属性文件。这些*.properties文件保存在该项目的类路径中,文件内包含键-值对,并可用作资源包来获得特定于本地语言环境的运行时解析的验证消息。所有这些*.properties文件都应符合Java国际化标准命名约定。清单1.包属性文件#org/rpd/i18n/bundles/Messages.properties-ResourceBundlefordefaultlocale#Thesamplemessagekey-valuepairs...error.loginid.required=UserNameisMandatory.error.useremail.required=EmailIdisMandatory.error.password.required=Passwordisrequired.error.password.length=PasswordLengthshouldnotbelessthansix(6)character.error.confirmpassword.required=ConfirmPasswordisrequired.error.passwordconfirm.match=PasswordandConfirmPassworddoesnotmatch.error.firstName.required=FirstNameisrequired.error.lastName.required=LastNameisrequired.接下来,创建一个Java类来管理这些资源包。这个类(比如说ResourceManager.java)提供了将特定于本地语言环境的资源包加载到缓存的函数。借助它,还能根据给定消息键和本地语言环境检索消息值。清单2.ResourceManager.javapackageorg.rpd.i18n.common;importjava.util.HashMap;importjava.util.Locale;importjava.util.Map;importjava.util.ResourceBundle;publicclassResourceManager{//Thenameandlocationoftheresourcebundle.privatefinalStringmMessageBundle=org/rpd/i18n/bundles/Messages;//Theloadedmessagecache...privateMapLocale,ResourceBundlemResourceCache=null;//Privateinstancevariable.privatestaticResourceManagermManager=null;//defaultprivateconstructor.privateResourceManager(){mResourceCache=newHashMapLocale,ResourceBundle();}//Getthelocale-specificbundlefromcache.//FirstloadtothecacheifnotalreadyloadedpublicResourceBundlegetBundle(Localelocale){if(locale==null){locale=Locale.getDefault();}if(mResourceCache.containsKey(locale)==false){ResourceBundlebundle=ResourceBundle.getBundle(mMessageBundle,locale);mResourceCache.put(locale,bundle);}returnmResourceCache.get(locale);}//ThreadsafeSingletonpatternimplementation...privatestaticResourceManagergetInstance(){synchronized(ResourceManager.class){if(mManager==null){mManager=newResourceManager();}}returnmManager;}//Getthemessageforthekeyusingdefaultlocale.publicstaticStringgetMessage(Stringkey){returngetMessage(key,null);}//Getthemessageforthekeyandspecifiedlocale.publicstaticStringgetMessage(Stringkey,Localelocale){try{returngetInstance().getBundle(locale).getString(key);}catch(Exceptione){return;}}}创建一个JSP文件来处理Ajax请求。这个JSP文件(例如,MessageResolver.jsp)负责处理Ajax请求以解析这些消息键(对这个JSP而言,就是请求参数,message-key)。它使用由ResourceManager类提供的消息检索特性来解析作为请求参数进入这个JSP的每个消息键。清单3.MessageResolver.jsp%@pageimport=org.rpd.i18n.common.ResourceManager%%//Thenameoftherequestparameterrepresentingtheinput//HTMLElement-MessageKeycombination.finalStringREQ_ID=message-key;//Messageprefixtobeusedinoutputstring.finalStringMSG_PREFIX=begin::;//Messagesuffixtobeusedinoutputstring.finalStringMSG_SUFFIX=::end;//ThestandardHTMLElement-MessageKeydelimiter.finalStringELEMENT_KEY_DELIM=,;//TheHTMLElement-LocalizeMessagedelimitertobeusedin//outputstring.finalStringKEY_VAL_DELIM===;//FindtherequestparametercontainingtheHTMLElement-MessageKey//combinationString.StringkeysArr=request.getParameter(REQ_ID);//Ifthedesiredrequestparameterdoesn'texist,itmeansrequestisinvalid.if(keysArr==null){out.println(Invalidmessagekey);}else{//Splittheinputusingtheelement-keydelimiter(ELEMENT_KEY_DELIM).Stringkeys[]=keysArr.split(ELEMENT_KEY_DELIM);//Checkifthenumberoftuplesiseven

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功