struts2对Ognl的封装--NullHandler

Ognl 中NullHandler

  1.用于方法调用返回值为null时的处理,可以生成一个对象代替方法返回值。

  2.用于属性取值时返回值为null时的处理,可以生成一个对象为该属性赋值再返回。

 举例:

  如前台页面提交user.name=yanlei,但Action中的user对象为null,则可以新建user对象,赋给Action,再把user对象的name属性赋值=yanlei.

 

     Struts 加载扩展的NullHandler  

            Struts 中在OgnlValueStackFactory中调用OgnlRuntime.setNullHandler(Class clazz, NullHandler 实例)方法来加载Struts中定义的NullHandlerAccessor。

             在OgnlValueStackFactory 实例化之后,注入Containter时:      

 

 @Inject
    public void setContainer(Container container) throws ClassNotFoundException {
      //省略其它代码
        names = container.getInstanceNames(NullHandler.class);
        for (String name : names) {
            Class cls = Class.forName(name);
            if (cls != null) {
                OgnlRuntime.setNullHandler(cls, new OgnlNullHandlerWrapper(container.getInstance(NullHandler.class, name)));
            }
        }
     
        this.container = container;
    }

               那么Container中的MethodAccessor类是从哪加载进来的呢??

 

   是由Struts-default.xml中bean定义中加载的:

 <bean type="com.opensymphony.xwork2.conversion.NullHandler" name="java.lang.Object" class="com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler" />

 该NullHandler 非Ognl.NullHandler,Ognl不认识,所以需要接口适配器OgnlNullHandlerWrapper对其进行包装。

 



 
InstantiatingNullHandler 对nullMethodResult 直接返回null,没有处理。

  nullPropertyValue方法:

     如果允许新建属性对象ReflectionContextState.isCreatingNullObjects(context)==true,则新建属性,并赋值给当前类,返回新建的属性对象。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值