上篇,所说为什么要用Stringbuffer的拼接来存储权限集合,而不用List或者Map集合
对于List或者Map List接口是对Collection进行了简单的扩充,它的泛化类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,存储对象会其元素顺序是按照加入顺序排列的,当如果循环存储,或者删除,都会进行排序,将对遍历的所有对象开辟N个空间,消耗占内存.Map是键值对是以哈希表的方式存储没有排序.但也消耗内存.具体的就不多讲了.
Stringbuffer 和string的拼接 又有性能上的差异,String 虽然是final类,String是原型类型,类似基本类型,就是说, 对他的修改都会创建一个新的对象,例如String s ="abc"; 修改String s="abc"+"c"
对象"abc" 与"abc"+"c"不是同一个对象,String字符串的拼接一般会重复创建string对象,StringBuffer与StringBuilder这两个类是为字符串设计的,后者是一个线程安全的类,
设计这两个类就是解决string反复创建新对象的问题,为什么StringBuffer一般效率高于String,是因为StringBuffer是一个Buffer,有一个字符缓冲数组,默认分配16个字符.
所以选用StringBuffer来存储权限集合对象.
package com.linktel.linkFax.web.zk.util;
import java.util.List;
import org.zkoss.zkplus.spring.SpringUtil;
import com.linktel.linkFax.LinkFaxContext;
import com.linktel.linkFax.domain.Authority;
import com.linktel.linkFax.domain.Resource;
import com.linktel.linkFax.domain.Role;
import com.linktel.linkFax.domain.User;
import com.linktel.linkFax.service.ResourceService;
public class AuthorityTools {
/**
* 通过资源名称查找功能权限 与登录用户所属角色所拥有的权限对比, 如果功能权限被授权的话返回授权;
*
* @param resourceName
* 功能资源名称;
* @return
*/
public static boolean hasPermission(String resourceName) {
StringBuffer authoritiesStr=(StringBuffer ) ZkUtils.getSessionAttr(LinkFaxContext.CURRENT_AUTHORITIESSTR);
ResourceService service = (ResourceService) SpringUtil
.getBean("resourceService");
Resource resource = service.getResourceByValue(resourceName);
List<Authority> authoritiesResource = resource.getAuths();
for (Authority authority : authoritiesResource) {
int index = authoritiesStr.indexOf(authority.getName());
if (index >= 0) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
}
以上内容是自己写了一个可重用的工具类,这个工具类是针对于循环遍历所操作的resource资源来验证当前登录的用户是否是有权限,如有权限就返回true 如没有就返回false
具体实现是这样的 之前我们把所有角色的权限放入了StringBuffer中 现在我们只要通过当前用户操作的resource资源
中的所包含的权限名称去比对角色中的权限名称
authoritiesStr.indexOf(authority.getName());
接下来就是在页面初始化的时候去绑定后台类对象
<?xml version="1.0" encoding="utf-8"?> <?page id="userPage"?> <?xel-method prefix="c" name="hasPermission" class="com.linktel.linkFax.web.zk.util.AuthorityTools" signature="com.linktel.linkFax.web.zk.util.AuthorityTools hasPermission(java.lang.String)"?> <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="./userWin"?> <window id="userWin" width="100%">
<div if="${c:hasPermission('CompanyUser')}"> <label value="按公司条件查询:"></label> <combobox id="cbxCompany" model="@{userWin.companyList}" selectedItem="@{userWin.company}" readonly="true"> <comboitem self="@{each=company}" label="@{company.name}"></comboitem> </combobox> </div> <separator width="260px" bar="true"></separator> <div if="${c:hasPermission('DeptUser')}"> <label value="按部门条件查询:"></label> <combobox id="cbxDept" model="@{userWin.deptList}" readonly="true" selectedItem="@{userWin.dept}"> <comboitem self="@{each=dept}" label="@{dept.name}"></comboitem> </combobox> </div>
</window>
<?xel-method prefix="c" name="hasPermission"
class="com.linktel.linkFax.web.zk.util.AuthorityTools"
signature="com.linktel.linkFax.web.zk.util.AuthorityTools hasPermission(java.lang.String)"?>
绑定后台类的指令
<div if="${c:hasPermission('CompanyUser')}">
if(${c:hasPermission('资源名称')}) 如果之前后台方法返回的是true 那么在加载的时候组件被创建,如果是false就 不被创建