本文實例講述了jsp從數(shù)據(jù)庫獲取數(shù)據(jù)填充下拉框?qū)崿F(xiàn)二級聯(lián)動菜單的方法。分享給大家供大家參考,具體如下:
項目告一段落,現(xiàn)在將遇到的比較實用的東西記錄下來,寫了多遍了,謹記于此,以備查看!
1、首先在數(shù)據(jù)庫中獲取第一個下拉框的數(shù)據(jù):
s:select listKey="tsFrom" id="t_tsfrom" cssClass="required" listValue="tsFrom" cssStyle="width:90" list="tsfrom1" name="tsFrom" theme="simple" headerKey="" onchange="getTsFromDescribe(this);" headerValue="--請選擇--" />
后臺處理:
@Autowired private CustomMaManager custommamanager;//注解相當?shù)暮糜冒?,代碼都省了一大截 tsfrom1 = custommamanager.getTsFrom();
Service:
//得到投訴來源 public ListCustomManage> getTsFrom(){ return custommanagedao.getTsFrom(); }
dao:
/**得到產(chǎn)品類型**/ public ListCustomManage> getTsFrom(){ return this.find("SELECT distinct new CustomManage(tsFrom,'2') FROM CustomManage C WHERE C.tsFrom IS NOT NULL ORDER BY tsFrom ASC"); }
注意:Oracle在java代碼里取出重復(fù)值與SqlServer不一樣,它得使用:
先new實體bean(CustomManage) 然后在實體bean中給相應(yīng)字段設(shè)置構(gòu)造方法,不然將會出現(xiàn)后臺已經(jīng)返回了值,但是在前臺下拉框中不顯示,下拉框空白的現(xiàn)象。
public CustomManage(String khname,int s){ this.khname=khname; } public CustomManage(String cpname,String type){ if("1".equals(type)){ this.cpname=cpname; }else if("2".equals(type)){ this.tsFrom=cpname; }else if("3".equals(type)){ this.khname=cpname; } }
這里需要在bean的實體類里面加入相應(yīng)的構(gòu)造方法,以此來供去重使用。
至此第一級的數(shù)據(jù)準備已經(jīng)差不多了。使用S標簽的list集合來獲取后臺傳遞過來的值。
2、第二級下拉菜單的級聯(lián)====利用Ajax來獲取數(shù)據(jù)
在第一級列表的onchange事件中編寫:
//投訴信息來源信息級聯(lián) function getTsFromDescribe(ts_describe){ var tsfrom = $("#t_tsfrom").val(); var tstsFrom = $("#ts_tsFrom").val(); Ext.Ajax.request( { url : '${ctx}/complaints/complaints!getTsFrom.action', params : { tsfrom : tsfrom//通過json形式將前臺每次獲取到的值傳遞給后臺 }, success : function(response) { var json = Ext.util.JSON.decode(response.responseText); if (json.success) { var data = json.strong>cmList/strong>; if ("" == data) { alert("請選擇投訴類型"); inputForm.t_tsfrom.focus(); $("#ts_tsFrom").empty();//每次需要將上一次的數(shù)據(jù)進行清空 } else { $("#ts_tsFrom").empty(); //對獲取到的數(shù)據(jù)進行迭代 for ( var i = 0; i data.length; i++) { var id = data[i]; var name = data[i]; $("#ts_tsFrom").append( "option value='" + id + "'>" + name + "/option>"); } dwr.util.removeAllOptions('tstsFrom'); dwr.util.addOptions('tstsFrom', data); } } } }); }
后臺返回數(shù)據(jù):
public void getTsFrom() throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); String ts_names = tsfrom; ListCustomManage> list = complaintsmanager.getTsDescribe(ts_names); response.setContentType("text/javascript"); // 后臺控制的代碼 PrintWriter writer = response.getWriter(); // 將得到的list集合轉(zhuǎn)為JSON對象傳給前臺處理 JSONArray j = JSONArray.fromObject(list); writer.println("{'success':true,'strong>cmList/strong>':" + j.toString() + "}"); }
到此一個從數(shù)據(jù)庫里動態(tài)獲取值,并且實現(xiàn)二級菜單級聯(lián)的功能就做的差不多了。發(fā)表出來希望對你對我都有好處哈。
這里加注一點就是在修改的時候下拉框的值不會保存,就是上一次點擊提交的時候保存在數(shù)據(jù)庫里的值無法填充到下拉框。
處理辦法:
var op1 = document.getElementById("op1").value; if(op1!=null){ $("#cp_validity").val(op1); //將取出來的值塞到下拉框中。一個蘿卜一個坑 } input type="hidden" id="op1" value="${compDisposal.validity}">//使用表達式將存在數(shù)據(jù)庫里的值取出來,放在隱藏域里面
希望本文所述對大家jsp程序設(shè)計有所幫助。