众所周知,struts中,数据交互是走的ValueStack,在权限交互中,我们有些数据,存储到ValueStack中,更容易被用户利用,用户可以在jsp或者其他框架下,利用已有的数据,让前台不需要关心权限数据是如何存储的,只需要关心我们某一个权限标示是否被通过了,这是如何实现的呢?大家看源码。
在struts-default.xml文件中决定了在web容器启动时将会创建OgnlValueStackFactory对象,该对象实现了ValueStackFactory接口,负责ValueStack的创建工作。ValueStack的生命周期是随着request的创建而创建,随request的销毁而销毁。具体可见源代码:在PrepareOperations类的createActionContext
至于清理工作,struts统一放在了PrepareOperations类的cleanupRequest方法中。
实际不需多说,大家写jsp源码时,可以预见,这是种map类型的机构,符合OGNL特点,或者说struts实现了OGNL
CompoundRoot继承了ArrayList类,即是一个List集合,详见源码CompoundRoot类。
Context:而context实际上是一个hashMap
知道原理之后,使用就变得非常简单
添加
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;
}
由于前台使用的是velocity进行组合,所以,获取值的时候,需要写如下代码:
#if($!{auth_el_net_testauth_add})
<input type="button" style="width:100px;" value="添加"></input>
#end
非常简单的例子,第一步将我们需要实现的功能进行了整合,但是还是不够简单,我们应该提供一种更简单的接入方式,前台开发只需要引入js,使用特殊标签将资源包裹,就能自动判断,这种方案,我们下片博客介绍