【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案
应大家要求,在此帖上效果图:
设计信息系统的时候,往往要设计一套用户管理模块,其中就会牵扯到角色权限的分配,在Richfaces中可以使用PickList来进行角色的分配,但权限的分配不好使用这个控件,因为权限有时候根据父子模块来分配,那么就要分级,而PickList不带分级功能,这时候我们就需要一个Checkbox tree来满足我们的需要。
Checkbox tree的页面代码:
<rich:tree switchType="client" value="#{user.privilegeTree}"
var="item" selectedClass="selectedNode">
<rich:treeNode highlightedClass="treeLink">
<h:selectBooleanCheckbox value="#{item.selected}">
</h:selectBooleanCheckbox>
<h:outputText value="#{item.name}" />
</rich:treeNode>
</rich:tree>页面用到的js代码,(注意:如果页面中有其他的checkbox,这段代码需要进行修改):
<script type="text/javascript" src="<%=basePath%>pages/js/jquery.js"></script>
<script type="text/javascript">
jQuery.noConflict();//与JSF搭配需要这句话,不然会有冲突
jQuery(document).ready(function() {
// Add click event listener to each checkbox in the tree page
// Note! Using this simple selector assumes that there are no other
// checkboxes on the page, if there are other checkboxes then
// selector should be changed
jQuery(":checkbox").click(function(){
updateChildren(this);
});
});
</script>
<script type="text/javascript">
function updateChildren(currentCheckBox)
{
// Get state of current checkbox (true or false)
var state = currentCheckBox.checked;
// Get parent TABLE, where current checkbox is places
var parentTables = jQuery(currentCheckBox).parents("table");
var parentTable = parentTables[0];
// Get DIV where child nodes with checkboxes are situated
// See http://docs.jquery.com/Traversing/ to get better uderstanding of
// parents() and next()
var childDivs = jQuery(parentTable).next("div");
var childDiv = childDivs[0];
// Iterate over all child nodes checkboxes and set same state as the
// current checkbox state
jQuery(childDiv).contents().find(":checkbox").each(function() {
this.checked = state;
});
}
</script>这样页面部分就完成了,下面是后台处理的代码。
User当中的代码:
public PrivilegeTreeNode getPrivilegeTree()
{
try {
if ( privilegeTree == null )
privilegeTree = new PrivilegeTree();
return privilegeTree.getPrivilegeRootNode();
} catch (Exception e) {
info("获得权限树出错", e);
return null;
}
}
权限树代码:
public class PrivilegeTree
{
private static int root = 0;//根节点的父编号
private PrivilegeTreeNode privilegeRootNode = null;
public PrivilegeTreeNode getPrivilegeRootNode()
{
if(privilegeRootNode == null)
{
privilegeRootNode = new PrivilegeTreeNode(root);
privilegeRootNode.setId(0);
privilegeRootNode.setName("角色权限");
}
return privilegeRootNode;
}
}树节点的代码:
public class PrivilegeTreeNode implements TreeNode
{
private int id;
private String name = null;
private TreeNode parent = null;
private Map children = new HashMap();;
private boolean selected = false;
private FuncModuleTreeDefDTO funcModuleTreeDefDTO = null;
public PrivilegeTreeNode(int parent)
{
List<FuncModuleTreeDefDTO> list = WSFactory.getUserManagementBODelegate().getFuncModuleTreeDefsByParentId(parent);
if(list != null)
{
for(FuncModuleTreeDefDTO obj : list)
{
int oId = obj.getFuncModuleTreeDef().getModuleid();
PrivilegeTreeNode node = new PrivilegeTreeNode(oId);
node.setParent(this);
node.setId(oId);
node.setName(obj.getFuncModuleTreeDef().getModuleName());
node.setFuncModuleTreeDefDTO(obj);
addChild(oId, node);
}
}
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#addChild(java.lang.Object, org.richfaces.model.TreeNode)
*/
public void addChild(Object key, TreeNode tn)
{
children.put(key, tn);
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#getChild(java.lang.Object)
*/
public TreeNode getChild(Object key)
{
// TODO Auto-generated method stub
if(children != null)
return (TreeNode)children.get(key);
return null;
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#getChildren()
*/
public Iterator getChildren()
{
if(children != null)
return children.entrySet().iterator();
return null;
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#getData()
*/
public Object getData()
{
// TODO Auto-generated method stub
return this;
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#getParent()
*/
public TreeNode getParent()
{
return this.parent;
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#isLeaf()
*/
public boolean isLeaf()
{
if(children == null || children.isEmpty())
return true;
return false;
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#removeChild(java.lang.Object)
*/
public void removeChild(Object key)
{
if(children != null)
children.remove(key);
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#setData(java.lang.Object)
*/
public void setData(Object data)
{
}
/**//* (non-Javadoc)
* @see org.richfaces.model.TreeNode#setParent(org.richfaces.model.TreeNode)
*/
public void setParent(TreeNode parent)
{
// TODO Auto-generated method stub
this.parent = parent;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public boolean isSelected()
{
return selected;
}
public void setSelected(boolean selected)
{
this.selected = selected;
}
public void setChildren(Map children)
{
this.children = children;
}
public FuncModuleTreeDefDTO getFuncModuleTreeDefDTO()
{
return funcModuleTreeDefDTO;
}
public void setFuncModuleTreeDefDTO(FuncModuleTreeDefDTO funcModuleTreeDefDTO)
{
this.funcModuleTreeDefDTO = funcModuleTreeDefDTO;
}
}User中,获取用户选定值得代码:
此为递归函数,需要在其他业务逻辑中调用
/** *//**
* 获得所有被选择权限的列表
*
* @param list
* PrivRoleMainDefDTO的权限列表
* @param node
* 从哪个树获取
* @param gregorianCalendarDate
* 当前时间
* @param userid
* 当前用户id
* @param roleId
* 相关角色id
*/
private void getPrivRoleDetailDefDTOs(List<PrivRoleDetailDefDTO> list,
PrivilegeTreeNode node, XMLGregorianCalendar gregorianCalendarDate,
Integer userid, int roleId)
{
if ( node == null )
return;
try {
Iterator itr = node.getChildren();
while (itr.hasNext()) {
PrivilegeTreeNode childNode = (PrivilegeTreeNode) ((Entry)itr.next()).getValue();
if ( childNode.isSelected() ) {
PrivRoleDetailDef detail = new PrivRoleDetailDef();
FuncModuleTreeDef fm = childNode
.getFuncModuleTreeDefDTO().getFuncModuleTreeDef();
detail.setModuleid(fm.getModuleid());
detail.setLogOperAction(fm.getLogOperAction());
detail.setPrivType(1);
detail.setRecUpdateTime(gregorianCalendarDate);
detail.setRecUpdateUserid(userid);
detail.setRoleid(roleId);
PrivRoleDetailDefDTO dto = new PrivRoleDetailDefDTO();
dto.setPrivRoleDetailDef(detail);
list.add(dto);
info("Module Id: " + detail.getModuleid()+ ", Module Name: " + childNode.getName());
}
// 把子权限也添加进去
getPrivRoleDetailDefDTOs(list, childNode,
gregorianCalendarDate, userid, roleId);
}
} catch (Exception e) {
info("获得权限详细列表出错", e);
}
}修改权限信息时,初始化权限树:
/** *//**
* 根据指定的值初始化权限树
* @param list 若指定该值,则用该列表初始化树的选择
* @param node 根树节点
* @param b 如没有指定list,则取本值初始化权限树
*/
private void initPrivilegeTree(List<PrivRoleDetailDefDTO> list,
PrivilegeTreeNode node, boolean b)
{
if ( node == null )
return;
try {
if(list == null)//如果没有指定列表
{
node.setSelected(b);
}else{//指定了列表之后
for(int i = 0; i< list.size(); i++)
{
PrivRoleDetailDef obj = ((PrivRoleDetailDefDTO)list.get(i)).getPrivRoleDetailDef();
if(obj.getModuleid().compareTo(new Integer(node.getId())) == 0)
{
//找到并移除当前列表里面的值
node.setSelected(true);
list.remove(i);
}
}
}
//初始化子节点
Iterator itr = node.getChildren();
while (itr.hasNext()) {
PrivilegeTreeNode childNode = (PrivilegeTreeNode) ((Entry)itr.next()).getValue();
initPrivilegeTree(list, childNode, b);
}
} catch (Exception e) {
info("获得权限详细列表出错", e);
}
}同样也是一个递归函数,调用的时候需要注意。
初始化权限树之前,需要拷贝一份list,因为我在初始化权限树的时候不断的从原有list中删除数据
List<PrivRoleDetailDefDTO> list = new ArrayList<PrivRoleDetailDefDTO>(roleMain.getPrivRoleDetailDefDTOs().size());
for(Object obj : roleMain.getPrivRoleDetailDefDTOs().toArray())
{
list.add((PrivRoleDetailDefDTO)obj);
}
initPrivilegeTree(list, getPrivilegeTree(), false);
至此,权限树的问题就解决了。。
声明:此文章从
http://www.blogjava.net/TiGERTiAN/archive/2008/11/19/241278.html转载过来的
分享到:
相关推荐
虽然资源分高了点,但是下载后你就发现很值了。里面的代码都依依做到了。无论你的数据有多少层,都可以生成一颗树形结构,十分清晰! 不明白加入群:73624154
RichFaces自动构建树实现,中文版,希望对大家有帮助
JSF Richfaces构建树实例 JSF Richfaces构建树
jdk 1.5,jsf 1.2.*,richfaces 3.1.*
java richfaces自动构建树实现
jboss的richfaces-ui-3.2.1.GA 同样受大小的限制,只上传jar包
JSF+RichFaces(Ajax4jsf)框架示例
Richfaces标签 简介Richfaces标签相关内容 初学者认知
richfaces标签学习笔记richfaces标签学习笔记richfaces标签学习笔记richfaces标签学习笔记
RichFaces框架的基本概念架 该框架是一个能在现有的页面增加Ajax的功能的组件库,所以你不需要写任何JavaScript代码或用新的Ajax工具集(widget)取代现有的组件。RichFaces具有页面范围(page-wide)的Ajax支持,而...
本文档主要根据richfaces3.3.3 用户手册和demo 编写。 Richfaces 下载地址http://www.jboss.org/richfaces/download/stable。 demo 下载地址http://www.jboss.org/richfaces/demos。
这是richfaces 3.3.1的用户手册PDF版
教会如何使用richfaces,及richfaces应用
seam+richfaces环境框架的配置文件,经过我多次尝试才配置好的环境配置文件,很有用,适合刚接触这些技术的初学者,希望大家支持!
关于richfaces的一些比较好的资料,希望大家看了能有收获
Richfaces3.3.3常用组件使用手册 便于学习Richfaces和a4j和jsf框架 很好很实用
Richfaces组件使用指南、richfaces手册(很详细、很全面的教程)
RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。RichFaces组件简介,复合组件,日期控件,Ajax标签, 轻松实现。
RichFaces_3.3.3_TLD.chm
richfaces中文开发文档 纯中文 适合维护老项目的人