随笔-348  评论-598  文章-0  trackbacks-0

应大家要求,在此帖上效果图:


设计信息系统的时候,往往要设计一套用户管理模块,其中就会牵扯到角色权限的分配,在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);


至此,权限树的问题就解决了。。

---------------------------------------------------------
专注移动开发

Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2008-11-19 09:22 TiGERTiAN 阅读(10321) 评论(69)  编辑  收藏 所属分类: JavaJSF

评论:
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-19 14:23 | huliqing
感觉很不错,一直想了解一下Richfaces.
不过如果能贴张效果图出来会更好,呵呵!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2008-11-19 15:10 | TEST
同意楼上的.强列要求,效果图.  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-19 20:41 | TiGERTiAN
@huliqing
已经上了图,可以看下  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-19 20:41 | TiGERTiAN
@TEST
已经上了图,可以看下  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-20 04:35 | Lf0x
不错,一直关注楼主写的关于 JSF 的文章  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-20 08:48 | TiGERTiAN
@Lf0x
嘿嘿,谢谢关注哈,我会继续保持更新JSF相关文章的,有什么好的经验大家互相分享和交流  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-22 18:52 | lwx
能提供一个完整的代码吗?包括传进去的树结构  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-23 11:36 | lwx
能提供下载吗,这样对大家更有帮助  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-23 14:40 | TiGERTiAN
@lwx
核心代码都在上面了,省略的就是数据库访问部分了,你可以根据代码看出来数据库结构。工程文件和数据库结构暂不方便提供,因为都是公司的商业代码,不好意思了。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-23 20:22 | lwx
能提供list的实例吗,从中看出父子关系是怎么表达的.我刚用richfaces,也想它来实现一个权限分配.用jsp的实现我有.谢谢  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-23 20:34 | lwx
FuncModuleTreeDefDTO
WSFactory
这是在哪里定义的  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-25 20:44 | sxc
你可以把“Richfaces复选框树(Checkbox tree)的权限分配的解决方案”的整个处理过程和代码发给我吗?我最近也急着要做这个。但还是不知道如何实现,刚刚接触richfaces。好多都不明白!!我的邮箱:kuangxiao163@163.com
非常感谢!!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-26 13:41 | c#编程

最近我们要做一个权限控制的树。但还是不知道如何实现。好多都不明白!!能给我发一份代码吗?万分感谢!为你祈福!我的邮箱:lulu88666@hotmaill.com   回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-26 16:19 | TiGERTiAN
@lwx
这几天比较忙,这周我争取再写篇详细的文章,一步一步写,到时候一一通知大家。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-26 16:20 | TiGERTiAN
@lwx
FuncModuleTreeDefDTO 数据库对象的传输对象,可以等同于数据库对象
WSFactory Web Services的一个工厂,从里面获得一个ws的  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-26 16:21 | TiGERTiAN
@sxc
这几天比较忙,这周我争取再写篇详细的文章,一步一步写,到时候一一通知大家。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-26 16:21 | TiGERTiAN
@c#编程
这几天比较忙,这周我争取再写篇详细的文章,一步一步写,到时候一一通知大家。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-28 18:47 | lwx
好不容易好界面做出来,点击也有反映,但为什么后台的程序没有记录选择结果呀?发一个代码吧.我的邮箱kgdlwx@yeah.net,QQ:41744098,多谢了  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-28 18:49 | lwx
<rich:panel header="Ajax树:">
<!-- 定义树,与后台bean根节点值绑定 -->
<rich:tree style="width:300px" value="#{ajaxTreeBean.treeNode}"
var="item" nodeFace="#{item.type}" switchType="ajax"
ajaxSubmitSelection="true" reRender="selectedNod"
nodeSelectListener="#{ajaxTreeBean.processSelection}">
<!-- 定义子节点,根据节点type分类 -->
<rich:treeNode type="latn" iconLeaf="/images/tree/singer.gif"
icon="/images/tree/singer.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.latn_name}" />
</rich:treeNode>

<rich:treeNode type="area" iconLeaf="/images/tree/disc.gif"
icon="/images/tree/disc.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.area_name}" />
</rich:treeNode>

<rich:treeNode type="substation" iconLeaf="/images/tree/song.gif"
icon="/images/tree/song.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.substation_name}" />

</rich:treeNode>
<rich:treeNode type="community" iconLeaf="/images/tree/song.gif"
icon="/images/tree/song.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.community_name}" />
</rich:treeNode>
</rich:tree>
</rich:panel>
<rich:panel header="您选择的节点为:" rendered="true">
<h:outputText id="selectedNod" value="#{ajaxTreeBean.nodeTitle}"></h:outputText>
</rich:panel>  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-28 21:00 | lwx
List<FuncModuleTreeDefDTO> list = WSFactory.getUserManagementBODelegate().getFuncModuleTreeDefsByParentId(parent);
这是取树的直接子节点,终开把代码,并且结合自己的实把树和checkbox显示出来,为什么我在action中,selected没有値呢?  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-29 11:06 | TiGERTiAN
@lwx
不会啊,参考下我的方法getPrivRoleDetailDefDTOs,这个方法需要在你的Action中调用,递归的获取用户已经选择的树节点。你可以再看下我的界面代码。因为性能问题,我不用Listener的,而且我的switchType是client,所以才会用到js来控制子节点checkbox的选择,否则如果用ajax配合Listener都不需要用js的,每次直接后台选择就好了。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 10:38 | lwx
我按照faclets和演示中的例子来组织,浏览器能显示树,但左边导航条不正常了,浏览器也报:已显示完毕,但网页中有错,看详细信息是,id为空戓不是对象.如果不用faclets和模板,则是正常的,你请你用demo中模块试一下吗?
<ui:define name="body">

<a4j:loadScript src="/jquery/jquery.js"/>

<script type="text/javascript">
...
</script>
<h:form>


<rich:tree value="#{department.departmentTreeNode}" var="item"
switchType="client"
nodeSelectListener="#{department.processSelection}" reRender="selectedNod">
<rich:treeNode>
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.name}" />
</rich:treeNode>
</rich:tree>
<rich:panel header="您选择的节点为:" rendered="true">
<h:outputText id="selectedNod" value="#{department.nodeTitle}"></h:outputText>
</rich:panel>
</h:form>
</ui:define>
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 10:40 | lwx
我就想模板和faclets,请帮我想想办法  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:34 | lwx
我后台就是没有结果
前台:
<h:form>
<rich:tree value="#{department.departmentTreeNode}" var="item"
switchType="client" >
<rich:treeNode>
<h:selectBooleanCheckbox
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.name}" />
</rich:treeNode>
</rich:tree>
<rich:panel header="您选择的节点为:" rendered="true">
<h:outputText id="selectedNod" value="#{department.nodeTitle}"></h:outputText>
</rich:panel>
<h:commandButton action="#{department.post}" value="提交" />
</h:form>  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:35 | lwx
后台
public void getRights(DepartmentTreeNode node)
{
if ( node == null )
return;
try {
Iterator itr = node.getChildren();
while (itr.hasNext()) {
DepartmentTreeNode childNode = (DepartmentTreeNode) ((Map.Entry)itr.next()).getValue();
System.out.println(childNode.getName()+":");
if ( childNode.isSelected() ) {
System.out.println("选择");
}
else
System.out.println("未选择");
// 把子权限也添加进去
getRights(childNode);
}

} catch (Exception e) {

}


}

public String post()
{
System.out.println("取选择结果");
getRights(rootNode);
return null;
}

后台显示树节点的名字是对的,就是没有selected的信息  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:40 | lwx
与前台的对应的java程序
package department;

import java.util.Iterator;
import java.util.Map;

import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;


public class Department {
private DepartmentTree departmentTree;


private String nodeTitle;

private DepartmentTreeNode rootNode;;


public DepartmentTreeNode getdepartmentTreeNode() {
try {
if (departmentTree == null)
departmentTree = new DepartmentTree();

rootNode=departmentTree.getDepartmentRootNode();
return rootNode;
} catch (Exception e) {
return null;
}
}


public String getNodeTitle() {
return nodeTitle;
}
public void setNodeTitle(String nodeTitle) {
this.nodeTitle = nodeTitle;
}

public void processSelection(NodeSelectedEvent event) {

HtmlTree tree = (HtmlTree) event.getComponent();
nodeTitle = tree.getRowData().toString();
}

public void getRights(DepartmentTreeNode node)
{
if ( node == null )
return;
try {
Iterator itr = node.getChildren();
while (itr.hasNext()) {
DepartmentTreeNode childNode = (DepartmentTreeNode) ((Map.Entry)itr.next()).getValue();
System.out.println(childNode.getName()+":");
if ( childNode.isSelected() ) {
System.out.println("选择");
}
else
System.out.println("未选择");
// 把子权限也添加进去
getRights(childNode);
}

} catch (Exception e) {

}


}

public String post()
{
System.out.println("取选择结果");
getRights(rootNode);
return null;
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:42 | lwx
生成树的程序
package department;

import java.util.ArrayList;
import java.util.List;

import org.richfaces.model.TreeNode;

import com.ibatis.sqlmap.client.SqlMapClient;


public class DepartmentTree {
private SqlMapClient sqlMap = null;

private static int root = 0;// 根节点的父编号


private DepartmentTreeNode departmentRootNode = null;

public DepartmentTree()
{

}
public DepartmentTreeNode getDepartmentRootNode() {
if (departmentRootNode == null) {
departmentRootNode = new DepartmentTreeNode();
departmentRootNode.setId(0);
departmentRootNode.setName("角色权限");
System.out.println("生成根节点");
}

initTree();

return departmentRootNode;
}


public void initTree() {
System.out.println("现在初始化我的树结构");
List<DepartmentInfo> list = null;


list = new ArrayList<DepartmentInfo>();
list.add(new DepartmentInfo(10,"大学",0,1));
list.add(new DepartmentInfo(11,"机械系",10,2));
list.add(new DepartmentInfo(12,"化工系",10,2));

addNodes(0, 0, departmentRootNode, list);

}



public void addNodes(int jibie, int shangjiID, TreeNode nodeParent,
List<DepartmentInfo> list) {
int i;
//System.out.print("父节点:");
for (i = 0; i < list.size(); i++) {
DepartmentInfo node;
node = list.get(i);
if ((node.getLevelNumber() == jibie + 1)
&& (node.getFatherID() == shangjiID)) { // 这是一个子节点
//System.out.println(node.getName()+"为一个子节点");
DepartmentTreeNode privNode = new DepartmentTreeNode();
privNode.setId(node.getId());
privNode.setName(node.getName());
privNode.setParent(nodeParent);
nodeParent.addChild(node.getId(), privNode);
addNodes(jibie + 1, node.getId(), privNode, list);
}
//else
//System.out.println(node.getName()+"不是一个子节点");


}
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:43 | lwx
部门树节点
package department;

import iBatis.MyAppSqlConfig;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.richfaces.model.TreeNode;

public class DepartmentTreeNode implements TreeNode
{
private int id;
private String name = null;
private TreeNode parent = null;
private Map children = new HashMap();
private boolean selected =false;

public DepartmentTreeNode(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);
}
}*/
}


public DepartmentTreeNode()
{
}



public void addChild(Object key, TreeNode tn)
{
children.put(key, tn);
}


public TreeNode getChild(Object key)
{

if(children != null)
return (TreeNode)children.get(key);
return null;
}


public Iterator getChildren()
{
if(children != null)
return children.entrySet().iterator();
return null;
}


public Object getData()
{

return this;
}


public TreeNode getParent()
{
return this.parent;
}


public boolean isLeaf()
{
if(children == null || children.isEmpty())
return true;
return false;

}


public void removeChild(Object key)
{
if(children != null)
children.remove(key);

}

public void setData(Object data)
{

}


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;
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:44 | lwx
部门信息
package department;
/*
部门信息结构
*/
public class DepartmentInfo {
private int id;
private String name;
private String station;
private int levelNumber;
private int children;
private int viewOrder;
private String openedICO;
private String closedICO;
private String linkUrl;
private String target;
private int isLink;
private String description;
private int isShow;
private int fatherID;

public DepartmentInfo()
{

}

public DepartmentInfo(int id,String name,int fatherID,int levelNumber)
{
this.id=id;
this.name=name;
this.fatherID=fatherID;
this.levelNumber=levelNumber;
}


public int getChildren() {
return children;
}
public void setChildren(int children) {
this.children = children;
}
public String getClosedICO() {
return closedICO;
}
public void setClosedICO(String closedICO) {
this.closedICO = closedICO;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getIsLink() {
return isLink;
}
public void setIsLink(int isLink) {
this.isLink = isLink;
}
public int getIsShow() {
return isShow;
}
public void setIsShow(int isShow) {
this.isShow = isShow;
}
public int getLevelNumber() {
return levelNumber;
}
public void setLevelNumber(int levelNumber) {
this.levelNumber = levelNumber;
}
public String getLinkUrl() {
return linkUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOpenedICO() {
return openedICO;
}
public void setOpenedICO(String openedICO) {
this.openedICO = openedICO;
}
public int getViewOrder() {
return viewOrder;
}
public void setViewOrder(int viewOrder) {
this.viewOrder = viewOrder;
}
public String getStation() {
return station;
}
public void setStation(String station) {
this.station = station;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public int getFatherID() {
return fatherID;
}
public void setFatherID(int fatherID) {
this.fatherID = fatherID;
}
}

  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:45 | lwx
为什么后台不能得到已选择的权限信息呢  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 13:47 | lwx
list.add(new DepartmentInfo(10,"大学",0,1));
list.add(new DepartmentInfo(11,"机械系",10,2));
list.add(new DepartmentInfo(12,"化工系",10,2));

节点含义
1-----id号
2-----节点名
3-----父节点id
4----层次
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 16:00 | lwx
我生成树的代码略有不同,难道这有区别吗  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:39 | lwx
在Tomcat下部署怎么都不行  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:40 | lwx
我都完全改成一样的格式了  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:48 | lwx
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<%@ page contentType="text/html;charset=gb2312"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

<f:view>
<html>
<head>

<title>ajaxTree</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="../jquery/jquery.js"></script>
<script type="text/javascript">
jQuery.noConflict();
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>



</head>

<body>

<p>
Ajax check box tree 使用JBoss Richfaces 与 JQuery 实现
</p>
<br />
<h:form>
<a4j:keepAlive beanName="ajaxTreeBean"></a4j:keepAlive>
<rich:panel header="Ajax树:">
<!-- 定义树,与后台bean根节点值绑定 -->
<rich:tree style="width:300px" value="#{ajaxTreeBean.treeNode}"
var="item" nodeFace="#{item.type}" switchType="ajax"
ajaxSubmitSelection="true" reRender="selectedNod"
nodeSelectListener="#{ajaxTreeBean.processSelection}">
<!-- 定义子节点,根据节点type分类 -->
<rich:treeNode type="latn" iconLeaf="/images/tree/singer.gif"
icon="/images/tree/singer.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.latn_name}" />
</rich:treeNode>

<rich:treeNode type="area" iconLeaf="/images/tree/disc.gif"
icon="/images/tree/disc.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.area_name}" />
</rich:treeNode>

<rich:treeNode type="substation" iconLeaf="/images/tree/song.gif"
icon="/images/tree/song.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.substation_name}" />

</rich:treeNode>
<rich:treeNode type="community" iconLeaf="/images/tree/song.gif"
icon="/images/tree/song.gif">
<h:selectBooleanCheckbox onclick="updateChildren(this)"
value="#{item.selected}"></h:selectBooleanCheckbox>
<h:outputText value="#{item.community_name}" />
</rich:treeNode>
</rich:tree>
</rich:panel>
<rich:panel header="您选择的节点为:" rendered="true">
<h:outputText id="selectedNod" value="#{ajaxTreeBean.nodeTitle}"></h:outputText>
</rich:panel>
<h:commandButton action="#{ajaxTreeBean.go}" value="Here we go!!!"></h:commandButton>
</h:form>
</body>
</html>
</f:view>
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:48 | lwx
package department;

public class DepartmentTree {
private static int root = 0;//根节点的父编号

private DepartmentTreeNode rootNode = null;

public DepartmentTreeNode getDepartmentTreeNode()
{
if(rootNode == null)
{
rootNode = new DepartmentTreeNode(root);
rootNode.setId(0);
rootNode.setName("角色权限");
}

return rootNode;
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:49 | lwx
package department;

import iBatis.MyAppSqlConfig;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.richfaces.model.TreeNode;
import com.ibatis.sqlmap.client.SqlMapClient;

public class DepartmentTreeNode implements TreeNode
{
private int id;
private String name = null;
private TreeNode parent = null;
private Map children = new HashMap();
private boolean selected =false;

private SqlMapClient sqlMap = null;

public DepartmentTreeNode(int parent)
{
List<DepartmentInfo> list = null;
sqlMap = MyAppSqlConfig.getSqlMapInstance();


try {
sqlMap.startTransaction();
list =(List<DepartmentInfo>)sqlMap.queryForList("getDepartments",parent);

sqlMap.commitTransaction();


} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sqlMap.endTransaction();
} catch (Exception e) {
}
}


if(list != null)
{
for(DepartmentInfo obj : list)
{
int oId = obj.getId();
DepartmentTreeNode node = new DepartmentTreeNode(oId);
node.setParent(this);
node.setId(oId);
node.setName(obj.getName());

addChild(oId, node);
}
}
}


public void addChild(Object key, TreeNode tn)
{
children.put(key, tn);
}


public TreeNode getChild(Object key)
{

if(children != null)
return (TreeNode)children.get(key);
return null;
}


public Iterator getChildren()
{
if(children != null)
return children.entrySet().iterator();
return null;
}


public Object getData()
{

return this;
}


public TreeNode getParent()
{
return this.parent;
}


public boolean isLeaf()
{
if(children == null || children.isEmpty())
return true;
return false;

}


public void removeChild(Object key)
{
if(children != null)
children.remove(key);

}

public void setData(Object data)
{

}


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;
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 21:50 | lwx
package department;
/*
部门信息结构
*/
public class DepartmentInfo {
private int id;
private String name;
private int parentID;

public DepartmentInfo()
{

}

public DepartmentInfo(int id,String name,int parentID)
{
this.id=id;
this.name=name;
this.parentID=parentID;
}

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 int getParentID() {
return parentID;
}

public void setParentID(int parentID) {
this.parentID = parentID;
}

}
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 23:17 | TiGERTiAN
@lwx
你用了Ajax的方式,就不要使用jQuery那个了,因为使用jQuery是为了在客户端模式下进行checkbox的一些相关操作,如果用了jQuery又用Ajax,可能会有错误的。。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-11-30 23:21 | TiGERTiAN
@lwx
而且,在这里不推荐使用Ajax和服务器的模式操作权限树,如果节点很多的话,你会发现速度很慢的。
你可以调整为客户端模式,尝试下,应该不会有问题的  回复  更多评论
  
# 这样一次读出所有数据,生成树有问题吗 2008-12-01 13:50 | lwx
package department;

import java.util.ArrayList;
import java.util.List;

import org.richfaces.model.TreeNode;

import com.ibatis.sqlmap.client.SqlMapClient;


public class DepartmentTree {
private SqlMapClient sqlMap = null;

private static int root = 0;// 根节点的父编号


private DepartmentTreeNode departmentRootNode = null;

public DepartmentTree()
{

}
public DepartmentTreeNode getDepartmentRootNode() {
if (departmentRootNode == null) {
departmentRootNode = new DepartmentTreeNode();
departmentRootNode.setId(0);
departmentRootNode.setName("角色权限");
System.out.println("生成根节点");
}

initTree();

return departmentRootNode;
}


public void initTree() {
System.out.println("现在初始化我的树结构");
List<DepartmentInfo> list = null;


list = new ArrayList<DepartmentInfo>();
//可改成从数据库里读
list.add(new DepartmentInfo(10,"大学",0,1));
list.add(new DepartmentInfo(11,"机械系",10,2));
list.add(new DepartmentInfo(12,"化工系",10,2));

addNodes(0, 0, departmentRootNode, list);

}



public void addNodes(int jibie, int shangjiID, TreeNode nodeParent,
List<DepartmentInfo> list) {
int i;
//System.out.print("父节点:");
for (i = 0; i < list.size(); i++) {
DepartmentInfo node;
node = list.get(i);
if ((node.getLevelNumber() == jibie + 1)
&& (node.getFatherID() == shangjiID)) { // 这是一个子节点
DepartmentTreeNode privNode = new DepartmentTreeNode();
privNode.setId(node.getId());
privNode.setName(node.getName());
privNode.setParent(nodeParent);
nodeParent.addChild(node.getId(), privNode);
addNodes(jibie + 1, node.getId(), privNode, list);
}



}
}

}


这样生成的树有问题吗?
  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 14:15 | TiGERTiAN
@lwx
没什么问题啊,你不是可以生成了嘛?我是指获取用户的选定值那块  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:48 | lwx
解决了,原来是提交时又把树重新生成了,真是怪事,按理不应该.
我把下面程序改了一下就可以了


private DepartmentTreeNode rootNode;;


public DepartmentTreeNode getdepartmentTreeNode() {
try {
if (departmentTree == null)
departmentTree = new DepartmentTree();

rootNode=departmentTree.getDepartmentRootNode();
return rootNode;
} catch (Exception e) {
return null;
}
}


改成
private DepartmentTreeNode rootNode;

public Department() {

departmentTree = new DepartmentTree();

rootNode=departmentTree.getDepartmentRootNode();
}


public DepartmentTreeNode getDepartmentTreeNode() {
return rootNode;
}

感谢TiGERTiAN给我们提供了这么多的资料,并耐心解释.

  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:53 | TiGERTiAN
@lwx
解决就好,但怎么会这样。。。你难道把scope调整的是request?我的是session,没有问题,还有就是,要注意最好用客户端的方式,防止节点过多速度很慢的。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:53 | lwx
还有一个问题,在richfaces-demo中加入这些代码(使用模板,faclets),浏览器会左下角会显示,已完成,但有错误,查看详细信息时显示:id为空或不是对象,但不影响使用.
iGERTiAN你能分析一下这是什么原因吗?  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:54 | lwx
我就用client方式,ajax是一个朋友的方法  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:55 | lwx
我的scope就是request,不行时用session也不行,怪.  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 16:59 | TiGERTiAN
@lwx
我在写部门树(跟这个不一样)和信息修改在统一页面上时经常碰到js错误,貌似主要是因为控件之间的搭配还有就是我们的数据生成有时候会有点小问题,可以后面再看看,了解下模板的一些使用技巧,是不是需要去掉一写代码什么的,暂时没怎么用过JSF的模板,所以不好说可能有哪些原因  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-01 17:00 | TiGERTiAN
@lwx
晕。。那就不太清楚了,有的时候用request有问题,用session就没有问题,主要就是一些对象实例没保存。。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-02 11:52 | turning
lwx:
不知道为什么nodeTitle的值无法传递的页面上呢?是不是生命周期的问题!希望能获得你的完整源代码!谢谢!邮箱:tulin_3@163.com

同时也谢谢楼主哈!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-02 13:47 | lwx
可以的,这个是没有问题,上面的就是源码了  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2008-12-05 22:04 | lwx
jquery.js主要是要解决级联选取的问题,不用也罢,因为我在模板下解决不报错的问题  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-03-15 22:33 | hjy
想实现这样的功能:系统管理员给用户分配功能权限,功能树是以复选框的形式显示,选择功能节点后,保存选中的项,查询该用户的功能权限时,复选框树上对应的功能处于选中状态。能否给个思路,有代码提供就更好了,谢谢!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2009-03-15 22:57 | Tigertian
@hjy
上面文章就是思路和代码  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-03-18 16:33 | 光魏斌
给我也发一份原代码吗,我很急但就是不能运行,想参考一下。
我的邮箱:xijing-gaofeng@sohu.com
拜托了~__~!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-03-18 22:33 | TiGERTiAN
@光魏斌
工程代码是商业的,不好散发。上面的代码已经基本说明了如何做了,你可以尝试测试下写写,有不清楚的,我们讨论下。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-03-19 11:01 | xx
级联选取似乎不起作用呀  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-04-20 12:26 | flyang000
我照着你上面的代码写了个测试的例子,但页面里什么都不显示,请问是什么原因,页面代码如下:
<h:form>
<rich:tree switchType="client" style="width:100px" 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>
</h:form>  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2009-04-20 12:55 | TiGERTiAN
@xx
可以的啊,通过jquery来的  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2009-04-20 12:56 | TiGERTiAN
@flyang000
你的数据源呢?没有数据不好显示的。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-07-13 17:06 | coolstone
请教一个问题:请问uncheck某个checkbox后,怎么将父节点的勾去掉?
(应该也是个递归调用)
谢谢!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2009-07-13 19:13 | tigertian
@coolstone
我本来做的,后来发现存在问题就被我删掉了,你可以尝试用JQuery来写。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-10-15 16:34 | tangyang
权限树的维护功能怎么实现(右键:新增、修改、删除)?
如果可以的话,请发给我一份详细点的代码(页面和后台Bean),谢谢!
邮箱:real.t@163.com  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2009-10-15 16:39 | TiGERTiAN
@tangyang
用下拉菜单维护就好了,就跟一般的部门维护差不多。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-10-16 10:43 | tangyang
关键是有一个问题,我解决不了,就是维护(新增、修改、删除)之后,对树的局部刷新问题(当前节点),我实现不了,请您帮忙。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2009-11-12 08:48 | TiGERTiAN
@tangyang
局部刷新不好做的,Richfaces就是一个单独的树控件,要刷就是全刷。所以树形的维护可以换一种方式,就是用下拉框来维护。  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2010-10-15 17:49 | ZXF
看了这篇日志,受益非浅。不过还有两个小问题想请教一下:1、如何在后台程序中获取选中的checkbox;2、生成树中节点的先如顺序如何控制(我做了一个测试的小例子,但是显示出来的树的结点顺序和我在数据库中定义的结点顺序不一至)。期待回复!  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案 2010-10-15 17:59 | TiGERTiAN
@ZXF
1.可以通过遍历那个Tree获得
2.顺序请看源码
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);
}
}
里面其实存在一个递归,都是根据你读取数据库返回的列表顺序来的  回复  更多评论
  
# re: 【JSF】Richfaces复选框树(Checkbox tree)的权限分配的解决方案[未登录] 2010-10-18 11:13 | ZXF
谢谢回复.1.目前,我只知道可以通过如下代码:HtmlTree tree = (HtmlTree)event.getComponent()在后台得到树,但不知道获取树中每个节点的checkedbox的代码如何写.2.我做了一个测试的小例子,但是我通过程序递归出来的数据的顺序与显示出来的树的结点顺序不一至(递归程序按顺序取到了数据,但绑定到树之后,显示出来的顺序就变了),不知道是怎么回事.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: