<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    李李的技術博客

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      13 隨筆 :: 0 文章 :: 61 評論 :: 0 Trackbacks
    很容易找到getText實際的操作類是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,下面說明一下
    1. 先查找該class(一般我們是在action調用,就是該action對應的class了)對應的properties文件,找不到再去找對應的接口,找不到再去從該class的繼承樹上去重復前面的步驟。
    2. 如果是ModelDriver,以上找不到再以model的class去重復1的步驟
    3.繼續找,如果key是符合ognl表達式還以ognl表達式去解析類,如果能找到類,還以以上的步驟去查找
    4. 還找不到,就從根據package以及package的繼承樹去找,這還包括了該class的繼承樹所有的class的package樹(這一步存在了太多的重復查找工作,因為很多package都是相同的)
    5 使用默認的resource bundle

    java.util.ResourceBundle雖然有cache,但是ww為了減少調用getResourceBundle方法,也維護了一個miss的hashset,找不到的bundle name就丟進去,那么每一次查找都同步了這個miss,如果很多次查找,開銷也是很大的。

    我就舉一個例子,就說第四步查找package樹好了

            // 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;
                        }
                    }
                }
            }

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

    如果你的key所在的resource bundle沒有對應到合適的class或package時,例如說放在了default bundle中,ww會浪費很多時間。這種情況下,我在沒有并發的時候測了一下,一次getText大概耗時40ms左右

    所以在實際應用我們應該避免這種情況出現,要不讓resource bundle一一對應class,要不就自己實現一個簡單的getText,其實要是ww的ActionSupport的textProvider允許改變就最好了。

    posted on 2006-01-21 13:26 李李 閱讀(1628) 評論(0)  編輯  收藏 所屬分類: 技術
    主站蜘蛛池模板: 免费涩涩在线视频网| 无码永久免费AV网站| 亚洲综合区小说区激情区| 国产综合激情在线亚洲第一页| 国产成人免费高清激情视频| 亚洲AV无码一区二区三区牛牛| 最新仑乱免费视频| 亚洲av无码成人影院一区| 国产精品美女自在线观看免费| 亚洲欧美乱色情图片| 国产人妖ts在线观看免费视频| 高潮毛片无遮挡高清免费| 激情无码亚洲一区二区三区| 精品久久久久久久免费加勒比| 猫咪www免费人成网站| 亚洲伊人久久综合中文成人网| j8又粗又长又硬又爽免费视频| 亚洲熟妇丰满多毛XXXX| 最近2018中文字幕免费视频| 亚洲六月丁香婷婷综合| 国产精品无码一区二区三区免费 | 99爱在线精品视频免费观看9| 亚洲第一二三四区| 国产羞羞的视频在线观看免费| 亚洲国产精品无码久久一线| 亚洲免费视频网址| 九九精品国产亚洲AV日韩| 最新精品亚洲成a人在线观看| 最近中文字幕无免费| 在线观看亚洲网站| 久久精品国产亚洲AV麻豆不卡 | 亚洲一区二区三区免费观看| 亚洲变态另类一区二区三区 | 久久亚洲AV成人无码软件| 成人免费毛片观看| 成人av片无码免费天天看| 亚洲avav天堂av在线网爱情| 内射无码专区久久亚洲| 99在线视频免费| 黄色a三级免费看| 亚洲码在线中文在线观看|