李李的技術(shù)博客

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            13 隨筆 :: 0 文章 :: 61 評(píng)論 :: 0 Trackbacks
          很容易找到getText實(shí)際的操作類是LocalizedTextUtil,方法public static String findText(Class aClass, String aTextName, Locale locale, String defaultMessage, Object[] args, OgnlValueStack valueStack);

          java doc 如下

          Finds a localized text message for the given key, aTextName. Both the key and the message itself is evaluated as required. The following algorithm is used to find the requested message:

          1. Look for message in aClass' class hierarchy.
            1. Look for the message in a resource bundle for aClass
            2. If not found, look for the message in a resource bundle for any implemented interface
            3. If not found, traverse up the Class' hierarchy and repeat from the first sub-step
          2. If not found and aClass is a ModelDriven Action, then look for message in the model's class hierarchy (repeat sub-steps listed above).
          3. If not found, look for message in child property. This is determined by evaluating the message key as an OGNL expression. For example, if the key is user.address.state, then it will attempt to see if "user" can be resolved into an object. If so, repeat the entire process fromthe beginning with the object's class as aClass and "address.state" as the message key.
          4. If not found, look for the message in aClass' package hierarchy.
          5. If still not found, look for the message in the default resource bundles.
          6. Return defaultMessage

          主要就是查找resource bundle,下面說(shuō)明一下
          1. 先查找該class(一般我們是在action調(diào)用,就是該action對(duì)應(yīng)的class了)對(duì)應(yīng)的properties文件,找不到再去找對(duì)應(yīng)的接口,找不到再去從該class的繼承樹(shù)上去重復(fù)前面的步驟。
          2. 如果是ModelDriver,以上找不到再以model的class去重復(fù)1的步驟
          3.繼續(xù)找,如果key是符合ognl表達(dá)式還以ognl表達(dá)式去解析類,如果能找到類,還以以上的步驟去查找
          4. 還找不到,就從根據(jù)package以及package的繼承樹(shù)去找,這還包括了該class的繼承樹(shù)所有的class的package樹(shù)(這一步存在了太多的重復(fù)查找工作,因?yàn)楹芏鄍ackage都是相同的)
          5 使用默認(rèn)的resource bundle

          java.util.ResourceBundle雖然有cache,但是ww為了減少調(diào)用getResourceBundle方法,也維護(hù)了一個(gè)miss的hashset,找不到的bundle name就丟進(jìn)去,那么每一次查找都同步了這個(gè)miss,如果很多次查找,開(kāi)銷也是很大的。

          我就舉一個(gè)例子,就說(shuō)第四步查找package樹(shù)好了

                  // nothing still? alright, search the package hierarchy now
                  for (Class clazz = aClass;
                       (clazz 
          != null&& !clazz.equals(Object.class);
                       clazz 
          = clazz.getSuperclass()) {

                      String basePackageName 
          = clazz.getName();
                      
          while (basePackageName.lastIndexOf('.'!= -1) {
                          basePackageName 
          = basePackageName.substring(0, basePackageName.lastIndexOf('.'));
                          String packageName 
          = basePackageName + ".package";
                          msg 
          = getMessage(packageName, locale, aTextName, valueStack, args);

                          
          if (msg != null) {
                              
          return msg;
                          }

                          
          if (indexedTextName != null) {
                              msg 
          = getMessage(packageName, locale, indexedTextName, valueStack, args);

                              
          if (msg != null) {
                                  
          return msg;
                              }
                          }
                      }
                  }

          假設(shè)你的action繼承樹(shù)是這樣
          com.bba96.core.webwork.actions.DefaultActionSupport
          com.xxxx.web.actions.XXXActionSupport
          com.xxxx.web.user.actions.UserAction
          com.xxxx.web.user.ViewUserAction
          且不說(shuō)ww沒(méi)有判斷是否是com.opensymphony.xwork.ActionSupport或者ww的接口就停止,光是自己的繼承樹(shù),就是4+3+3+3=13次,再加上往上的繼承樹(shù)以及對(duì)應(yīng)的接口,com.opensymphony.xwork.ActionSupport以及Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable, ContinuableObject的接口,查找次數(shù)超過(guò)30次甚至更多,這里的每一次都有一個(gè)同步miss的過(guò)程,開(kāi)銷相當(dāng)大。

          如果你的key所在的resource bundle沒(méi)有對(duì)應(yīng)到合適的class或package時(shí),例如說(shuō)放在了default bundle中,ww會(huì)浪費(fèi)很多時(shí)間。這種情況下,我在沒(méi)有并發(fā)的時(shí)候測(cè)了一下,一次getText大概耗時(shí)40ms左右

          所以在實(shí)際應(yīng)用我們應(yīng)該避免這種情況出現(xiàn),要不讓resource bundle一一對(duì)應(yīng)class,要不就自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的getText,其實(shí)要是ww的ActionSupport的textProvider允許改變就最好了。

          posted on 2006-01-21 13:26 李李 閱讀(1628) 評(píng)論(0)  編輯  收藏 所屬分類: 技術(shù)
          主站蜘蛛池模板: 新和县| 徐闻县| 呼伦贝尔市| 茶陵县| 太湖县| 楚雄市| 微博| 江都市| 光泽县| 莆田市| 万安县| 崇州市| 湘潭县| 闻喜县| 秀山| 南漳县| 开鲁县| 安化县| 峡江县| 金昌市| 永丰县| 花莲县| 临海市| 哈巴河县| 钟祥市| 永平县| 湖南省| 台北市| 通榆县| 高州市| 铜梁县| 天峻县| 榆中县| 云南省| 开远市| 饶平县| 启东市| 依兰县| 巴林右旗| 永定县| 开鲁县|