1,首先要有tld文件标签文件:这里借鉴前辈,直接上代码。。
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" 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"> <display-name>Expend Tag</display-name> <tlib-version>1.1</tlib-version> <short-name>exp</short-name> <uri>/exp-tags</uri> <tag> <description><![CDATA[Render a select element]]></description> <name>select</name> <tag-class>pro.utils.exps.ExpSelectTag</tag-class> <!-- 注意这里是自己定义的标签类(处理你自己的标签内容)--> <body-content>JSP</body-content> <attribute> <description><![CDATA[The css class to use for element]]></description> <name>cssClass</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[style.]]></description> <name>style</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html disabled attribute on rendered html element]]></description> <name>disabled</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[ Key for first item in list. Must not be empty! ‘-1‘ and ‘‘ is correct, ‘‘ is bad.]]></description> <name>headerKey</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Value expression for first item in list]]></description> <name>headerValue</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[HTML id attribute]]></description> <name>id</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[The name to set for element]]></description> <name>name</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html onchange attribute on rendered html element]]></description> <name>onChange</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Preset the value of input element.]]></description> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[code.]]></description> <name>code</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[params.]]></description> <name>params</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[dataType.]]></description> <name>dataType</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[msg.]]></description> <name>msg</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <!-- <tag> <description><![CDATA[Renders a radio button input field]]></description> <name>radio</name> <tag-class>com.minxinloan.web.views.tags.ExpRadioTag</tag-class> <body-content>JSP</body-content> <attribute> <description><![CDATA[Set the html disabled attribute on rendered html element]]></description> <name>disabled</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[The name to set for element]]></description> <name>name</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html onchange attribute on rendered html element]]></description> <name>onChange</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html onclick attribute on rendered html element]]></description> <name>onClick</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Preset the value of input element.]]></description> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[colCount.]]></description> <name>colCount</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[code.]]></description> <name>code</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[params.]]></description> <name>params</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> --> <!-- <tag> <description><![CDATA[Render a list of checkboxes]]></description> <name>checkboxlist</name> <tag-class>com.minxinloan.web.views.tags.ExpCheckboxListTag</tag-class> <body-content>JSP</body-content> <attribute> <description><![CDATA[Set the html disabled attribute on rendered html element]]></description> <name>disabled</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[The name to set for element]]></description> <name>name</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html onchange attribute on rendered html element]]></description> <name>onChange</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Set the html onclick attribute on rendered html element]]></description> <name>onClick</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Preset the value of input element.]]></description> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[colCount.]]></description> <name>colCount</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[code.]]></description> <name>code</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[params.]]></description> <name>params</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> --> <tag> <description><![CDATA[Render a tree]]></description> <name>tree</name> <tag-class>pro.utils.exps.ExpTreeTag</tag-class> <!--这里也是自定义的标签--> <body-content>JSP</body-content> <attribute> <name>id</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>code</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>params</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>expendLevel</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>onClick</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>checkStyle</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>chkboxType</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>style</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>rootNodeId</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>rootNodeName</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <description><![CDATA[Render a treeSelect]]></description> <name>treeSelect</name> <tag-class>pro.utils.exps.ExpTreeSelectTag</tag-class> <!--同样也是自定的标签类 --> <body-content>JSP</body-content> <attribute> <name>id</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>code</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>params</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>expendLevel</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>onClick</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>checkStyle</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>chkboxType</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>value</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>style</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>rootNodeId</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>rootNodeName</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <description><![CDATA[dataType.]]></description> <name>dataType</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[msg.]]></description> <name>msg</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[name.]]></description> <name>name</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> <!-- <tag> <description><![CDATA[Render a operate button or link]]></description> <name>operate</name> <tag-class>com.minxinloan.web.views.tags.ExpOperateTag</tag-class> <body-content>JSP</body-content> <attribute> <name>moduleId</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>type</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>preParams</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>afterParams</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>colId</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>operateTab</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> --><!-- <tag> <description><![CDATA[Render a import button]]></description> <name>import</name> <tag-class>com.minxinloan.web.views.tags.ExpImportTag</tag-class> <body-content>JSP</body-content> <attribute> <name>returnUrl</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>code</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>dateFormat</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>checkRepeatIndex</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>dateIndex</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>rowNum</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>size</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>id</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>label</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> </tag> --> </taglib>
这个文件的后缀名是;expend-tag.tld这是我定义的。(可以任意修改)
2,把tld文件上面的对应的类(处理标签类建立起来。)
(1)首先上这个类: pro.utils.exps.ExpSelectTag
package pro.utils.exps; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; import org.apache.commons.lang3.StringUtils; import pro.entity.UIComponentBean; import pro.utils.Helper; public class ExpSelectTag extends BodyTagSupport { /** * 对应的一些属性 */ private static final long serialVersionUID = -2900233361611357594L; private String code; private String params; private String id; private String name; private String headerKey; private String headerValue; private String value; private String cssClass; private String style; private String onChange; private String disabled; private String dataType; private String msg; private JspWriter out; public void init() { out = pageContext.getOut(); } @Override public int doStartTag() throws JspException { init(); return super.EVAL_BODY_INCLUDE; }
//处理方法, @Override public int doEndTag() throws JspException { try { StringBuffer sb=new StringBuffer(); sb.append("<select"); if(StringUtils.isNotBlank(id)){ sb.append(" id=\""+id+"\""); } if(StringUtils.isNotBlank(name)){ sb.append(" name=\""+name+"\""); } if(StringUtils.isNotBlank(cssClass)){ sb.append(" class=\""+cssClass+"\""); } if(StringUtils.isNotBlank(style)){ sb.append(" style=\""+style+"\""); } if(StringUtils.isNotBlank(onChange)){ sb.append(" onChange=\""+onChange+"\""); } if(StringUtils.isNotBlank(disabled)&&"true".equals(disabled)){ sb.append(" disabled=\"true\""); } if(StringUtils.isNotBlank(dataType)){ sb.append(" dataType=\""+dataType+"\""); } if(StringUtils.isNotBlank(msg)){ sb.append(" msg=\""+msg+"\""); } sb.append(">"); if(StringUtils.isNotBlank(headerKey)||StringUtils.isNotBlank(headerValue)){ sb.append("<option value=\""+headerKey+"\" selected>").append(headerValue).append("</option>"); } if(StringUtils.isNotBlank(code)){ List<UIComponentBean> retList=null; if (StringUtils.isNotBlank(params)) { String[] paramsList =StringUtils.split(params, ",");
//获取数据源(带有参数的查询) retList = Helper.getCodeListToUIComponentBean(code.trim(), Arrays.asList(paramsList));// }else{
//获取数据源(不带参数的查询) retList = Helper.getCodeListToUIComponentBean(code.trim()); } if(retList != null && retList.size() > 0){ for (int i = 0; i < retList.size(); i++) { UIComponentBean bean=retList.get(i); sb.append("<option value=\""+bean.getKey()+"\""); if(StringUtils.isNotBlank(value)&&value.equals(bean.getKey())){ sb.append(" selected"); } sb.append(" >").append(bean.getValue()).append("</option>"); } } } sb.append("</select>"); out.print(sb.toString()); } catch (IOException e) { e.printStackTrace(); } return super.EVAL_PAGE; } public void setCode(String code) { this.code = code; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setHeaderKey(String headerKey) { this.headerKey = headerKey; } public void setHeaderValue(String headerValue) { this.headerValue = headerValue; } public void setValue(String value) { this.value = value; } public void setCssClass(String cssClass) { this.cssClass = cssClass; } public void setStyle(String style) { this.style = style; } public void setOnChange(String onChange) { this.onChange = onChange; } public void setParams(String params) { this.params = params; } public void setDisabled(String disabled) { this.disabled = disabled; } public void setDataType(String dataType) { this.dataType = dataType; } public void setMsg(String msg) { this.msg = msg; } }
(2)这里直接上第二个tree标签的处理class类
package pro.utils.exps; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; import org.apache.commons.lang3.StringUtils; import pro.utils.Helper; import pro.utils.basebean.JsonUtil; import pro.utils.basebean.UITreeBean; public class ExpTreeTag extends BodyTagSupport{ /** * */ private static final long serialVersionUID = -9079160136312661975L; protected String code; protected String params; protected String id="zTree01"; protected String expendLevel="3"; protected String onClick; protected String checkStyle; protected String chkboxType="{ \"Y\": \"s\", \"N\": \"s\" }"; protected String value; protected String style="width:200px;height:300px;"; protected String rootNodeId; protected String rootNodeName; private JspWriter out; public void init() { out = pageContext.getOut(); } @Override public int doStartTag() throws JspException { init(); return super.EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { try { StringBuffer sb=new StringBuffer(); sb.append("<div id=\""+id+"\" class=\"ztree\"></div>"); sb.append("<script type=\"text/javascript\">"); sb.append("var setting = {treeId:\"tree_"+id+"\""); if(StringUtils.isNotBlank(onClick)){ sb.append(",callback: {onClick: "+onClick+"}"); } if(StringUtils.isNotBlank(checkStyle)){ sb.append(",check: {enable: true,chkStyle: \""+checkStyle+"\",chkboxType: "+chkboxType+"}"); } sb.append("};"); if(StringUtils.isNotBlank(code)){ List<UITreeBean> retList=null; if (StringUtils.isNotBlank(params)) { String[] paramsList =StringUtils.split(params, ","); retList = Helper.getCodeListToUITreeBean(code.trim(), Arrays.asList(paramsList),expendLevel,rootNodeId,rootNodeName); }else{ retList = Helper.getCodeListToUITreeBean(code.trim(),null,expendLevel,rootNodeId,rootNodeName); } sb.append("var zNodes =").append(JsonUtil.getJsonArrayString4JavaPOJO(retList,"")).append(";"); sb.append("$.fn.zTree.init($(\"#"+id+"\"), setting, zNodes);"); if(StringUtils.isNotBlank(value)){ String[] arr=StringUtils.split(value,‘,‘); sb.append("var treeObj = $.fn.zTree.getZTreeObj(\""+id+"\");"); for (int i = 0; i < arr.length; i++) { sb.append("var nodes = treeObj.getNodesByParam(\"id\",\""+arr[i]+"\",null);"); if(StringUtils.isBlank(checkStyle)){ sb.append("treeObj.selectNode(nodes[0]);"); }else{ sb.append("treeObj.checkNode(nodes[0],true,false);"); } } } } sb.append("</script>"); out.print(sb.toString()); } catch (IOException e) { e.printStackTrace(); } return super.EVAL_PAGE; } public void setId(String id) { this.id = id; } public void setCode(String code) { this.code = code; } public void setParams(String params) { this.params = params; } public void setExpendLevel(String expendLevel) { this.expendLevel = expendLevel; } public void setOnClick(String onClick) { this.onClick = onClick; } public void setCheckStyle(String checkStyle) { this.checkStyle = checkStyle; } public void setChkboxType(String chkboxType) { this.chkboxType = chkboxType; } public void setValue(String value) { this.value = value; } public void setStyle(String style) { this.style = style; } public void setRootNodeId(String rootNodeId) { this.rootNodeId = rootNodeId; } public void setRootNodeName(String rootNodeName) { this.rootNodeName = rootNodeName; } }
(3)这里上第三个selectTree处理的类。
package pro.utils.exps; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import org.apache.commons.lang3.StringUtils; import pro.utils.Helper; import pro.utils.basebean.JsonUtil; import pro.utils.basebean.UITreeBean; public class ExpTreeSelectTag extends ExpTreeTag{ /** * */ private static final long serialVersionUID = -9079160136312661975L; private String dataType; private String msg; private String name; private JspWriter out; public void init() { out = pageContext.getOut(); } @Override public int doStartTag() throws JspException { init(); return super.EVAL_BODY_INCLUDE; } @Override public int doEndTag() throws JspException { try { StringBuffer sb=new StringBuffer(); sb.append("<div id=\"menuContent_"+name+"\" class=\"menuContent\" style=\"display:none; position: absolute;\">"); sb.append("<ul id=\""+id+"\" class=\"ztree\" style=\"margin-top:0; width:160px;\"></ul>"); sb.append("</div><input type=\"hidden\" value=\""+value+"\" name=\""+name+"\" id=\""+name+"Hidd\">"); sb.append("<input type=\"text\" id=\""+name+"Val\" readonly=\"readonly\" "); if(StringUtils.isNotBlank(dataType)||StringUtils.isNotBlank(msg)){ sb.append("dataType=\""+dataType+"\" msg=\""+msg+"\""); } sb.append("/><a id=\"menuBtn_"+name+"\" href=\"#\" onclick=\"showMenu_"+name+"();\">选择</a>"); sb.append("<script type=\"text/javascript\">"); sb.append("var setting = {treeId:\"tree_"+id+"\""); sb.append(",callback: {onClick: function(e, treeId, node){$(‘#"+name+"Hidd‘).val(node.id);$(‘#"+name+"Val‘).val(node.name);hideMenu_"+name+"();"); if(StringUtils.isNotBlank(onClick)){ sb.append(onClick+"(e, treeId, node);"); } sb.append("}}"); if(StringUtils.isNotBlank(checkStyle)){ sb.append(",check: {enable: true,chkStyle: \""+checkStyle+"\",chkboxType: "+chkboxType+"}"); } sb.append("};"); if(StringUtils.isNotBlank(code)){ List<UITreeBean> retList=null; if (StringUtils.isNotBlank(params)) { String[] paramsList =StringUtils.split(params, ","); retList = Helper.getCodeListToUITreeBean(code.trim(), Arrays.asList(paramsList),expendLevel,rootNodeId,rootNodeName); }else{ retList = Helper.getCodeListToUITreeBean(code.trim(),null,expendLevel,rootNodeId,rootNodeName); } sb.append("var zNodes =").append(JsonUtil.getJsonArrayString4JavaPOJO(retList,"")).append(";"); sb.append("$.fn.zTree.init($(\"#"+id+"\"), setting, zNodes);"); if(StringUtils.isNotBlank(value)){ String[] arr=StringUtils.split(value,‘,‘); sb.append("var treeObj = $.fn.zTree.getZTreeObj(\""+id+"\");"); for (int i = 0; i < arr.length; i++) { sb.append("var nodes = treeObj.getNodesByParam(\"id\",\""+arr[i]+"\",null);"); if(StringUtils.isBlank(checkStyle)){ sb.append("treeObj.selectNode(nodes[0]);"); sb.append("$(‘#"+name+"Hidd‘).val(nodes[0].id);$(‘#"+name+"Val‘).val(nodes[0].name);"); }else{ sb.append("treeObj.checkNode(nodes[0],true,false);"); } } } } sb.append("function showMenu_"+name+"() {var obj = $(\"#"+name+"Val\");var offset = $(\"#"+name+"Val\").offset();"); sb.append("$(\"#menuContent_"+name+"\").css({left:offset.left + \"px\", top:offset.top + obj.outerHeight() + \"px\"}).slideDown(\"fast\");"); sb.append("$(\"body\").bind(\"mousedown\", onBodyDown_"+name+");}"); sb.append("function hideMenu_"+name+"() {$(\"#menuContent_"+name+"\").fadeOut(\"fast\");$(\"body\").unbind(\"mousedown\", onBodyDown_"+name+");}"); sb.append("function onBodyDown_"+name+"(event) {if (!(event.target.id == \"menuBtn_"+name+"\" || event.target.id == \"menuContent_"+name+"\" || $(event.target).parents(\"#menuContent_"+name+"\").length>0)) {hideMenu_"+name+"();}}"); sb.append("</script>"); out.print(sb.toString()); } catch (IOException e) { e.printStackTrace(); } return super.EVAL_PAGE; } public void setId(String id) { this.id = id; } public void setCode(String code) { this.code = code; } public void setParams(String params) { this.params = params; } public void setExpendLevel(String expendLevel) { this.expendLevel = expendLevel; } public void setOnClick(String onClick) { this.onClick = onClick; } public void setCheckStyle(String checkStyle) { this.checkStyle = checkStyle; } public void setChkboxType(String chkboxType) { this.chkboxType = chkboxType; } public void setValue(String value) { this.value = value; } public String getDataType() { return dataType; } public void setDataType(String dataType) { this.dataType = dataType; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public void setName(String name) { this.name = name; } }
3,select标签对应的有一个实体类,tree对应的一个实体类
(1)select实体类
package pro.entity; public class UIComponentBean { private String key; private String value; public UIComponentBean() { } public UIComponentBean(String key,String value) { this.key = key; this.value = value; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
(2)tree实体类
package pro.utils.basebean; import java.util.List; public class UITreeBean { private String id; private String pId; private String name; private boolean isParent=false; private boolean open=false; private List<UITreeBean> children; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getpId() { return pId; } public void setpId(String pId) { this.pId = pId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isParent() { return isParent; } public void setParent(boolean isParent) { this.isParent = isParent; } public boolean isOpen() { return open; } public void setOpen(boolean open) { this.open = open; } public List<UITreeBean> getChildren() { return children; } public void setChildren(List<UITreeBean> children) { this.children = children; } }
4,然后就直接上DBHeper类了,提供数据源的以及,tree标签定义的递归(我这里都是手动封装数据源,没有真正连接数据库)
package pro.utils; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import pro.entity.UIComponentBean; import pro.utils.basebean.UITreeBean; public class Helper { /** * @Description 获得字典表或缓存中的列表,封装成UIComponentBean,用于扩展标签 * @param codeName * @param params * @return List<UIComponentBean> */ public static List<UIComponentBean> getCodeListToUIComponentBean(String codeName,List params){ // List<UIComponentBean> list = (List<UIComponentBean>)getCodeList(codeName,params); // List<UIComponentBean> retList = new ArrayList<UIComponentBean>(); // for(java.util.Iterator it= list.iterator();it.hasNext();){ // List tmp = (List)it.next(); // UIComponentBean bean = new UIComponentBean(); // if(tmp.size()>0){ // bean.setKey((String)tmp.get(0)); // if(tmp.size()>1){ // bean.setValue((String)tmp.get(1)); // } // } // retList.add(bean); // } List<UIComponentBean> retList = new ArrayList<UIComponentBean>(); retList.add(new UIComponentBean("1","朝阳区")); retList.add(new UIComponentBean("2","丰台区")); retList.add(new UIComponentBean("3","海淀区")); retList.add(new UIComponentBean("4","西城区")); retList.add(new UIComponentBean("5","东城区")); retList.add(new UIComponentBean("6","昌平区")); return retList; } public static List<UIComponentBean> getCodeListToUIComponentBean(String codeName){ return getCodeListToUIComponentBean(codeName,null); } // /** // * // * @param codeName // * @param params // * @param expendLevel // * @return // */ @SuppressWarnings("rawtypes") public static List<UITreeBean> getCodeListToUITreeBean(String codeName,List params,String expendLevel,String rootNodeId,String rootNodeName){ List list = getCodeList(codeName,params); List<UITreeBean> retList = new ArrayList<UITreeBean>(); UITreeBean bean = new UITreeBean(); if(StringUtils.isNotBlank(rootNodeId)&&StringUtils.isNotBlank(rootNodeName)){ bean.setId(rootNodeId); bean.setpId(rootNodeId); bean.setName(rootNodeName); }else{ if(null!=list&&list.size()>0){ List tmp = (List)list.get(0); if(tmp.size()>0){ bean.setId((String)tmp.get(0)); if(tmp.size()>1){ bean.setpId((String)tmp.get(1)); } if(tmp.size()>2){ bean.setName((String)tmp.get(2)); } } } } int treeLevel=1; setChildren(bean, list,expendLevel,treeLevel); retList.add(bean); return retList; } // /** // * 递归 // * @param bean // * @param list // * @param expendLevel // * @param treeLevel // */ private static void setChildren(UITreeBean bean,List list,String expendLevel,int treeLevel){ List<UITreeBean> children=new ArrayList<UITreeBean>(); for (int i = 0; i < list.size(); i++) { List tmp = (List)list.get(i); if(bean.getId().equals((String)tmp.get(1))){ if(treeLevel<=Integer.parseInt(expendLevel)){ bean.setOpen(true); } bean.setParent(true); treeLevel++; UITreeBean tmpBean=new UITreeBean(); tmpBean.setId((String)tmp.get(0)); tmpBean.setpId((String)tmp.get(1)); tmpBean.setName((String)tmp.get(2)); setChildren(tmpBean,list,expendLevel,treeLevel); children.add(tmpBean); } } bean.setChildren(children); } /** * @Description 获得字典表或缓存中的列表 * @param codeName * @param params * @return List */ @SuppressWarnings("rawtypes") public static List getCodeList(String codeName,List params){ List list = new ArrayList(); //这里才是真实数据源,直接查询数据库(你们就直接查询数据库) // DictionaryService dictionaryService = (DictionaryService)SpringContextHolder.getBean("dictionaryService"); // list = dictionaryService.getDataListByCacheCode(codeName,params); //我这里用字符串模拟封装集合模拟数据源 if("selectTree".equals(codeName)) { String str = "[120, 150, 华北地区], [122, 150, 华南地区], [123, 150, 华中地区], [124, 150, 东北地区], [125, 150, 中西地区], [126, 150, 西南地区], [150, 0, 中融民信], [151, 150, 华东地区], [153, 120, 北京市], [154, 120, 唐山市], [155, 126, 贵阳市], [156, 126, 南宁市], [157, 126, 长沙市], [158, 126, 株洲市], [159, 126, 遵义市], [160, 151, 上海市], [161, 151, 南京市], [162, 122, 福州市], [163, 122, 厦门市], [164, 123, 郑州市], [165, 123, 青岛市], [166, 123, 济南市], [167, 123, 合肥市], [168, 124, 沈阳市], [169, 124, 长春市], [170, 120, 天津市], [171, 125, 洛阳市], [172, 125, 兰州市], [173, 125, 西安市], [174, 125, 重庆市], [175, 125, 成都市], [176, 151, 杭州市], [177, 120, 石家庄市]"; list = getList(str); } if("Tree".equals(codeName)) { String str = "[111, 0, 华北地区财富中心], [120, 111, 北京市财富中心], [121, 120, 北京第一财富中心], [122, 121, 销售团队A], [123, 122, 团队1], [10053, 123, dd], [124, 122, 团队2], [157, 122, 团队3], [10052, 157, f], [158, 122, 团队4], [10037, 121, 销售团队B], [400, 10037, 团队13], [401, 10037, 团队14], [10040, 121, 销售团队C], [159, 10040, 团队5], [393, 10040, 团队6], [394, 10040, 团队7], [10041, 121, 销售团队D], [395, 10041, 团队8], [396, 10041, 团队9], [397, 10041, 团队10], [398, 10041, 团队11], [399, 10041, 团队12], [144, 120, 北京第七财富中心], [145, 144, 销售团队A], [146, 145, 团队1], [148, 145, 团队2], [149, 145, 团队3], [153, 145, 团队4], [154, 145, 团队5]"; String sq1 = ", [147, 144, 销售团队B], [150, 147, 团队1], [151, 147, 团队2], [152, 147, 团队3], [155, 147, 团队4], [156, 147, 团队5], [403, 120, 北京第二财富中心], [409, 403, 销售团队A], [414, 409, 团队1], [419, 409, 团队6], [10033, 409, 团队10], [10028, 403, 销售团队B], [415, 10028, 团队2], [417, 10028, 团队5], [10030, 10028, 团队7], [10031, 10028, 团队8], [10032, 10028, 团队9], [10029, 403, 销售团队C], [416, 10029, 团队3], [418, 10029, 团队4], [404, 120, 北京第三财富中心], [410, 404, 销售一部], [420, 410, 销售团队A], [422, 410, 销售团队B], [423, 410, 销售团队C], [421, 404, 销售二部], [424, 421, 销售团队A], [425, 421, 销售团队B], [426, 421, 销售团队C], [427, 421, 销售团队D], [428, 404, 销售三部], [429, 428, 销售团队A], [430, 428, 销售团队B], [431, 428, 销售团队C], [405, 120, 北京第四财富中心], [411, 405, 销售团队A], [436, 411, 团队5], [438, 411, 团队6], [10035, 405, 销售团队B], [437, 10035, 团队7], [439, 10035, 团队8], [440, 10035, 团队9], [441, 10035, 团队10], [10013, 10035, 团队11], [10036, 405, 销售团队C], [432, 10036, 团队1], [433, 10036, 团队2], [434, 10036, 团队3], [435, 10036, 团队4], [406, 120, 北京第五财富中心], [412, 406, 销售团队A], [443, 412, 团队1], [444, 412, 团队2], [445, 412, 团队3], [442, 406, 销售团队B], [446, 442, 团队1], [447, 442, 团队2], [10004, 442, 团队3], [10005, 406, 销售团队C], [10006, 10005, 团队1], [10007, 10005, 团队2], [407, 120, 北京第六财富中心], [413, 407, 销售团队A], [450, 413, 团队3], [451, 413, 团队4], [10014, 413, 团队5], [10038, 407, 销售团队B], [10015, 10038, 团队6], [10016, 10038, 团队7], [10017, 10038, 团队8], [10018, 10038, 团队9], [10019, 10038, 团队10], [10039, 407, 销售团队C], [448, 10039, 团队1], [449, 10039, 团队2], [129, 111, 天津市财富中心], [130, 129, 天津财富中心], [131, 130, 销售团队A], [132, 131, 团队1], [133, 131, 团队2], [453, 131, 团队3], [454, 131, 团队4], [455, 131, 团队7], [456, 131, 团队5], [457, 131, 团队6], [10009, 131, 团队8], [10010, 131, 团队9], [488, 111, 石家庄市财富中心], [489, 488, 石家庄财富中心], [490, 489, 销售团队A], [491, 490, 团队1], [492, 490, 团队2], [493, 490, 团队3], [494, 490, 团队4], [495, 490, 团队5], [496, 490, 团队6], [10020, 490, 团队7], [10021, 490, 团队8], [10022, 490, 团队9], [206, 0, 华东地区财富中心], [207, 206, 杭州市财富中心], [208, 207, 杭州第一财富中心], [209, 208, 销售团队A], [210, 209, 团队1], [211, 209, 团队2], [521, 209, 团队3], [10011, 209, 团队4], [10012, 209, 团队5], [10000, 207, 杭州第二财富中心], [10001, 10000, 销售团队A], [10002, 10001, 团队1], [10003, 10001, 团队2], [212, 206, 上海市财富中心], [213, 212, 上海第一财富中心], [214, 213, 销售团队A], [215, 214, 团队1], [497, 213, 销售团队B], [498, 497, 团队1], [499, 497, 团队2], [500, 497, 团队3], [501, 497, 团队4], [502, 213, 销售团队C], [503, 502, 团队1], [504, 502, 团队2], [505, 502, 团队3], [217, 212, 上海第二财富中心], [218, 217, 销售团队A], [220, 218, 团队A-1], [506, 218, 团队A-2], [507, 218, 团队A-3], [219, 217, 销售团队B], [508, 219, 团队B-1], [509, 219, 团队B-2], [221, 212, 上海第三财富中心], [222, 221, 销售团队A], [223, 222, 团队1], [224, 222, 团队2], [510, 222, 团队3], [511, 221, 销售团队B], [512, 511, 团队1], [513, 511, 团队2], [514, 221, 销售团队C], [515, 514, 团队1], [516, 514, 团队2], [517, 514, 团队3], [225, 212, 上海第四财富中心], [226, 225, 销售团队A], [227, 226, 团队1], [228, 226, 团队2], [518, 225, 销售团队B], [520, 518, 团队1], [529, 212, 上海第五财富中心], [530, 529, 销售团队A], [531, 530, 团队1], [532, 530, 团队2], [533, 530, 团队3], [534, 530, 团队4], [458, 0, 华南地区财富中心], [459, 458, 厦门市财富中心], [522, 459, 厦门财富中心], [460, 522, 销售团队A], [461, 460, 团队1], [462, 460, 团队2], [463, 0, 华中地区财富中心], [464, 463, 青岛市财富中心], [465, 464, 青岛财富中心], [466, 465, 销售团队A], [467, 466, 团队1], [468, 466, 团队2], [469, 466, 团队3], [470, 466, 团队4], [471, 0, 东北地区财富中心], [472, 471, 沈阳市财富中心], [473, 472, 沈阳财富中心], [474, 473, 销售团队A], [475, 474, 团队1], [476, 474, 团队2], [477, 474, 团队3], [478, 474, 团队4], [479, 474, 团队5], [480, 474, 团队6], [481, 0, 中西地区财富中心], [482, 481, 西安市财富中心], [483, 482, 西安财富中心], [484, 483, 销售团队A], [485, 484, 团队1], [486, 484, 团队2], [487, 484, 团队3], [10023, 0, 信审中心], [10050, 0, 结算中心], [10025, 0, 销售支持], [10047, 0, 团队7], [10051, 0, 销售中心], [110, 10051, 华北地区营业部], [115, 110, 北京市营业部], [116, 115, 北京朝阳营业部], [117, 116, 销售团队A], [118, 117, 团队1], [119, 117, 团队2], [138, 117, 团队3], [139, 117, 团队4], [142, 117, 团队5], [143, 117, 团队6], [134, 115, 北京中关村营业部], [135, 134, 销售团队A], [136, 135, 团队1], [137, 135, 团队2], [298, 135, 团队3], [299, 135, 团队4], [300, 135, 团队5], [301, 135, 团队6], [140, 110, 天津市营业部], [141, 140, 天津河西营业部], [126, 141, 销售团队A], [127, 126, 团队1], [128, 126, 团队2], [308, 126, 团队3], [309, 126, 团队4], [160, 110, 唐山市营业部], [161, 160, 唐山路南营业部], [162, 161, 销售团队A], [163, 162, 团队1], [164, 162, 团队2], [302, 162, 团队3], [303, 162, 团队4], [304, 162, 团队5], [305, 162, 团队6], [306, 162, 团队7], [307, 162, 团队8], [165, 10051, 西南地区营业部], [166, 165, 贵阳市营业部], [167, 166, 贵阳云岩营业部], [168, 167, 销售团队A], [169, 168, 团队1], [170, 168, 团队2], [364, 168, 团队3], [365, 168, 团队4], [366, 168, 团队5], [367, 168, 团队6], [368, 168, 团队7], [369, 168, 团队8], [171, 165, 南宁市营业部], [172, 171, 南宁青秀营业部], [173, 172, 销售团队A], [174, 173, 团队1], [175, 173, 团队2], [370, 173, 团队3], [371, 173, 团队4], [372, 173, 团队5], [373, 173, 团队6], [176, 165, 长沙市营业部], [177, 176, 长沙芙蓉营业部], [178, 177, 销售团队A], [179, 178, 团队1], [180, 178, 团队2], [374, 178, 团队3], [375, 178, 团队4], [376, 178, 团队5], [377, 178, 团队6], [10024, 178, 团队7], [181, 165, 株洲市营业部], [182, 181, 芦淞营业部], [183, 182, 销售团队A], [184, 183, 团队1], [185, 183, 团队2], [378, 183, 团队3], [379, 183, 团队4], [380, 183, 团队5], [186, 165, 遵义市营业部], [187, 186, 遵义红花岗营业部], [188, 187, 销售团队A], [189, 188, 团队1], [190, 188, 团队2], [381, 188, 团队3], [382, 188, 团队4], [383, 188, 团队5], [384, 188, 团队6], [385, 188, 团队7], [386, 188, 团队8], [191, 10051, 华东地区营业部], [192, 191, 上海市营业部], [193, 192, 上海静安营业部], [194, 193, 销售团队A], [195, 194, 团队1], [196, 194, 团队2], [387, 194, 团队3], [388, 194, 团队4], [389, 194, 团队5], [390, 194, 团队6], [197, 192, 上海徐家汇营业部], [198, 197, 徐家汇营业部第一分部], [199, 198, 团队1], [200, 198, 团队2], [523, 197, 徐家汇营业部第二分部], [525, 523, 团队1], [10008, 523, 团队2], [10026, 523, 团队3], [10027, 523, 团队4], [201, 191, 南京市营业部], [202, 201, 南京白下营业部], [203, 202, 销售团队A], [204, 203, 团队1], [205, 203, 团队2], [391, 203, 团队3], [392, 203, 团队4], [229, 10051, 中西地区营业部], [230, 229, 洛阳市营业部], [231, 230, 洛阳涧西营业部], [232, 231, 销售团队A], [233, 232, 团队1], [234, 232, 团队2], [350, 232, 团队3], [351, 232, 团队4], [352, 232, 团队5], [235, 229, 兰州市营业部], [236, 235, 兰州城关营业部], [237, 236, 销售团队A], [238, 237, 团队1], [239, 237, 团队2], [353, 237, 团队3], [354, 237, 团队4], [240, 229, 西安市营业部], [241, 240, 西安碑林营业部], [242, 241, 销售团队A], [243, 242, 团队1], [244, 242, 团队2], [355, 242, 团队3], [356, 242, 团队4], [357, 242, 团队5], [245, 229, 重庆市营业部], [246, 245, 重庆江北营业部], [247, 246, 销售团队A], [248, 247, 团队1], [249, 247, 团队2], [358, 247, 团队3], [359, 247, 团队4], [360, 247, 团队5], [361, 247, 团队6], [10034, 247, 团队7], [250, 229, 成都市营业部], [251, 250, 成都青羊营业部], [252, 251, 销售团队A], [253, 252, 团队1], [254, 252, 团队2], [362, 252, 团队3], [363, 252, 团队4], [255, 10051, 东北地区营业部], [256, 255, 沈阳市营业部], [257, 256, 沈阳和平营业部], [258, 257, 销售团队A], [259, 258, 团队1], [260, 258, 团队2], [341, 258, 团队3], [342, 258, 团队4], [343, 258, 团队5], [344, 258, 团队6], [261, 255, 长春市营业部], [262, 261, 长春朝阳营业部], [263, 262, 销售团队A], [264, 263, 团队1], [265, 263, 团队2], [345, 263, 团队3], [346, 263, 团队4], [347, 263, 团队5], [348, 263, 团队6], [349, 263, 团队7], [266, 10051, 华中地区营业部], [267, 266, 郑州市营业部], [268, 267, 郑州金水营业部], [269, 268, 销售团队A], [270, 269, 团队1], [271, 269, 团队2], [318, 269, 团队3], [319, 269, 团队4], [320, 269, 团队5], [272, 266, 青岛市营业部], [273, 272, 青岛市南营业部], [274, 273, 销售团队A], [275, 274, 团队1], [276, 274, 团队2], [321, 274, 团队3], [322, 274, 团队4], [323, 274, 团队5], [324, 274, 团队6], [325, 274, 团队7], [326, 274, 团队8], [327, 274, 团队9], [328, 274, 团队10], [329, 274, 团队11], [408, 274, 团队12], [277, 266, 济南市营业部], [278, 277, 济南市中营业部], [279, 278, 销售团队A], [280, 279, 团队1], [281, 279, 团队2], [331, 279, 团队3], [332, 279, 团队4], [333, 279, 团队5], [334, 279, 团队6], [282, 266, 合肥市营业部], [283, 282, 合肥庐阳营业部], [284, 283, 销售团队A], [285, 284, 团队1], [286, 284, 团队2], [335, 284, 团队3], [336, 284, 团队4], [337, 284, 团队5], [338, 284, 团队6], [339, 284, 团队7], [340, 284, 团队8], [287, 10051, 华南地区营业部], [288, 287, 福州市营业部], [289, 288, 福州鼓楼营业部], [290, 289, 销售团队A], [291, 290, 团队1], [292, 290, 团队2], [310, 290, 团队3], [311, 290, 团队4], [312, 290, 团队5], [313, 290, 团队6], [293, 287, 厦门市营业部], [294, 293, 厦门思明营业部], [295, 294, 销售团队A], [296, 295, 团队1], [297, 295, 团队2], [314, 295, 团队3], [315, 295, 团队4], [316, 295, 团队5], [317, 295, 团队6]"; list = getList(str); } return list; } @SuppressWarnings("rawtypes") public static List getList(String str) { String ss_1[] = str.split("],"); List list2 = new ArrayList(); for(int i=0;i<ss_1.length;i++) { String ss_2 = ss_1[i].trim().substring(1); String ss_3 [] = ss_2.split(","); List list3 = new ArrayList(); for(int j = 0;j<ss_3.length;j++) { list3.add(ss_3[j].trim()); list2.add(list3); } } return list2; } // public static String getSqlByCode(String cacheKey){ // DictionaryService dictionaryService = (DictionaryService)SpringContextHolder.getBean("dictionaryService"); // return dictionaryService.getSqlByCode(cacheKey); // } // /** // * @Description 清除session中有关页面提示信息 // */ // public static void clearExecuteMsg(){ // HttpServletRequest req =((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); // HttpSession session = req.getSession(); // if (session!=null){ // session.removeAttribute(SystemProperties.GLOBAL_ERROR_INFO_KEY); // session.removeAttribute(SystemProperties.GLOBAL_SUCCESS_INFO_KEY); // session.removeAttribute(SystemProperties.GLOBAL_DETAIL_ERROR_INFO_KEY); // } // } // // /** // * // * @param bean // * @param moduleId // * @return // */ // public static List<OperateVO> getUserOperate(LoginUserInfoBean bean,String moduleId){ // OperateService operateService = (OperateService)SpringContextHolder.getBean("operateService"); // return operateService.queryUserOperate(bean,moduleId); // } }
5,我这里有个json工具类,用到了一点,也贴出来了。
package pro.utils.basebean; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.util.CycleDetectionStrategy; /** * * <p>Title: Json工具类</p> * <p>Description: </p> * <p>Company: minxin</p> * @author xiabz * @date Oct 28, 2013 */ public class JsonUtil{ /** * * 将java对象转换成json字符串 * * @param javaObj * * @return */ public static String getJsonString4JavaPOJO(Object javaObj) { JSONObject json; json = JSONObject.fromObject(javaObj); return json.toString(); } /** * * 将java对象转换成json字符串,并设定日期格式 * * @param javaObj * * @param dataFormat * * @return */ public static String getJsonString4JavaPOJO(Object javaObj, String dataFormat) { JSONObject json; JsonConfig jsonConfig = configJson(dataFormat); json = JSONObject.fromObject(javaObj, jsonConfig); return json.toString(); } /** * * 将java对象转换成json字符串,并设定日期格式 * * @param javaObj * * @param dataFormat * * @return */ public static String getJsonArrayString4JavaPOJO(Object javaObj, String dataFormat) { JSONArray json; JsonConfig jsonConfig = configJson("yyyy-MM-dd HH:mm:ss"); json = JSONArray.fromObject(javaObj, jsonConfig); return json.toString(); } public static JSONObject objectcollect2json(List list, int total) { Map<String, Object> map = new HashMap<String, Object>(); map.put("total", total); map.put("rows", list); return JSONObject.fromObject(map); } /** * * JSON 时间解析器具 * * @param datePattern * * @return */ public static JsonConfig configJson(String datePattern) { JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[] { "" }); jsonConfig.setIgnoreDefaultExcludes(false); jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(datePattern)); return jsonConfig; } /** * * * * @param excludes * * @param datePattern * * @return */ public static JsonConfig configJson(String[] excludes, String datePattern) { JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(excludes); jsonConfig.setIgnoreDefaultExcludes(false); jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); jsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(datePattern)); return jsonConfig; } /** * * <p> * Title: * </p> * <p> * Description: 从一个JSON 对象字符格式中得到一个java对象 * </p> * * @author Robin * @param jsonString * @param pojoCalss * @return */ public static Object getObject4JsonString(String jsonString, Class pojoCalss) { Object pojo = null; try { JSONObject jsonObject = JSONObject.fromObject(jsonString); pojo = JSONObject.toBean(jsonObject, pojoCalss); } catch (Exception e) { e.printStackTrace(); } return pojo; } }
6,在页面上引用标签
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="exp" uri="/exp-tags" %> (这里是就是你对应的tld文件的一个<uri>/exp-tags</uri>) <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP ‘index.jsp‘ starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <link type="text/css" rel="stylesheet" href="jquery-ztree/3.5.12/css/zTreeStyle/zTreeStyle.css" /> <script type="text/javascript" src="jquery/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="jquery-ztree/3.5.12/js/jquery.ztree.core-3.5.js"></script> </head> <script type="text/javascript"> function importExcelJs() { document.getElementById("importExcelSubmit").action="<%=basePath%>serviceAction.action"; alert(document.getElementById("importExcelSubmit").action); document.getElementById("importExcelSubmit").submit(); } function btnSelect() { var selectName = document.getElementById("q_financeProductsCd").value; document.getElementById("importExcelSubmit").action=‘<%=basePath%>selectAction.action?selectName=‘+selectName; alert(document.getElementById("importExcelSubmit").action); document.getElementById("importExcelSubmit").submit(); } function btnOnclik() { alert("a"); var chkObjs = document.getElementsByName("radName"); var chkValue = ""; for(var i=0;i<chkObjs.length;i++){ if(chkObjs[i].checked){ chkValue = chkObjs[i].value; break; } } alert(chkValue); } function clickArea(e, id, node) { $(‘#q_dept‘).val(‘-1‘); $(‘#q_deptName‘).val(‘‘); $(‘#q_areaId‘).val(node.id); document.getElementById(‘queryMainForm‘).action=‘<%=basePath%>treeAction.action‘; $(‘#queryMainForm‘).submit(); } function treeClick(e, id, node) { $(‘#q_areaId‘).val(node.id); $(‘#q_dept‘).val(node.id); $(‘#q_deptName‘).val(node.name); document.getElementById(‘queryMainForm‘).action=‘<%=basePath%>treeAction.action‘; $(‘#queryMainForm‘).submit(); } </script> <body> <form method="post" id = "importExcelSubmit" action="<%=basePath%>serviceAction.action"> <exp:select code="PRODUCT_NAME" name="q_financeProductsCd" id="q_financeProductsCd" value = "${selectName }" headerValue="---请选择---" headerKey="" cssClass="q_name"></exp:select> <input type="button" onclick="importExcelJs();" value="提交"/> <input type="submit" value="确定"> <input type="button" onclick="btnSelect();" value="测试"/> </form> <form method="post" id= "queryMainForm" action="<%=basePath%>selectAction.action"> <input id="q_areaId" name = "employeeQueryVO.q_areaId" value = "${employeeQueryVO.q_areaId }" type="hidden" value=""/> <input id="q_dept" name = "employeeQueryVO.q_dept" value = "${employeeQueryVO.q_dept }" type="hidden" value=""/> <input id="q_deptName" name = "employeeQueryVO.q_deptName" value = "${employeeQueryVO.q_deptName }" type="hidden" value=""/> <input type="button" onclick="btnSelect();" value="测试树状"/> <exp:treeSelect id="areaTree" value="${employeeQueryVO.q_areaId }" code="selectTree" expendLevel="10" rootNodeId="0" rootNodeName="地区列表" dataType="Require" msg="上级地区不能为空!" onClick="clickArea" /> <exp:tree code="Tree" expendLevel="3" onClick="treeClick" checkStyle="ztree" params="${employeeQueryVO.q_areaId},${employeeQueryVO.q_areaId},${employeeQueryVO.q_areaId}" value="${employeeQueryVO.q_dept}" rootNodeId="0" rootNodeName="机构列表"></exp:tree> </form> <s:radio id = "radId" name = "radName" list="#{‘1‘:‘Yes‘,‘2‘:‘No‘,‘3‘:‘Yes3‘,‘4‘:‘No4‘,‘5‘:‘Yes5‘,‘6‘:‘No6‘}" value="2"></s:radio> <input type ="button" onclick="btnOnclik();" value="按钮"> </body> </html>
7,如果是springmvc好像要在web.xml里面加入你tld标签的引用(我这里工程建的单纯,就一个sturts2就不需要了);这里少Action类,(忘记了)这里也一并贴出来
1
2
3
4
5
6
7
8
9
10 |
<jsp-config> <taglib> <taglib-uri>tlds/expend-tag.tld</taglib-uri> <taglib-location>/WEB-INF/tlds/expend-tag.tld</taglib-location> </taglib> <taglib> <taglib-uri>/WEB-INF/report_config/runqianReport4.tld</taglib-uri> <taglib-location>/WEB-INF/report_config/runqianReport4.tld</taglib-location> </taglib> </jsp-config> |
package pro.services.impl; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import pro.entity.UIComponentBean; import pro.utils.basebean.BaseQueryBean; import pro.utils.basebean.EmployeeQueryVO; public class GetList { public EmployeeQueryVO employeeQueryVO; public String getList() { HttpServletRequest request = ServletActionContext.getRequest(); List<UIComponentBean> list = new ArrayList<UIComponentBean>(); list.add(new UIComponentBean("A","男A")); list.add(new UIComponentBean("B","男B")); list.add(new UIComponentBean("C","男C")); list.add(new UIComponentBean("D","男D")); list.add(new UIComponentBean("E","男E")); list.add(new UIComponentBean("F","男F")); request.setAttribute("list", list); return "index"; } public String Select() { HttpServletRequest request = ServletActionContext.getRequest(); String selectName = request.getParameter("selectName"); System.out.println("选择的select为:"+selectName); request.setAttribute("selectName", selectName); return "index"; } public String Tree(){ HttpServletRequest request = ServletActionContext.getRequest(); System.out.println("选择地区:"+employeeQueryVO.getQ_areaId()); System.out.println("选择的树节点:"+employeeQueryVO.getQ_dept()); System.out.println("选择的树节点:"+employeeQueryVO.getQ_deptName()); return "index"; } public EmployeeQueryVO getEmployeeQueryVO() { return employeeQueryVO; } public void setEmployeeQueryVO(EmployeeQueryVO employeeQueryVO) { this.employeeQueryVO = employeeQueryVO; } }
struts.xml就不用贴了相信大家都会。
8,我贴出一些我这个标签操作文档
(1)如果是类别字典,请在TYPE_DICTIONARY表中进行录入数据,详细说明请参考Repositories\minxinloan\branches\doc\01开发文档\数据库设计\系统类别字典导入模版.xlsx
(2)如果是外键或者树结构,请手动在SYSTEM_CODE_CACHE表中进行配置。
SYSTEM_CODE_CACHE建表脚本请参见Repositories\minxinloan\branches\doc\01开发文档\数据库设计\公用表(SYSTEM_CODE_CACHE)Sql创建脚本.txt
SYSTEM_CODE_CACHE表字段说明
ID |
表的主键,录入数据的时候不重复就可以了 |
CODE |
不能重复的编码,不仅在本表中不能重复,要求与TYPE_DICTIONARY表里面的TYPE_CODE字段的记录也不能重复 |
NAME |
当前查询的描述信息 |
LIST_SQL |
1.查询的sql语句,要求能在plsql上面执行成功,不报错。 2.如果查询的是树结构的数据,要求按照id,上级id,树结构显示的name进行select,并且查询语句查询的结果集第一条数据是根节点,请对sql做好排序。 3.Sql里面可以带有参数,请用?标识。 |
IS_CACHED |
设置是否缓存,外键表的数据建议不要缓存,以免查询到的数据不能及时更新,0表示不缓存,1表示缓存 |
code |
对应要查询的UC_TYPE_DICTIONARY表里面的TYPE_CODE或者SYSTEM_CODE_CACHE表里面的CODE |
params |
如果查询语句里面有参数,传入的参数就配置在这里 |
id |
select标签的唯一标识 |
name |
标签的名称 |
headerKey |
标签初始化时候的值 |
headerValue |
标签初始化时候显示的文本 |
value |
标签的值 |
cssClass |
标签的样式 |
style |
标签的样式,例如设置width |
onChange |
设置选择不同的值触发的事件 |
disabled |
设置为true标识标签不可用 |
dataType |
设置成Require表示改项必须选择 |
msg |
为空的时候提示信息 |
使用例子:<exp:select code="EMPLOYEE_LIST" name="q_name" value="100"/>
code |
对应要查询的UC_TYPE_DICTIONARY表里面的TYPE_CODE或者SYSTEM_CODE_CACHE表里面的CODE |
params |
如果查询语句里面有参数,传入的参数就配置在这里 |
name |
标签的名称 |
value |
标签的值 |
onChange |
设置选择不同的值触发的事件 |
disabled |
设置为true标识标签不可用 |
onClick |
点击标签的时候触发的事件 |
colCount |
每行显示的标签个数,默认显示5个 |
使用例子:<exp:radio code="EMPLOYEE_LIST" name="user" value="101"/>
code |
对应要查询的UC_TYPE_DICTIONARY表里面的TYPE_CODE或者SYSTEM_CODE_CACHE表里面的CODE |
params |
如果查询语句里面有参数,传入的参数就配置在这里 |
name |
标签的名称 |
value |
标签的值, 多个值中间用,分开 |
onChange |
设置选择不同的值触发的事件 |
disabled |
设置为true标识标签不可用 |
onClick |
点击标签的时候触发的事件 |
colCount |
每行显示的标签个数,默认显示5个 |
使用例子:<exp:checkboxlist code="PWD_DATE" name="pwd_date" value="3,12"/>
code |
对应要查询的UC_TYPE_DICTIONARY表里面的TYPE_CODE或者SYSTEM_CODE_CACHE表里面的CODE |
params |
如果查询语句里面有参数,传入的参数就配置在这里 |
id |
树控件的id |
checkStyle |
设置显示的树是否需要checkbox或者radio |
onChange |
设置选择不同的值触发的事件 |
chkboxType |
配置格式{‘Y‘:‘p‘,‘Y‘:‘s‘}。配置项说明,Y 属性定义 checkbox 被勾选后的情况; N 属性定义 checkbox 取消勾选后的情况; "p" 表示操作会影响父级节点; "s" 表示操作会影响子级节点。 请注意大小写,不要改变 |
onClick |
点击树节点触发的事件,配置的时候只需配置function的名称,不要跟括号。回调函数格式: function treeClick(event,treeId,node){ //…… }
|
expendLevel |
树加载完展开的级数,默认展开3级 |
value |
树选中的值, 多个值中间用,分开 |
style |
列表树显示的样式,可以通过style设置树形显示的大小,默认为width:200px;height:300px; |
rootNodeId |
虚拟的根节点id |
rootNodeName |
虚拟的根节点名称 |
使用例子:<exp:tree code="ORGAN_TREE" onClick="treeClick" checkStyle="checkbox" chkboxType="{‘Y‘:‘p‘,‘Y‘:‘s‘}"></exp:tree>
注:使用树控件需要引入<link rel="stylesheet" href="${ctxStatic}/jquery-ztree/3.5.12/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="${ctxStatic}/jquery-ztree/3.5.12/js/jquery.ztree.core-3.5.js"></script>
如果树需要配置checkbox,还需要引入
<script type="text/javascript" src="${ctxStatic}/jquery-ztree/3.5.12/js/jquery.ztree.excheck-3.5.js"></script>
对于树控件的其他操作,请参见项目\minxinloan\src\main\webapp\static\jquery-ztree\3.5.12\api
code |
对应要查询的UC_TYPE_DICTIONARY表里面的TYPE_CODE或者SYSTEM_CODE_CACHE表里面的CODE |
params |
如果查询语句里面有参数,传入的参数就配置在这里 |
id |
树控件的id |
checkStyle |
设置显示的树是否需要checkbox或者radio |
onChange |
设置选择不同的值触发的事件 |
chkboxType |
配置格式{‘Y‘:‘p‘,‘Y‘:‘s‘}。配置项说明,Y 属性定义 checkbox 被勾选后的情况; N 属性定义 checkbox 取消勾选后的情况; "p" 表示操作会影响父级节点; "s" 表示操作会影响子级节点。 请注意大小写,不要改变 |
onClick |
点击树节点触发的事件,配置的时候只需配置function的名称,不要跟括号。回调函数格式: function treeClick(event,treeId,node){ //…… }
|
expendLevel |
树加载完展开的级数,默认展开3级 |
value |
树选中的值, 多个值中间用,分开 |
style |
列表树显示的样式,可以通过style设置树形显示的大小,默认为width:200px;height:300px; |
rootNodeId |
虚拟的根节点id |
rootNodeName |
虚拟的根节点名称 |
dataType |
设置成Require表示改项必须选择 |
msg |
为空的时候提示信息 |
name |
控件的名称 |
使用例子: <exp:treeSelect name="parentId" code="MODULE_TREE" expendLevel="3" value="${module.parentId}"
dataType="Require" msg="上级模块不能为空!" />
注:使用树控件需要引入<link rel="stylesheet" href="${ctxStatic}/jquery-ztree/3.5.12/css/zTreeStyle/zTreeStyle.css" type="text/css">
<script type="text/javascript" src="${ctxStatic}/jquery-ztree/3.5.12/js/jquery.ztree.core-3.5.js"></script>
需要引入样式
<link rel="stylesheet" type="text/css" href="${ctxStatic}/css/treeSelect.css">
如果树需要配置checkbox,还需要引入
<script type="text/javascript" src="${ctxStatic}/jquery-ztree/3.5.12/js/jquery.ztree.excheck-3.5.js"></script>
对于树控件的其他操作,请参见项目\minxinloan\src\main\webapp\static\jquery-ztree\3.5.12\api
10,有空的话给点评价(非常感谢。)
原文:http://www.cnblogs.com/puqiuxiaomao/p/3689191.html