权限管理框架实现(2)--Struts中ValueStack使用

来源:互联网 发布:mac打开照片 编辑:程序博客网 时间:2024/05/18 01:59

        众所周知,struts中,数据交互是走的ValueStack,在权限交互中,我们有些数据,存储到ValueStack中,更容易被用户利用,用户可以在jsp或者其他框架下,利用已有的数据,让前台不需要关心权限数据是如何存储的,只需要关心我们某一个权限标示是否被通过了,这是如何实现的呢?大家看源码。


1,生命周期

        在struts-default.xml文件中决定了在web容器启动时将会创建OgnlValueStackFactory对象,该对象实现了ValueStackFactory接口,负责ValueStack的创建工作。ValueStack的生命周期是随着request的创建而创建,随request的销毁而销毁。具体可见源代码:在PrepareOperations类的createActionContext
        至于清理工作,struts统一放在了PrepareOperations类的cleanupRequest方法中。


2,数据结构

        实际不需多说,大家写jsp源码时,可以预见,这是种map类型的机构,符合OGNL特点,或者说struts实现了OGNL

        


        CompoundRoot继承了ArrayList类,即是一个List集合,详见源码CompoundRoot类。
        Context:而context实际上是一个hashMap


3,例子

        知道原理之后,使用就变得非常简单


添加

private void toVm(Result result){        ValueStack context = ActionContext.getContext().getValueStack();        Set set = result.keySet();        Iterator resultCode = set.iterator();        context.set("textProvider", this);        context.set("datePickerLocale", this.getDatePickerLocale());        String text;        while(resultCode.hasNext()) {            text = (String)resultCode.next();            context.set(text, result.get(text));        }    }


获取
private String getFromVm(String authCode){        ValueStack context = ActionContext.getContext().getValueStack();        Map map = (Map)context.peek();        String result = ((Boolean)map.get(authCode)).toString();        return result;    }

        
        



4,前台

        由于前台使用的是velocity进行组合,所以,获取值的时候,需要写如下代码:

#if($!{auth_el_net_testauth_add})    <input type="button" style="width:100px;" value="添加"></input>#end


总结

        非常简单的例子,第一步将我们需要实现的功能进行了整合,但是还是不够简单,我们应该提供一种更简单的接入方式,前台开发只需要引入js,使用特殊标签将资源包裹,就能自动判断,这种方案,我们下片博客介绍



2 0
原创粉丝点击