jeecg的官方文檔是這樣介紹comboBox標籤的使用的:javascript
屬性名 | 類型 | 描述 | 是否必須 | 默認值 |
name | string | 控件名稱 | 是 | null |
url | string | 遠程數據訪問 | 是 | null |
id | string | 惟一標識 | 是 | null |
text | string | 顯示文本 | 是 | null |
width | string | 寬度 | 否 | null |
listWidth | string | 下拉框寬度 | 否 | null |
listHeight | string | 下拉框高度 | 否 | null |
用法:
java
<t:comboBox url="jeecgDemoController.do?combox" name="sex" text="userName" id="id"></t:comboBox>
但沒有介紹遠程數據返回時要以什麼格式返回,找到jeecgDemoController.do?combox對應的代碼發現是這樣的:jquery
@RequestMapping(params = "combox") @ResponseBody public List<JeecgDemo> combox(HttpServletRequest request, DataGrid dataGrid) { CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class); List<JeecgDemo> ls = this.jeecgDemoService.getListByCriteriaQuery(cq, false); return ls; }
直接返回實體對象的列表的json封裝,但我試事後發現這是錯的!觀察源碼發現這個標籤其實是對jquery easyui的combox的一個封裝,以下:數據庫
StringBuffer sb = new StringBuffer(); ComboBox comboBox=new ComboBox(); comboBox.setText(text); comboBox.setId(id); sb.append("<script type=\"text/javascript\">" +"$(function() {" +"$(\'#"+name+"\').combobox({" +"url:\'"+url+"&id="+id+"&text="+text+"\'," +"editable:\'false\'," +"valueField:\'id\'," +"textField:\'text\'," +"width:\'"+width+"\'," +"listWidth:\'"+listWidth+"\'," +"listHeight:\'"+listWidth+"\'," +"onChange:function(){" +"var val = $(\'#"+name+"\').combobox(\'getValues\');" +"$(\'#"+name+"hidden\').val(val);" +"}" +"});" +"});" +"</script>"); sb.append("<input type=\"hidden\" name=\""+name+"\" id=\""+name+"hidden\" > " +"<input class=\"easyui-combobox\" " +"multiple=\"true\" panelHeight=\"auto\" name=\""+name+"name\" id=\""+name+"\" >"); return sb;
其中定義了下拉框中的value取的是id這個字段的值,text取的是text這個字段的值:apache
+"valueField:\'id\'," +"textField:\'text\',"
因此返回的數據格式就清楚了,必須是相似於如下格式json
{[id:'objId',text:'value'],[ id:'objId',text:'value' ]}
咱們能夠用hashmap或本身寫一個類來封裝要返回的數據,而後放到list或數組中返回,我這邊直接用了jeecg中的ComboBox這個類:數組
package org.jeecgframework.core.common.model.json; /** * 後臺向前臺返回JSON,用於easyui的datagrid * * @author * */ public class ComboBox { private String id; private String text; private boolean selected; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } }
最後在controller中的代碼大概以下:app
@RequestMapping(params = "combox") @ResponseBody public List<ComboBox> combox(HttpServletRequest request, DataGrid dataGrid) { CriteriaQuery cq = new CriteriaQuery(ChannelEntity.class); List<ChannelEntity> ls = this.channelService.getListByCriteriaQuery(cq, false); List<ComboBox> comboxList = new ArrayList<ComboBox>(ls.size()); for (ChannelEntity channel : ls) { ComboBox comboBox = new ComboBox(); comboBox.setId(channel.getId()); comboBox.setText(channel.getName()); comboxList.add(comboBox); } return comboxList; }
須要先從數據庫中取了返回的數據,再封裝成ComboBox。jsp
象上面這樣就大概可使用jeecg中的comboBox標籤了。ui
但jeecg3.5中的omboBox標籤存在兩個問題:
1. 只能多選(竟然沒提供能夠設置單選的屬性,呃)
2.不能設置默認選中的值(這在編輯界面是必須的呀^_^)
因此我本身對jeecg的代碼稍微作了些修改,以支持上面這兩個需求。
1.支持設置單選,多選的屬性
在ComboBoxTag這個類中增長一個屬性和對應的setter方法,以下:
private boolean multiple = true; public void setMultiple(boolean multiple) { this.multiple = multiple; }
修改ComboBoxTag這個類中的end方法,處理multiple屬性,以下:
.append("multiple:").append((Boolean.toString(this.multiple))).append(",")
在標籤訂義文件(WEB-INF\tld\easyui.tld)中增長multiple屬性,以下:
<attribute> <name>multiple</name> <rtexprvalue>true</rtexprvalue> <description>是否多選</description> </attribute>
這樣只要在使用comboBox標籤時在代碼中設置multiple屬性爲false就能夠支持單選了。
2.增長設置默認選中的值的屬性
在ComboBoxTag這個類中增長一個屬性和對應的setter方法,以下:
private String selectedValue; public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; }
修改ComboBoxTag這個類中的end方法,處理selectedValue屬性,以下:
if (StringUtil.isNotEmpty(this.selectedValue)) { sb.append("$(\'#").append(name).append("\').combobox(\'setValue\',\'").append(this.selectedValue).append("\');"); }
在標籤訂義文件(WEB-INF\tld\easyui.tld)中增長selectedValue屬性,以下:
<attribute> <name>selectedValue</name> <rtexprvalue>true</rtexprvalue> <description>默認選中值</description> </attribute>
這樣只要在使用comboBox標籤時在代碼中設置selectedValue的值就就能夠支持設置默認值了。
最後附上完整的代碼:
jsp
<t:comboBox url="channelController.do?combox" name="channelId" text="name" id="id" multiple="false" selectedValue="${channelUserPage.channelId}"></t:comboBox>
controller
@RequestMapping(params = "combox") @ResponseBody public List<ComboBox> combox(HttpServletRequest request, DataGrid dataGrid) { CriteriaQuery cq = new CriteriaQuery(ChannelEntity.class); List<ChannelEntity> ls = this.channelService.getListByCriteriaQuery(cq, false); List<ComboBox> comboxList = new ArrayList<ComboBox>(ls.size()); for (ChannelEntity channel : ls) { ComboBox comboBox = new ComboBox(); comboBox.setId(channel.getId()); comboBox.setText(channel.getName()); comboxList.add(comboBox); } return comboxList; }
ComboBoxTag類:
package org.jeecgframework.tag.core.easyui; import java.io.IOException; import javax.servlet.jsp.JspTagException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.apache.commons.lang.StringUtils; import org.jeecgframework.core.common.model.json.ComboBox; import org.jeecgframework.core.util.StringUtil; /** * * 類描述:下拉選擇框標籤 * * @author: 張代浩 * @date: 日期:2012-12-7 時間:上午10:17:45 * @version 1.0 */ public class ComboBoxTag extends TagSupport { protected String id;// ID protected String text;// 顯示文本 protected String url;// 遠程數據 protected String name;// 控件名稱 protected Integer width;// 寬度 protected Integer listWidth;// 下拉框寬度 protected Integer listHeight;// 下拉框高度 protected boolean editable;// 定義是否能夠直接到文本域中鍵入文本 // modify by jasonzhang 20150415:增長multiple屬性以控制下拉框能夠單選仍是多選 private boolean multiple = true; // modify by jasonzhang 20150415:增長selectedValue屬性設置下拉框的默認選中值 private String selectedValue; public int doStartTag() throws JspTagException { return EVAL_PAGE; } public int doEndTag() throws JspTagException { try { JspWriter out = this.pageContext.getOut(); out.print(end().toString()); out.flush(); } catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } public StringBuffer end() { StringBuffer sb = new StringBuffer(); // ComboBox comboBox = new ComboBox(); // comboBox.setText(text); // comboBox.setId(id); //若是name帶有點號若是"business.id",則用點位符\\.替換掉. String jqueryIdName = name; if (name.indexOf('.') > -1) { jqueryIdName = StringUtils.replace(jqueryIdName, ".", "\\\\."); } sb.append("<script type=\"text/javascript\">") .append("$(function() {") .append("$(\'#" + jqueryIdName + "\').combobox({") .append("url:\'" + url + "&id=" + id + "&text=" + text + "\',") .append("editable:\'false\',") .append("multiple:").append((Boolean.toString(this.multiple))).append(",") .append("valueField:\'id\',") .append("textField:\'text\',") .append("width:\'" + width + "\',") .append("listWidth:\'" + listWidth + "\',") .append("listHeight:\'" + listWidth + "\',") .append("onChange:function(){") .append("var val = $(\'#" + jqueryIdName + "\').combobox(\'getValues\');") .append("$(\'#" + jqueryIdName + "hidden\').val(val);").append("},"); // modify by jasonzhang 20150415:增長selectedValue屬性設置下拉框的默認選中值 sb.append("onLoadSuccess:function(data){"); if (StringUtil.isNotEmpty(this.selectedValue)) { sb.append("$(\'#").append(jqueryIdName).append("\').combobox(\'setValue\',\'").append(this.selectedValue).append("\');"); } sb.append("}").append("});});"); sb.append("</script>"); sb.append( "<input type=\"hidden\" name=\"").append(name).append("\" id=\"").append(name).append("hidden\""); // modify by jasonzhang 20150415:增長selectedValue屬性設置下拉框的默認選中值 if (StringUtil.isNotEmpty(this.selectedValue)) { sb.append(" value=\"").append(this.selectedValue).append("\""); } sb.append(" > "); sb.append("<input class=\"easyui-combobox\" ") .append(" panelHeight=\"auto\" name=\"" + name + "name\" id=\"" + name + "\" >"); return sb; } public void setId(String id) { this.id = id; } public void setText(String text) { this.text = text; } public void setUrl(String url) { this.url = url; } public void setName(String name) { this.name = name; } public void setMultiple(boolean multiple) { this.multiple = multiple; } public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; } }
標籤文件中comboBox對應部分
<tag> <name>comboBox</name> <tag-class>org.jeecgframework.tag.core.easyui.ComboBoxTag</tag-class> <body-content>JSP</body-content> <description>下拉選擇框</description> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <description>控件名稱</description> </attribute> <attribute> <name>url</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <description>遠程數據</description> </attribute> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <description>ID對應字段</description> </attribute> <attribute> <name>text</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <description>text對應字段</description> </attribute> <attribute> <name>width</name> <rtexprvalue>true</rtexprvalue> <description>width對應字段</description> </attribute> <attribute> <name>listWidth</name> <rtexprvalue>true</rtexprvalue> <description>listWidth對應字段</description> </attribute> <attribute> <name>listHeight</name> <rtexprvalue>true</rtexprvalue> <description>listHeight對應字段</description> </attribute> <attribute> <name>multiple</name> <rtexprvalue>true</rtexprvalue> <description>是否多選</description> </attribute> <attribute> <name>selectedValue</name> <rtexprvalue>true</rtexprvalue> <description>默認選中值</description> </attribute> </tag>
20150420更新:
修改若是下拉框的名字帶有點號,下拉框將不能正常工做的bug