页面查询展示,自定义标签
一、解决类似这样的页面展示查询
二、创建一个处理标签的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.生成效果