`
cobble19
  • 浏览: 105180 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

自定义标签+反射

    博客分类:
  • Java
阅读更多
说明:为了使用dhtmlx的Tree控件,动态生成所需的xml文件,通过一个父子关系的节点拼出来。
引用
只是为了参考

tag 标签(XMLForTreeTag.java)
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author gby
 */
public class XMLForTreeTag extends TagSupport {

    private Object rootNode;
    private String nodeIdProperty;
    private String nodeTypeProperty;
    private String nodeTitleProperty;
    private String childCollectionProperty;
   
    /**
     *
     * @return int
     * @throws JspException
     */
    @Override
    public int doStartTag() throws JspException {
        StringBuffer sb = new StringBuffer();
        try {
            sb = toHTML(rootNode,
                    nodeIdProperty,
                    nodeTitleProperty,
                    nodeTypeProperty,
                    childCollectionProperty);
        } catch (Exception ex) {
            Logger.getLogger(XMLForTreeTag.class.getName()).log(Level.SEVERE, null, ex);
        }
        JspWriter out = pageContext.getOut();
        try {
            out.println(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return SKIP_BODY;
    }

    /**
     * <tree id="0" >
        <item text="name1" id="id1">
           <item text="name1-1" id="id1-1">
           </item>
        </item>
        </tree>
     * @param rootNode
     * @param nodeIdProperty
     * @param nodeTitleProperty
     * @param nodeTypeProperty
     * @param childCollectionProperty
     * @return
     * @throws Exception
     */
    public StringBuffer toHTML(Object rootNode,
            String nodeIdProperty,
            String nodeTitleProperty,
            String nodeTypeProperty,
            String childCollectionProperty) throws Exception {
        
        StringBuffer sb = new StringBuffer();
        sb.append("<tree id=\"0\">\n");
        String nodes = this.createXML(rootNode,
                nodeIdProperty,
                nodeTitleProperty,
                nodeTypeProperty,
                childCollectionProperty,
                sb);
        sb.append("</tree>\n");

        return sb;
    }

    private String createXML(Object node,
            String nodeIdProperty,
            String nodeTitleProperty,
            String nodeTypeProperty,
            String childCollectionProperty,
            StringBuffer sb) throws Exception {
        Class<?> clazz = node.getClass();
        //获得属性的get方法名。
        
        String nodeIdMethodName = this.createMethodName(nodeIdProperty);
        String nodeTitleMethodName = this.createMethodName(nodeTitleProperty);
        String nodeTypeMethodName = this.createMethodName(nodeTypeProperty);
        String childCollectionMethodName = this.createMethodName(childCollectionProperty);

        //根据反射获得method
        Method nodeIdMethod = clazz.getMethod(nodeIdMethodName, new Class[0]);
        Method nodeTitleMethod = clazz.getMethod(nodeTitleMethodName, new Class[0]);
        Method nodeTypeMethod = clazz.getMethod(nodeTypeMethodName, new Class[0]);
        Method childCollectionMethod = clazz.getMethod(childCollectionMethodName, new Class[0]);

        if (node != null) {
            String nodeId = (String) nodeIdMethod.invoke(node, new Object[0]);
            String nodeTitle = (String) nodeTitleMethod.invoke(node, new Object[0]);
            String nodeType = (String) nodeTypeMethod.invoke(node, new Object[0]);

            String itemId = nodeId + "__" + nodeType;
            
            sb.append("<item text=\"").append(nodeTitle).append("\" ")
                    .append(" id=\"").append(itemId).append("\">");

            List children = (List) childCollectionMethod.invoke(node, new Object[0]);
            if (children != null && !children.isEmpty()) {
                for (Object child : children) {
                    this.createXML(child, nodeIdProperty, nodeTitleProperty, nodeTypeProperty, childCollectionProperty, sb);
                }
            }
            sb.append("</item>\n");
        }

        return sb.toString();
    }

    private String createMethodName(String property) {
        if (StringUtils.isEmpty(property)) {
            return null;
        }
        String method = "get" + property.substring(0, 1).toUpperCase() + property.substring(1);
        return method;
    }
    
    getters().. setters()..
}

tld文件(TldName.tld)
<?xml version="1.0" encoding="UTF-8"?>

<!-- edited with XML Spy v4.3 U (http://www.xmlspy.com) by LEGO (LEGO) -->

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
    <tag>
        <name>xmlForTree</name>
        <tagclass>XMLForTreeTag</tagclass>
        <info>为显示多选树形拼的XML-dhtmlx</info>
        <attribute>
            <name>rootNode</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>nodeIdProperty</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>nodeTypeProperty</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>nodeTitleProperty</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>childCollectionProperty</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

节点类(NodeDTO.java)
import java.io.Serializable;
import java.util.List;

/**
 * 树形显示DTO
 * @author gby
 */
public class NodeDTO implements Serializable{
    /**
     * node的唯一标识
     */
    private String id;
    /**
     * node的唯一标识
     */
    private String parentId;
    /**
     * node的名称
     */
    private String name;
    /**
     * node的父节点
     */
    private NodeDTO parentDTO;
    /**
     * node的孩子节点
     */
    private List<NodeDTO> childrenDTO;
    //节点类型
    private String nodeType;
    getters().. setters()..
}
分享到:
评论

相关推荐

    强大的自定义标签分页,内有说明

    强大的自定义标签分页,内有说明,更加通用。

    JSP自定义标签实例

    前一阵给学员做了一个关于jsp自定义标签的讲座, 自己动手做了一些实例,其中有一个分页标签做得比较通用,其中用到了一些java反射的原理.

    xlua api 导出工具 luaide

    标签标注 代码跳转 代码调试 错误检查 api提示接口(api导出工具:xlua ulua slua cocos2d2.x cocos2d3.x) 方法定义列表 自定义宏+模板文件 unity lua调试可查看c#类型值(反射机制) 针对各种框架不同的优化

    slua api 导出插件 ->luaide

    标签标注 代码跳转 代码调试 错误检查 api提示接口(api导出工具:xlua ulua slua cocos2d2.x cocos2d3.x) 方法定义列表 自定义宏+模板文件 unity lua调试可查看c#类型值(反射机制) 针对各种框架不同的优化

    ulua tolua api 导出插件 ->luaide

    标签标注 代码跳转 代码调试 错误检查 api提示接口(api导出工具:xlua ulua slua cocos2d2.x cocos2d3.x) 方法定义列表 自定义宏+模板文件 unity lua调试可查看c#类型值(反射机制) 针对各种框架不同的优化

    cocos2dx2x cocos2dx3x api导出工具

    标签标注 代码跳转 代码调试 错误检查 api提示接口(api导出工具:xlua ulua slua cocos2d2.x cocos2d3.x) 方法定义列表 自定义宏+模板文件 unity lua调试可查看c#类型值(反射机制) 针对各种框架不同的优化

    自定义MVC框架.md

    本文档中的大纲包含J2EE的知识点,有“Java环境搭建”,“集合框架”,“xml”,“反射”,“Jsp标签”,“通用分页”,“自定义mvc框架”,“MySQL”,“DDL”,“DQL”,“DML”,“DCL”,“TCL”,“视图”,...

    go-and-reflect:通过结构字段标签和自定义封送处理了解更多有关Go反射的信息

    反复思考(关于数据结构和生命) 了解有关Go反射的更多信息。去反思概念在应用程序运行时进行反思/自省涉及三个概念: Reflection.Type ...........提供有关数据结构名称(用户,地址等),其字段名称(名称,年龄)...

    reanimated-2-animations-challenges:使用新的Reanimated2 API响应本机动画挑战

    React Native动画展示此仓库包含一个使用新的Reanimated 2 API进行动画挑战和示例的...手风琴简单的手风琴清单 自定义标签栏来自Dribbble标签栏的自定义标签栏挑战切换交互 滑冰挑战赛Dribbble Skate Challenge的Skat

    商城之家JSP商城基于jsp+mysql开发

    自定义商品属性,自定义商品简介魔板,自由增加一级页面数量,自由更换页面样式, 自由设定管理员权限,自由设定页面局部类型商品,在线调查,在线留言,团体购物, 自由设定友情链接和页面的关联,自由设定信息和...

    day021-反射和注解笔记和代码.rar

    使用自定义的标签 1.JDK的元注解:就是专门用来声明其他注解的注解 作用:通过元注解了解其他注解的使用特点,还可以自定义注解 2.元注解: 1. @Target @Target ...

    KingCMS源码下载

    自己写了一套asp.net的小型模板,标签形式都是自定义的,而且是可扩展的,也用了反射。但是现在看来,用反射而又没有做一些处理,效率应当是十分低下的。其基本工作原理就是正则表达式匹配标签,而后通过标签的进行...

    JSP商城之家商城企业版

    自定义商品属性,自定义商品简介魔板,自由增加一级页面数量,自由更换页面样式, 自由设定管理员权限,自由设定页面局部类型商品,在线调查,在线留言,团体购物, 自由设定友情链接和页面的关联,自由设定信息和...

    jsp实现的学生信息查询系统,有国际化和分页设计

    用jsp实现的学生信息查询系统,只有一张学生表和一张管理员表。实现了自定义标签库、国际化和分页。分页设计得比较巧妙,可以共用。有建表的sql语句,还用到了java反射。整个结构耦合度低,代码清晰易懂!

    浪曦图库系统v1.0

    3. 自定义皮肤以及自定义信息显示功能:系统自带标签可使不懂ASP.NET甚至不懂html的用户任意更改首页,栏目页以及内容页需要显示的信息以及整体布局; 4. 反射技术的应用使系统可轻松切换Access/Sqlserver2005数据库...

    .NET的ORM映射工具 AutoMapper.zip

    AutoMapper包含以下功能:平展投影配置验证列表和数组嵌套映射自定义类型转换程序自定义值转换程序 自定义值格式程序 Null值替换AutoMapper是一款单向映射器。这意味着它并没有内建映射对象支持来回写至原始源,除非...

    商城之家JSP商城企业版 v7.0

    全新打造继 卓越 当当 等知名电子商务平台的孪生购物交易平台自动成比例压缩生成JPG/GIF图片,多种网上支付端口,在线编辑简介网页,自定义广告形式和内容自定义商品属性,自定义商品简介魔板,自由增加一级页面数量...

    java必了解的六大问题

    *第十一阶段:JSP开发:JSP语法和标签,自定义标签,EL,JSTL库了解以及MVC三层架构的设计模式理念; *第十二阶段:AJAX开发:AJAX原理,请求响应处理,AJAX开发库; *第十三阶段:轻量级框架,三大框架之一...

    c# 常用功能与控件源码

    这里面包含了平常用到的一些功能类,DOS操作,ini文件操作,FTP上传下载,log日志文件操作,winform使用的遮罩层,反射功能,验证码,注册表操作,注册码生成,文件序列化,加解密,网页标签分析器 2.ICSoft.Update...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    反射详解 异常处理TryExcept 网络编程Socket介绍 Socket通信案例消息发送与接收 第8周 上节回顾 Socket实现简单的ssh客户端 Socket实现简单的ssh服务端 积极思考正能量 Socket实现简单的ssh2 Socket粘包 Socket...

Global site tag (gtag.js) - Google Analytics