自由的天空

放开心的翅膀,飞吧

xiaohongliID:xiaohongli
10151次访问,排名10415好友0人,关注者0
xiaohongli的文章
原创 18 篇
翻译 0 篇
转载 2 篇
评论 1 篇
xiaohongli的公告
欢迎大家来自由的天空翱翔
最近评论
oyj_t301:看不懂,要多一些注释就好了
文章分类
收藏
    相册
    我的相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 在js中实现验证码资源的国际化收藏

    新一篇: dwr中同步执行的解决办法 | 旧一篇: SOAP, UDDI, WSIL 和 WSDL 的关系

    js中实现验证码资源的国际化
     
          web应用开发中,框架都提供了资源国际化的配置。但是,在js中实现资源国际化还是比较麻烦。比如: alert('Hello!') ; 我需要将这个hello在中文环境中显示为‘你好’,而在英文环境中显示为英文‘hello’,就比较麻烦。
          这里用到了dwr框架,它动态生成javascript代码;隐藏的http协议。关于dwr的资料网上面很多。

         下面就是基本的资源关系图:

    *.jsp 或 *.html
            Message.js
    Dwr   Engineer
       Messages.java
    *_zh_CN.properties...

    首先:在jsphtml中引入需要的js文件
    然后:js就会通过dwr 引擎调用Messages.java文件,而Messages.java文件提供了对属   性文件的操作。这样就可以实现在js中验证码资源的国际化。
     
    下面就来进行具体的开发:
    一:开发一个sevlet类,当应用系统启动时,就将资源文件读入缓存,就可以加快访问速度。
      
    package test.message;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Locale;
    import java.util.Properties;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
     
    import org.xiaohongli.core.cache.Cache;
    import org.xiaohongli.core.cache.LruCache;
    /**
     *
     * @author xiaohongli
     *
     */
    public class MessagesServlet extends HttpServlet{
                 //定义属性文件后缀
                public static final String MESSAGE_SUFFIX = ".properties";
                //定义缺省属性文件前缀
                public static final String DEFAULT_MESSAGE_PREFIX = "resourceMessages" ;
    //定义资源cache名为message_cache
                 private static final String CACHE_NAME = "message_cache" ;
    //定义资源文件存放位置
                private static final String PATH_PREFIX = "/WEB-INF/classes" ;
                private Properties p = null ;
       
                private static final long serialVersionUID = 3477255511805826715L;
                //获得本地化信息
                protected final Locale defaultLocale = Locale.getDefault();
               
                public void init() throws ServletException {
                    try{
                            initMessages();
                    }catch(Exception e){
                      System.out.println("Fatal:读取属性文件出错!");
                    }
                }
                protected void initMessages(){
                            //获取资源文件名
                            String messagePrefix = getServletConfig().getInitParameter("messages") ;
                             //获取资源文件存放路径
                            String messagePath = getServletConfig().getInitParameter("path") ;
                            if(null==messagePath){
                                        messagePath = "" ;
                            }
                           
                            InputStream input = null;
                            try {
                                       
                                        String messageFileName = null ;
                                        if(null==messagePrefix){
                                                    messageFileName = DEFAULT_MESSAGE_PREFIX + "_" +defaultLocale.toString()+MESSAGE_SUFFIX ;
                                        }else{
                                                    messageFileName = messagePrefix+ "_" +defaultLocale.toString()+MESSAGE_SUFFIX ;
                                        }
                                        String mfile = PATH_PREFIX+messagePath+"/"+messageFileName ;
                                        input = getServletContext().getResourceAsStream(mfile);
                            } catch (RuntimeException e) {
                                        String messageFileName = null ;
                                        if(null==messagePrefix){
                                                    messageFileName = DEFAULT_MESSAGE_PREFIX+MESSAGE_SUFFIX ;
                                        }else{
                                                    messageFileName = messagePrefix+MESSAGE_SUFFIX ;
                                        }
                                        String mfile = PATH_PREFIX+messagePath+"/"+messageFileName ;
                                        input = getServletContext().getResourceAsStream(mfile);
                            }
                           
                            p = new Properties();
                            try {
                                        p.load(input);
                                                    //蒋资源写入cache
                                        Object object = this.getCache().get(CACHE_NAME) ;
                                        if(null == object){
                                                    this.getCache().put(CACHE_NAME,p) ;
                                        }
                            } catch (IOException e) {
                                        e.printStackTrace();
                            }
                }
                //获取cache实例
                private LruCache getCache(){
                            return Cache.getCacheInstance() ;
                }
    }
     
    二:在web.xml中配置MessagesServlet
       <servlet>
          <servlet-name>MessagesServlet</servlet-name>
        <servlet-class>test.message.MessagesServlet</servlet-class>
        <init-param>
          <param-name>messages</param-name>
          <param-value>jsMessages</param-value>
        </init-param>
        <init-param>
          <param-name>path</param-name>
          <param-value>/js</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
       </servlet>
    这里指定了属性文件名为jsMessages.properties,jsMessages_zh_CN.properties….
    文件存放路径为WEB-INF/classes/js下。
    启动应用以后,资源文件就写入到cache中了,读取资源文件首先会查找本地资源文件,如中国就是*_zh_CN.properties,当这个文件不存在时就会读取jsMessages.propeties
     
    三:编写获取具体属性资源的java
    1.       MessageConstants.java
       package test.message;
     
     publicclass MessageConstants {
         publicfinalstatic String field_is_required = "field-is-required";
         publicfinalstatic String field_too_short = "field-too-short";
         publicfinalstatic String field_too_long = "field-too-long";
         publicfinalstatic String field_been_used = "field-been-used";
         publicfinalstatic String field_can_use = "field-can-use";
    }
    这里指定了几个常用的验证属性。
    域必须field-is-required
    。。。。
    2 BaseMessages.java
    package test.message.type;
     
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
     
    import org.xiaohongli.core.cache.Cache;
    import org.xiaohongli.core.cache.LruCache;
     
    publicabstractclass BaseMessage {
          privatestaticfinal String CACHE_NAME = "message_cache" ;
          privatestatic Properties prop = null ;
          protected LruCache getCache(){
                return Cache.getCacheInstance() ;
          }
         
        public Map<String, String> map = new HashMap<String, String>();
       
        protectedvoid setString(String index,String value){
         map.put(index, value) ;
        }
          //解析资源文件中的字符串如You must enter a value for {0}.
          protected String parse(String str){
         String ret = "" ;
         String[] str1 = str.split("[{]") ;
         for(int i=0 ;i<str1.length ;i++){
                String temp = str1[i] ;
                if(null==str1[i]||"".equals(str1[i].trim())||i==0) {
                      ret = ret + temp ;
                      continue ;
                }
                String index = temp.substring(0,1) ;
                String mstr = (String)map.get(index) ;
                ret = ret + mstr + temp.substring(2) ;
         }
         return ret ;
        }
     
        protected String _getMessage(String key){
                if(prop==null)
                      prop = (Properties)this.getCache().get(CACHE_NAME) ;
                returnprop.getProperty(key) ;
          }
         
    }
    这个方法提供了获取属性的几个基本的方法,如parse解析资源文件中的字符串。_getMessage会得到资源文件的相关属性。
     
    3Messages.java
    package test.message;
     
     
    import test.message.type.BaseMessage;
     
    publicclass Messages extends BaseMessage{
        private String basekey ;
          public String getBasekey() {
                returnbasekey;
          }
          publicvoid setBasekey(String basekey) {
                this.basekey = basekey;
          }
         
          //获取关键字对应的属性
          public String getMessage(String key){          
                String keyValue = _getMessage(key);
                return keyValue ;
          }
         
          //检测是否唯一时,当已经被使用时   
          public String getBeenUsedMessage(String key){
                setBasekey(MessageConstants.field_been_used) ;
                String keyValue = _getMessage(key);
                setString("0", keyValue) ;
                return parse(_getMessage(basekey));
          }
          //检测是否唯一时,没有被使用时
          public String getCanUseMessage(String key){
                setBasekey(MessageConstants.field_can_use) ;
                String keyValue = _getMessage(key);
                setString("0", keyValue) ;
                return parse(_getMessage(basekey));
          }
          //必须域
          public String getRequiredMessage(String key){
                setBasekey(MessageConstants.field_is_required) ;
                String keyValue = _getMessage(key);
                setString("0", keyValue) ;
                return parse(_getMessage(basekey));
          }
          //最小长度,key:关键字,length,长度
          public String getMinLengthMessage(String key,String length){
                setBasekey(MessageConstants.field_too_short) ;
                String keyValue = _getMessage(key);
                setString("0", length) ;
                setString("1", keyValue) ;
                return parse(_getMessage(basekey));
          }
    //最大小长度,key:关键字,length,长度
          public String getMaxLengthMessage(String key,String length){
                setBasekey(MessageConstants.field_too_long) ;
                String keyValue = _getMessage(key);
                setString("0", length) ;
                setString("1", keyValue) ;
                return parse(_getMessage(basekey));
          }          
    }
     
    4.这里列出具体的*.properties文件
     
    jsMessages_zh_CN.properties
     
    field-is-required=\u8BF7\u8F93\u5165{0}\u7684\u5185\u5BB9\u3002
    field-too-short={1}\u7684\u5185\u5BB9\u4E0D\u80FD\u5C11\u4E8E{0}\u5B57\u7B26\u3002
    field-too-long={1}\u7684\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7{0}\u4E2A\u5B57\u7B26\u3002
     
    field-been-used \u5BF9\u4E0D\u8D77\uFF0C\u8BE5{0}\u5DF2\u7ECF\u88AB\u4F7F\u7528\uFF01
    field-can-use \u60A8\u53EF\u4EE5\u4F7F\u7528\u8FD9\u4E2A{0}\uFF01
    ########
    account=\u8D26\u53F7
    permission-name=\u6743\u9650\u540D
    resource-name=\u8D44\u6E90\u540D
    role-name=\u89D2\u8272\u540D
     
    jsMessages.properties
    field-is-required=Youmustenteravaluefor{0}.
    field-too-short=Youmustenteratleast{0}charactersfor{1}.
    field-too-long=Youmustenternomorethan{0}charactersfor{1}.
    field-been-used Sorry,the{0}hasbeenused\!
    field-can-use=Youcanusethe{0}\!
    account=account
    permission-name=permission
    resource-name=resource
    role-name=role
     
    这个文件提供了几个最基本地验证属性,当然可以自己扩展。还有几个如account..是在我这个应用中要用到的。
     
    四:在项目中加入dwr
    1. dwr官方网站上http://getahead.ltd.uk/dwr下载dwr.jar,放到lib目录下。
    2. 编写dwr.xml
       <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
    <dwr>
        <allow>
            <create creator="spring" javascript="UserManager">
                <param name="beanName">userManager</param>
            </create>
            <create creator="spring" javascript="RoleManager">
                <param name="beanName">roleManager</param>
            </create>
            <create creator="spring" javascript="PermissionManager">
                <param name="beanName">permissionManager</param>
            </create>
            <create creator="spring" javascript="ResourceManager">
                <param name="beanName">resourceManager</param>
            </create>
                <create creator="spring" javascript="Messages">
                <param name="beanName">jsMessages</param>
            </create>
        </allow>
    </dwr>
    这里是调用spring中的bean,如果是通过其他方式获取bean的话,可参考dwr的官方文档。
     
    3.web.xml中加入
    <servlet>       
         <servlet-name>dwr-invoker</servlet-name>       
         <display-name>DWR Servlet</display-name>       
         <description>Direct Web Remoter Servlet</description>       
         <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>       
         <init-param>           
         <param-name>debug</param-name>           
         <param-value>true</param-value>       
         </init-param>  
         <init-param>
               <param-name>classes</param-name>
               <param-value>java.lang.Object</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
         </servlet>   
         <servlet-mapping>       
         <servlet-name>dwr-invoker</servlet-name>       
         <url-pattern>/dwr/*</url-pattern>   
         </servlet-mapping>
     
    3.打开浏览器,输入http://localhost:8080/youApp/dwr
    如果没有出错,就说明你dwr部署成功了。非常简单把。
     
    五.具体应用。
     
    <script type='text/javascript' src='../dwr/interface/UserManager.js'></script>
    <script type='text/javascript' src='../dwr/interface/Messages.js'></script>
    <script type='text/javascript' src='../dwr/engine.js'></script>
    <script type='text/javascript' src='../dwr/util.js'></script>
    <script type='text/javascript' src='js/message.js'></script>
     
    <script>
     
    function check (){
          var checkField = form.account.value ; 
           if(!requriedField(form.account,'account'))return false ;
           if(!minLengthField(form.account,'4','account'))return false ;
          UserManager.checkByField("Name",checkField,echoData) ;
    }
    function echoData(data){
         if(data){
                beenUsedField('account') ;
         }else{
            canUseMessage('account') ;
         }
    }
     
    </script>
     
    可能还遗漏了什么地方。欢迎大家提出批评意见。
     
     
     

    发表于 @ 2006年11月07日 11:42:00|评论(loading...)|编辑

    新一篇: dwr中同步执行的解决办法 | 旧一篇: SOAP, UDDI, WSIL 和 WSDL 的关系

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © xiaohongli