页面查询展示,自定义标签

一、解决类似这样的页面展示查询

二、创建一个处理标签的Java类,继承BodyTagSupport  实现DynamicAttributes

public class MoreQueryItemTag extends BodyTagSupport implements DynamicAttributes{

    private static final long serialVersionUID = 3661130490552991921L;
    private static final Logger LOGGER = LoggerFactory.getLogger(MoreQueryItemTag.class);
    private static final int DEFAULT_THRESHOLD = 5;
    private static final String DEFAULT_ITEM_VALUE = "id";
    private static final String DEFAULT_ITEM_LABEL = "name";

    private String name;
    private String key;
    private List<Object> items;
    private String itemValue = DEFAULT_ITEM_VALUE;
    private String itemLabel = DEFAULT_ITEM_LABEL;
    private String selectedValue;

    private String showName = "全部";

    @Override
    public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {

    }

    @Override
    public int doEndTag() throws JspException {
        try {
            super.pageContext.getOut().print(toHtml());
        } catch (IOException e) {
            LOGGER.error("下拉列表展开标签解析失败:" + e.getMessage(), e);
        }
        return SKIP_BODY;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public void setItems(List<Object> items) {
        this.items = items;
    }

    public void setItemValue(String itemValue) {
        this.itemValue = itemValue;
    }

    public void setItemLabel(String itemLabel) {
        this.itemLabel = itemLabel;
    }

    public void setSelectedValue(String selectedValue) {
        this.selectedValue = selectedValue;
    }
    // 生成html
    private String toHtml() {
        StringBuilder sb = new StringBuilder();
        sb.append("<li class='moreQueryItem' key='").append(key).append("'>");
        sb.append("<input translate='text' id='").append(key).append("' name='").append(key).append("' class='hiddenValue' type='hidden' value='").append(selectedValue).append("'>");
        sb.append("<b class='fl w100 ml10 f13'> <em translate='text' class='fb'>").append(name).append("</em>:</b>");
        sb.append("<div class='search-opt-li fl'>");
        if (PlatformUtils.hasText(selectedValue)) {
            sb.append("<a href='javascript:void(0);' translate='text' id=''>全部</a>");
        } else {
            sb.append("<a href='javascript:void(0);' translate='text' class='search-active' id=''>全部</a>");
        }
        int size = Math.min(DEFAULT_THRESHOLD, items.size());
        for (int i = 0; i < size; i++) {
            sb.append(buildA(items.get(i)));
        }
        if (items.size() > DEFAULT_THRESHOLD) {
            sb.append("<div class='btn-dropdown-box fl'>");
            sb.append("<a href='javascript:void(0);'  class='btn btn-default dropdown-toggle sea-more-btn' data-toggle='dropdown' aria-haspopup='true' aria-expanded='false'><em translate='text'>更多</em>");
            sb.append("<span class='down-caret'></span>");
            sb.append("</a>");
            sb.append("<ul class='dropdown-menu dropdown-menu-r fixed-size-menu'>");
            for (int i = DEFAULT_THRESHOLD; i < items.size(); i++) {
                sb.append(buildLi(items.get(i)));
            }
            sb.append("</ul>");
            sb.append("</div>");
            sb.append("<span class='fl ml20'><em translate='text'>您选择的是</em>:<a id='").append(key).append("ShowName'>").append(showName).append("</a></span>");
        }
        sb.append("</div>");
        sb.append("</li>");
        return sb.toString();
    }

    private String buildA(Object o) {
        String id = getProperty(o, itemValue);
        String label = getProperty(o, itemLabel);
        StringBuilder sb = new StringBuilder();
        if (id.equals(selectedValue)) {
            showName = label;
            sb.append("<a href='javascript:void(0);' class='search-active' translate='text' id='").append(id).append("'>").append(label).append("</a>");
        } else {
            sb.append("<a href='javascript:void(0);' translate='text' id='").append(id).append("'>").append(label).append("</a>");
        }
        return sb.toString();
    }

    private String buildLi(Object o) {
        String id = getProperty(o, itemValue);
        String label = getProperty(o, itemLabel);
        StringBuilder sb = new StringBuilder();
        if (id.equals(selectedValue)) {
            showName = label;
            sb.append("<li class='dropdown-menu-active'><a href='javascript:void(0);' id='").append(id).append("'>").append(label).append("</a></li>");
        } else {
            sb.append("<li><a href='javascript:void(0);' id='").append(id).append("'>").append(label).append("</a></li>");
        }
        return sb.toString();
    }

    private String getProperty(Object bean, String name) {
        try {
            return BeanUtils.getProperty(bean, name);
        } catch (Exception e) {
            return "";
        }
    }
}
三、在WEB-INFO下创建一个.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
        http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <display-name>"sjdf expand Tags"</display-name>
    <tlib-version>2.2</tlib-version>
    <short-name>my</short-name>
    <uri>/sjdf-tags</uri>

   
    <tag>
        <description>下拉列表展开标签</description>
        <name>moreQueryItem</name>
        <tag-class>com.sjdf.erp.web.tag.MoreQueryItemTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <description>搜索内容名称</description>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
        <attribute>
            <description>查询字段属性名</description>
            <name>key</name>
            <required>true</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
        <attribute>
            <description>用于生成选项的集合对象</description>
            <name>items</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <description>选择项的值,默认为id</description>
            <name>itemValue</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <description>选择项显示的名称,默认为name</description>
            <name>itemLabel</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <description>默认选择的项</description>
            <name>selectedValue</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <dynamic-attributes>true</dynamic-attributes>
    </tag>
</taglib>
四、页面使用
1、引入标签 <%@ taglib uri="/sjdf-tags" prefix="my" %>
2. 使用 <my:moreQueryItem name="店铺" items="${shopsByPlat}" selectedValue="${order.shopId}" key="shopId"></my:moreQueryItem>
3.生成效果


 

 

 

posted on 2018-02-09 11:51  钉子His  阅读(185)  评论(0编辑  收藏  举报

导航