李李的技术博客

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 0 文章 :: 61 评论 :: 0 Trackbacks

2006年1月21日 #

为了降低侵入性,更好的被引用,对bba96核心部分进行了大量重构,去除了冗赘的层次与不必要的接口,并借助jdk5.0范型进行了代码精简。发布了bba96 tiger beta2,这个版本已经是比较稳定的版本,具体的改动如下

  • 去除所有的接口依赖,可直接在任何项目中直接调用
  • service的两层合并为一层且去除service层的接口,但DAO曾仍保留接口以备扩展更多的orm实现
  • 增加sql execute的方法
  • 增强源自view的直接查询能力
  • 参数名由原来难看的oriNames, oriOperators, oriStringValues改为直观的searchName, searchOperator, searchValue
  • 增加了对QueryParam的toString功能,可打出对应的sql,便于调试,参见com.bba96.tiger.util.QueryWebUtils的main函数

下载页面地址:https://bba96.dev.java.net/servlets/ProjectDocumentList?folderID=4149&expandFolder=4149&folderID=0

如果你使用spring+hibernate,而又不喜欢hibernate criteria的麻烦,不妨尝试一下bba96,你可以把主要精力放到业务方面。DefaultEntityManager提供了很多单层逻辑的便利方法给你使用,其中也包括执行hsql或者sql查询/更新的方法,如果你要多层次逻辑的条件查询可以自己组装QueryObject,参见com.bba96.tiger.util.QueryWebUtils的main函数。bba96还提供给你在view层自由增加查询的能力。

tiger版本仅提供了dao/service部分,所以如果你希望在view 查询的安全性方面得到加强,可参考bba96 2.0其中的webwork view部分,权限部分也没有包含在tiger中,希望尽快把包括例子的权限部分迁移过来,但还需要一点时间,最近在忙一个CMS的产品,时间不够用啊……

SpringSide项目中webwork MVC部分应用到bba96 tiger对view部分的查询,有兴趣可以看看,这里也要推荐一下SpringSide,确实有很多很好的经验在里面可以借鉴。

posted @ 2006-06-10 19:16 李李 阅读(1549) | 评论 (2)编辑 收藏

bba96 CHANGELOG
==========================
http://bba96.dev.java.net

Changes in version 2.0 alpha3 (2006.4.3)
*fix action query parameters bug -- [XXX:...]
*fix distinct bug (discard Criteria.DISTINCT_ROOT_ENTITY)
*some minor improvement

Changes in version 2.0 alpha2.2 (2006.3.16)
*update webwork's jar for fixing example bug in weblogic
*remove all contentType setting in example

Changes in version 2.0 alpha2.1 (2006.3.8)
*fix example bug
*update readme.txt

Changes in version 2.0 alpha1 (2006.3.7)
*webwork 2.2 support
*hibernate 3.x support, then support native sql
*fix some bug
*add aop security module
*add action query parameters validation
*enhance action query parameters management
*support more logic in action query
*support multi orderby property


Changes in version 1.0 (2005.09.23)
*release first


源码下载(包含两个快速开发的例子。)
https://bba96.dev.java.net/servlets/ProjectDocumentList?folderID=4149&expandFolder=4149&folderID=0

简介参见http://www.blogjava.net/scorpio_leon/archive/2005/11/09/18878.aspx

posted @ 2006-03-08 01:24 李李 阅读(1019) | 评论 (0)编辑 收藏

很容易找到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 @ 2006-01-21 13:26 李李 阅读(1602) | 评论 (0)编辑 收藏