Struts2、Spring3、MyBatis3整合ExtJS,完成CheckNodeColumnTree

简介:

前面介绍了ColumnTree:http://www.cnblogs.com/hoojo/archive/2011/05/11/2043426.html

http://www.cnblogs.com/hoojo/archive/2011/05/11/2043453.html

加入CheckNodeColumnTree

A、首先在AccountAction中添加如下代码:

private String jsonText;
 
public String getJsonText() {
    return jsonText;
}
 
public String checkNodeColumnTreeData() throws Exception {
    jsonText = JSONUtil.serialize(results);
    //ServletActionContext.getResponse().getWriter().print(jsonText);
    return "showData";
}

我们不直接使用Servlet的response方法,这样会使Action耦合Servlet的API。我们直接在Action中提供一个jsonText的属性,给该属性提供getter方法。然后当执行checkNodeColumnTreeData这个方法的时候,为jsonText赋值。等待请求成功,跳转到showData的视图中直接去取jsonText的值即可。

B、看看struts.xml中的配置

<action name="account" class="accountAction">
    <result type="redirect">account!show.action</result>
    <result name="show">/show.jsp</result>
    <result name="showData">/showData.jsp</result>
    <result name="tree" type="json">
        <param name="excludeProperties">acc</param>
        <param name="contentType">text/html</param>
    </result>
</action>

就配置一个result就可以了,跳转到showData页面

C、下面看看showData页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/text; charset=UTF-8"%>
${jsonText}

代码比较简单,设置下页面才contentType、然后用el表达式取出jsonText的值即可。

D、下面看看CheckNodeColumnTree代码

Ext.hoo.tree.UserCheckNodeColumnTree.js

/**
 * @function CheckNode ColumnTree 多列信息的tree
 * @auhor: hoojo
 * @createDate: Aug 29, 2010 10:39:02 PM
 * @blog: blog.csdn.net/IBM_hoojo
 * @email: hoojo_@126.com
 */
Ext.ns("Ext.hoo.tree");
Ext.hoo.tree.UserCheckNodeColumnTree = Ext.extend(Ext.tree.ColumnTree, {
    constructor: function () {
        Ext.hoo.tree.UserCheckNodeColumnTree.superclass.constructor.call(this, {
            renderTo: "show",
            title: "远程数据",
            width: 600,
            hieght: 400,
            autoScroll: true,
            rootVisible: true,
            checkModel: 'cascade',//级联多选,如果不需要checkbox,该属性去掉   
              onlyLeafCheckable: false,//所有结点可选,如果不需要checkbox,该属性去掉
              columns: [{
                header: "编号",
                width: 100,
                dataIndex: "accountId"
            }, {
                header: "用户名称",
                width: 100,
                dataIndex: "username"
            }, {
                header: "密码",
                width: 100,
                dataIndex: "password"
            }, {
                header: "创建时间",
                width: 150,
                dataIndex: "createTime"
            }],
            loader: new Ext.tree.TreeLoader({
                dataUrl: Ext.hoo.tree.UserCheckNodeColumnTree.TREE_DATA_URL,
                clearOnLoad: false,
                baseAttrs: {
                    uiProvider: Ext.ux.ColumnTreeCheckNodeUI,
                    leaf: true
                }
            }),
            root: new Ext.tree.AsyncTreeNode({
                text: "用户基本信息",
                id: "root"
            })
        });
    }
});
 
Ext.hoo.tree.UserCheckNodeColumnTree.TREE_DATA_URL = "account!checkNodeColumnTreeData.action";
 
Ext.onReady(function () {
    Ext.BLANK_IMAGE_URL = "ext2/resources/images/default/s.gif";
    new Ext.hoo.tree.UserCheckNodeColumnTree();
});

在webroot目录的jslib中加入这个文件Ext.hoo.tree.UserCheckNodeColumnTree.js,然后导入到html中即可。

E、上面的代码用到了Ext.ux.ColumnTreeCheckNodeUI这个UI,我们需要加入这个UI文件Ext.tree.ColumnTreeCheckNodeUI.js,代码如下:

/*
 * Ext JS Library 2.0
 * Copyright(c) 2006-2007, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */
 
Ext.tree.ColumnTree = Ext.extend(Ext.tree.TreePanel, {
    //lines:false,
    borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell
    cls:'x-column-tree',
    scrollOffset : 18,
    
    onRender : function(){
        Ext.tree.ColumnTree.superclass.onRender.apply(this, arguments);
        this.headers = this.body.createChild(
            {cls:'x-tree-headers '},this.body.dom);
        var cols = this.columns, c;
        var totalWidth = 0;
 
        for(var i = 0, len = cols.length; i < len; i++){
             c = cols[i];
             totalWidth += c.width;
             this.headers.createChild({
                 cls:'x-tree-hd ' + (c.cls?c.cls+'-hd':''),
                 cn: {
                     cls:'x-tree-hd-text',
                     html: c.header
                 },
                 style:'width:'+(c.width-this.borderWidth)+'px;'
             });
        }
        
        this.headers.createChild({
             cls:'x-tree-hd ',
             cn: {
                 html: ''
             },
             style:'width:'+this.scrollOffset+'px;'
         });
        totalWidth += this.scrollOffset;
        
        this.headers.createChild({cls:'x-clear'});
        // prevent floats from wrapping when clipped
        this.headers.setWidth(totalWidth);
        totalWidth -= this.scrollOffset;
        this.innerCt.setWidth(totalWidth);
    }
});
 
Ext.tree.ColumnTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
    focus: Ext.emptyFn, // prevent odd scrolling behavior
 
    renderElements : function(n, a, targetNode, bulkRender){
        this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
 
        var t = n.getOwnerTree();
        var cols = t.columns;
        var bw = t.borderWidth;
        var c = cols[0];
 
        var cb = typeof a.checked == 'boolean';
        if(typeof this.checkModel != 'undefined'){
            cb = (!this.onlyLeafCheckable || n.isLeaf());
        }
        var href = a.href ? a.href : Ext.isGecko ? "" : "#";
        var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',
                '<div class="x-tree-col" style="width:',c.width-bw,'px;">',
                    '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
                    '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow">',
                    '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on">',
                    cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',
                    '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',
                    a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '>',
                    '<span unselectable="on">', n.text || (a[c.dataIndex]?(c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]):''),"&nbsp;</span></a>",
                "</div>"];
         for(var i = 1, len = cols.length; i < len; i++){
             c = cols[i];
             buf.push('<div class="x-tree-col ',(c.cls?c.cls:''),'" style="width:',c.width-bw,'px;">',
                        '<div class="x-tree-col-text">',(a[c.dataIndex]?(c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]):''),"&nbsp;</div>",
                      "</div>");
         }
         buf.push('<div class="x-clear"></div>',
            '</div>',
            '<ul class="x-tree-node-ct" style="display:none;"></ul>',
            "</li>");
            
        if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){
            this.wrap = Ext.DomHelper.insertHtml("beforeBegin",n.nextSibling.ui.getEl(), buf.join(""));
        }else{
            this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join(""));
        }
 
        this.elNode = this.wrap.childNodes[0];
        this.ctNode = this.wrap.childNodes[1];
        var cs = this.elNode.firstChild.childNodes;
        this.indentNode = cs[0];
        this.ecNode = cs[1];
        this.iconNode = cs[2];
        
        var index = 3;
        if(cb){
            this.checkbox = cs[3];
            index++;
        }
        this.anchor = cs[index];
        this.textNode = cs[index].firstChild;
    }
});
 
 
Ext.ux.ColumnTreeCheckNodeUI = function() {
    //多选: 'multiple'(默认)
    //单选: 'single'
    //级联多选: 'cascade'(同时选父和子);'parentCascade'(选父);'childCascade'(选子)
    this.checkModel = 'multiple';
    
    //only leaf can checked
    this.onlyLeafCheckable = false;
    
    Ext.ux.ColumnTreeCheckNodeUI.superclass.constructor.apply(this, arguments);
};
 
Ext.extend(Ext.ux.ColumnTreeCheckNodeUI, Ext.tree.ColumnTreeNodeUI, {
    
    renderElements : function(n, a, targetNode, bulkRender){
        var t = n.getOwnerTree();
        this.checkModel = t.checkModel || this.checkModel;
        this.onlyLeafCheckable = t.onlyLeafCheckable || false;
        
        Ext.ux.ColumnTreeCheckNodeUI.superclass.renderElements.apply(this, arguments);
        
        var cb = (!this.onlyLeafCheckable || n.isLeaf());
        if(cb){
            Ext.fly(this.checkbox).on('click', this.check.createDelegate(this,[null]));
        }
    },
    
    // private
    check : function(checked){
        var n = this.node;
        var tree = n.getOwnerTree();
        this.checkModel = tree.checkModel || this.checkModel;
        
        if( checked === null ) {
            checked = this.checkbox.checked;
        } else {
            this.checkbox.checked = checked;
        }
        
        n.attributes.checked = checked;
        tree.fireEvent('check', n, checked);
        
        if(!this.onlyLeafCheckable){
            if(this.checkModel == 'cascade' || this.checkModel == 'parentCascade'){
                var parentNode = n.parentNode;
                if(parentNode !== null) {
                    this.parentCheck(parentNode,checked);
                }
            }
            if(this.checkModel == 'cascade' || this.checkModel == 'childCascade'){
                if( !n.expanded && !n.childrenRendered ) {
                    n.expand(false,false,this.childCheck);
                }else {
                    this.childCheck(n);  
                }
            }
        } else if(this.checkModel == 'single'){
            var checkedNodes = tree.getChecked();
            for(var i=0;i<checkedNodes.length;i++){
                var node = checkedNodes[i];
                if(node.id != n.id){
                    node.getUI().checkbox.checked = false;
                    node.attributes.checked = false;
                    tree.fireEvent('check', node, false);
                }
            }
        }
    },
    
    // private
    childCheck : function(node){
        var a = node.attributes;
        if(!a.leaf) {
            var cs = node.childNodes;
            var csui;
            for(var i = 0; i < cs.length; i++) {
                csui = cs[i].getUI();
                if(csui.checkbox.checked ^ a.checked)
                    csui.check(a.checked);
            }
        }
    },
    
    // private
    parentCheck : function(node ,checked){
        var checkbox = node.getUI().checkbox;
        if(typeof checkbox == 'undefined')return ;
        if(!(checked ^ checkbox.checked))return;
        if(!checked && this.childHasChecked(node))return;
        checkbox.checked = checked;
        node.attributes.checked = checked;
        node.getOwnerTree().fireEvent('check', node, checked);
        
        var parentNode = node.parentNode;
        if( parentNode !== null){
            this.parentCheck(parentNode,checked);
        }
    },
    
    // private
    childHasChecked : function(node){
        var childNodes = node.childNodes;
        if(childNodes || childNodes.length>0){
            for(var i=0;i<childNodes.length;i++){
                if(childNodes[i].getUI().checkbox.checked)
                    return true;
            }
        }
        return false;
    },
    
    toggleCheck : function(value){
        var cb = this.checkbox;
        if(cb){
            var checked = (value === undefined ? !cb.checked : value);
            this.check(checked);
        }
    }
});

F、在html页面中导入这些js库即可运行示例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <head>
        <title>UserCheckNodeColumnTree 示例</title>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
        <meta http-equiv="author" content="hoojo"/>
        <meta http-equiv="email" content="hoojo_@126.com"/>
        <meta http-equiv="ext-lib" content="verson 2.2"/>
        <meta http-equiv="blog" content="http://blog.csdn.net/IBM_hoojo"/>
        <meta http-equiv="blog" content="http://hoojo.cnblogs.com"/>
        <link rel="stylesheet" type="text/css" href="ext2/resources/css/ext-all.css" />
        <link rel="stylesheet" type="text/css" href="jslib/column-tree.css" />
        <script type="text/javascript" src="ext2/adapter/ext/ext-base.js"></script>
        <script type="text/javascript" src="ext2/ext-all.js"></script>        
        <script type="text/javascript" src="ext2/build/locale/ext-lang-zh_CN-min.js"></script>
        <script type="text/javascript" src="jslib/Ext.tree.ColumnTreeCheckNodeUI.js"></script>
        <script type="text/javascript" src="jslib/Ext.hoo.tree.UserCheckNodeColumnTree.js"></script>
    </head>
    
    <body>
        <div id="show" style="margin-left: 200px; margin-top: 50px;"></div>
    </body>
</html>

运行后,效果如下:

clip_image002

如果有子节点的话,可以选择、展开子节点






本文转自hoojo博客园博客,原文链接:http://www.cnblogs.com/hoojo/archive/2011/05/12/2044238.html,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
40 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
16天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
19天前
|
Java 数据库连接 数据库
SpringBoot 整合jdbc和mybatis
本文详细介绍了如何在SpringBoot项目中整合JDBC与MyBatis,并提供了具体的配置步骤和示例代码。首先,通过创建用户实体类和数据库表来准备基础环境;接着,配置Maven依赖、数据库连接及属性;最后,分别展示了JDBC与MyBatis的集成方法及其基本操作,包括增删查改等功能的实现。适合初学者快速入门。
SpringBoot 整合jdbc和mybatis
|
4天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
9 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
4天前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
29天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
16天前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
16天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
16天前
|
XML Java 数据库连接
springboot中整合mybatis及简单使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis,包括依赖引入、配置数据源、创建测试表、编写Mapper接口和XML文件、以及创建Service和Controller层的步骤。
springboot中整合mybatis及简单使用
|
1月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit

热门文章

最新文章