• 利用BodyTagSupport创建带标签体的自定义标签


    1. 创建自定义标签的处理类 PersonTag.java,需要继承 BodyTagSupport 类,并重写 doStartTag 方法,在该方法内部实现渲染我们业务上需要展示的html对应的逻辑。
    package com.terwergreen;
    
    import com.terwergreen.util.StringUtil;
    import org.apache.commons.beanutils.PropertyUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    /**
     * PersonTag
     *
     * @author Terwer
     * @version 1.0
     * 2019/10/16 14:24
     **/
    public class PersonTag extends BodyTagSupport {
        protected String personName;
        protected String loginName;
        protected String personId;
        protected Boolean layer = Boolean.TRUE;
        protected Object bean;
    
        public String getPersonName() {
            return personName;
        }
    
        public void setPersonName(String personName) {
            this.personName = personName;
        }
    
        public String getLoginName() {
            return loginName;
        }
    
        public void setLoginName(String loginName) {
            this.loginName = loginName;
        }
    
    
        public String getPersonId() {
            return personId;
        }
    
        public void setPersonId(String personId) {
            this.personId = personId;
        }
    
        public Boolean getLayer() {
            return layer;
        }
    
        public void setLayer(Boolean layer) {
            this.layer = layer;
        }
    
        public Object getBean() {
            return bean;
        }
    
        public void setBean(Object bean) {
            this.bean = bean;
        }
    
        public int doStartTag() throws JspException {
            try {
                String cxpath = ((HttpServletRequest) pageContext.getRequest())
                        .getContextPath();
                StringBuffer sb = new StringBuffer();
                List<Map<String, String>> list = this.parseToOrgList();
    
                for (int i = 0; i < list.size(); i++) {
                    Map<String, String> tmpPerson = list.get(i);
                    if (list.size() > 1 && i != list.size() - 1) {
                        tmpPerson.put("fdName", tmpPerson.get("fdName") + ";");
                    }
                    sb.append(render(cxpath, tmpPerson,
                            layer != null ? layer.booleanValue() : true));
                }
                pageContext.getOut().print(sb.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return SKIP_BODY;
        }
    
        public static StringBuffer render(String cxpath,
                                          Map<String, String> tmpPerson, boolean layer) {
            StringBuffer sb = new StringBuffer();
            sb.append("<a class="com_author" " + " href="javascript:void(0) "");
    //		sb.append("<a class="com_author" "
    //				+ "href=""
    //				+ cxpath
    //				+ "/sys/person/sys_person_zone/sysPersonZone.do?method=view&fdId="
    //				+ tmpPerson.get("fdId") + "" target="_blank"");
            if (layer) {
                sb.append(" ajax-href="" + cxpath + "/sys/zone/resource/zoneInfo.jsp?fdId=" + tmpPerson.get("fdId") + """);
    
    
                sb.append(" onmouseover="if(window.LUI && window.LUI.person)window.LUI.person(event,this);"");
            }
            sb.append(">");
            sb.append(org.apache.commons.lang.StringEscapeUtils.escapeHtml(tmpPerson.get("fdName")));
            sb.append("</a>");
            return sb;
        }
    
        private List<Map<String, String>> parseToOrgList() throws Exception {
            List<Map<String, String>> rtnList = new ArrayList<Map<String, String>>();
            if (StringUtil.isNotNull(personId)) {
                if (personId.indexOf(";") > -1) {
                    String[] persons = personId.split(";");
                    String[] names = null;
                    if (StringUtil.isNotNull(personName)) {
                        names = personName.split(";");
                    }
                    for (int i = 0; i < persons.length; i++) {
                        rtnList.add(parseToMap(persons[i], names == null ? null
                                : (names[i] == null ? null : names[i]), loginName));
                    }
    
                } else {
                    rtnList.add(parseToMap(personId, personName, loginName));
                }
            } else if (bean != null) {
                Object tmpBean = null;
                if (bean instanceof String) {
                    String beanCfg = (String) bean;
                    if (beanCfg.indexOf(";") > -1) {
                        String[] beans = beanCfg.split(";");
                        for (int i = 0; i < beans.length; i++) {
                            rtnList.add(parseToMap(pageContext
                                    .getAttribute(beans[i])));
                        }
                    } else {
                        tmpBean = pageContext.getAttribute(beanCfg);
                    }
                } else {
                    tmpBean = bean;
                }
                if (tmpBean != null) {
                    if (tmpBean instanceof Object[]) {
                        Object[] beans = (Object[]) tmpBean;
                        for (int i = 0; i < beans.length; i++) {
                            rtnList.add(parseToMap(beans[i]));
                        }
                    } else if (tmpBean instanceof List) {
                        List<?> beans = (List<?>) tmpBean;
                        for (int i = 0; i < beans.size(); i++) {
                            rtnList.add(parseToMap(beans.get(i)));
                        }
                    } else if (tmpBean instanceof Map) {
                        Map beans = (Map) tmpBean;
                        for (Iterator iterator = beans.values().iterator(); iterator
                                .hasNext(); ) {
                            Object tmpObject = (Object) iterator.next();
                            rtnList.add(parseToMap(tmpObject));
                        }
                    } else {
                        rtnList.add(parseToMap(tmpBean));
                    }
                }
            }
            return rtnList;
        }
    
        private Map<String, String> parseToMap(String fdId, String fdName,
                                               String fdLoginName) throws Exception {
            Map<String, String> map = new HashMap<String, String>();
            map.put("fdId", fdId);
            if (StringUtil.isNotNull(fdName)) {
                map.put("fdName", fdName);
                map.put("fdLoginName", fdLoginName);
            } else {
                try {
                    map.put("fdName", "唐有炜");
                } catch (Exception e) {
                    map.put("fdName", "");
                }
            }
            return map;
        }
    
        private Map<String, String> parseToMap(Object beanObj) throws Exception {
            Map<String, String> map = new HashMap<String, String>();
            if (beanObj != null) {
                map.put("fdId", (String) PropertyUtils.getProperty(beanObj, "fdId"));
                map.put("fdName",
                        (String) PropertyUtils.getProperty(beanObj, "fdName"));
                map.put("fdLoginName",
                        (String) PropertyUtils.getProperty(beanObj, "fdLoginName"));
            }
            return map;
        }
    
    }
    

    2、创建tld描述文件,位置放在 WEB-INF/tld/ui.tld

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib
            xmlns="http://java.sun.com/xml/ns/j2ee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
            version="2.0">
        <tlib-version>2.0</tlib-version>
        <jsp-version>2.0</jsp-version>
        <short-name>ui</short-name>
        <uri>http://www.landray.com.cn/tags/widget</uri>
        <tag>
            <name>person</name>
            <tag-class>com.terwergreen.PersonTag</tag-class>
            <body-content>JSP</body-content>
            <attribute>
                <description>personId</description>
                <name>personId</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>
            <attribute>
                <description>personName</description>
                <name>personName</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
            </attribute>
            <attribute>
                <description>bean</description>
                <name>bean</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
                <type>java.lang.Object</type>
            </attribute>
            <attribute>
                <description>layer</description>
                <name>layer</name>
                <required>false</required>
                <rtexprvalue>true</rtexprvalue>
                <type>java.lang.Boolean</type>
            </attribute>
            <!--
                <attribute>
                    <description>loginName</description>
                    <name>loginName</name>
                    <required>false</required>
                    <rtexprvalue>true</rtexprvalue>
                </attribute>
                -->
        </tag>
    </taglib>
    

    3、web.xml 加入 taglib

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
        <jsp-config>
            <taglib>
                <taglib-uri>ui</taglib-uri>
                <taglib-location>/WEB-INF/tld/ui.tld</taglib-location>
            </taglib>
        </jsp-config>
    </web-app>
    

    4、创建测试页面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="/WEB-INF/tld/ui.tld" prefix="ui" %>
    
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <div>Hello World</div>
    <ui:person personId="111111111"></ui:person>
    </body>
    </html>
    
  • 相关阅读:
    从头带你撸一个Springboot Starter
    Spring Cache 带你飞(二)
    2021年终总结
    数据中台(介绍篇)
    NetCore实现全局模型绑定异常信息统一处理
    [源码解析] PyTorch 分布式之弹性训练(2)启动&单节点流程
    [源码解析] PyTorch 分布式(18) 使用 RPC 的分布式管道并行
    [源码解析] PyTorch 分布式之弹性训练(1) 总体思路
    [源码解析] PyTorch 分布式之弹性训练(3)代理
    [源码解析] PyTorch 分布式之弹性训练(5)Rendezvous 引擎
  • 原文地址:https://www.cnblogs.com/tangyouwei/p/11685166.html
Copyright © 2020-2023  润新知