`
cobble19
  • 浏览: 107104 次
  • 性别: 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()..
}
分享到:
评论

相关推荐

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

    综合上述信息,这个压缩包可能包含了一个基于自定义标签实现的分页库,该库支持通过反射来动态配置分页参数,并且能够高效地处理ResultSet,实现数据库查询的分页。使用"fenPageTld"这个名字的文件很可能是该分页库...

    JSP自定义标签实例

    在Java服务器页面(JSP)开发中,自定义标签是一个非常重要的特性,它允许开发者创建可重用的组件,提高代码的可维护性和可读性。本实例将深入讲解如何实现一个基于JSP的自定义分页标签,并涉及到Java反射机制的应用...

    Struts2自定义标签

    例如,我们可以定义一个抽象类`AbstractResAction`,并在其中使用Java反射机制来调用自定义标签的方法。 ```java public abstract class AbstractResAction extends Action { public final ActionForward execute...

    实现通过jfinal框架自动扫描freemarker的自定义标签.zip

    1. **创建自定义标签库**:定义一个Java类作为自定义标签的处理器,继承自`freemarker.template.TemplateDirectiveModel`接口,并实现其方法。在这个类中,你可以编写处理标签逻辑的代码。 2. **配置扫描路径**:...

    自定义Dao,反射实现

    本篇将深入探讨如何自定义Dao,并利用反射技术来实现这一目标。博客链接:[此处无法提供实际链接,故省略] 首先,了解DAO的基本概念。DAO是应用程序中的一个接口或抽象类,它提供了对数据存储的抽象,使得业务逻辑...

    C#2017实现自定义属性实现标签特性简单例子可执行

    现在,我们可以在运行时通过反射来获取附加的自定义属性信息: ```csharp var type = typeof(ViewModel); var attribute = type.GetCustomAttribute(); Console.WriteLine(attribute.Description); // 输出 "这是带...

    java自定义注解\标签库\监听\junit简单测试

    标签库(Tag Library)在Java中通常是指JSP(JavaServer Pages)中的自定义标签库,它们提供了一种方式来封装复杂的HTML或业务逻辑,使得页面更加易读和可维护。创建一个JSP标签库涉及以下步骤: 1. 创建TLD(Tag ...

    在ashx中利用反射+jquery轻松处理ajax的源码

    【标题】中的“在ashx中利用反射+jquery轻松处理ajax的源码”指的是使用ASP.NET的HTTP Handler(ASHX)结合反射和jQuery技术来高效地处理AJAX请求的实践案例。HTTP Handler是一种轻量级的组件,可以用来处理特定类型...

    C#基础--Attribute(标签) 和 reflect(反射) 应用

    在.NET框架中,C#是一种强大的面向对象的编程语言,其特性丰富,其中包括了Attribute(属性)和Reflect(反射)这两个重要概念。这两者在实际开发中有着广泛的应用,能够帮助程序员实现元数据的标记、运行时代码的...

    winform 自定义特性源码

    在WinForm应用中,自定义特性(Custom Attributes)是一个非常实用的功能,允许我们为类、方法、属性等编程元素添加元数据,这些元数据可以在运行时被反射机制读取,从而实现各种高级功能。本资源“winform 自定义...

    自定义表单设计器演示版源码(C#)

    C#中的PropertyGrid控件可以帮助我们实现这一功能,通过反射获取并编辑控件的属性。 3. **布局管理**:表单中的控件应该能够根据需要进行布局调整,如网格布局、流式布局等。C#的LayoutManger类可以用来管理控件的...

    C#2017实现自定义属性实现多个标签叠加特性简单例子可执行

    这使得我们可以在运行时通过反射获取这些附加的标签信息。 WPF(Windows Presentation Foundation)是.NET Framework的一部分,主要用于构建富客户端应用程序。虽然示例主要关注的是C#的自定义属性,但这些属性也...

    自定义来电秀Demo

    标签中的"反射"是一个关键概念,它是Java和Android编程中的高级技巧,允许程序在运行时动态地获取类的信息并调用其方法。在自定义来电秀中,反射可能被用来访问或修改系统私有的来电显示服务,因为这些服务通常不...

    xlua api 导出工具 luaide

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

    cpp-Reflang使用libclang实现的C反射库

    7. **应用实例**:可能的应用场景包括动态加载模块、自定义序列化/反序列化、动态类型检查、调试工具等。 8. **源代码管理**:"master"分支通常代表项目的主线开发,解压后可以研究源代码的组织结构、设计模式以及...

    C# COM反射Excel

    标签“反射Excel”再次强调了文章的核心主题——利用反射来操作Excel。 #### 代码段分析与知识点扩展 ##### 1. 引入命名空间 ```csharp using System; using System.Collections.Generic; using System.Linq; ...

    利用反射,注解将数据输出至Excel中

    在这个例子中,`@ExcelField`是我们自定义的注解,用于指定字段的标题和对齐方式。接下来,我们需要一个工具类来处理反射和注解,读取对象的属性并将其写入Excel: ```java public class ExcelExporter { public ...

Global site tag (gtag.js) - Google Analytics