html页面下拉列表中动态添加后台数据(格式化数据,显示出数据的层次感)

html页面下拉列表中动态添加后台数据(格式化数据,显示出数据的层次感)

效果图:

 

 

运行原理和技术:

当页面加载完毕,利用jquery向后台发送ajax请求,去后台拼接<select></select>中的option字符串。让后将字符串响应回来,动态添加到<select>中。其中的字符串中包含了后台的数据。

页面js代码:

 

 1 <script type="text/javascript">
 2     //加载部门
 3     function loadSysGroup(){
 4         var groups=document.getElementById("selectObj");
 5             if(groups == null ){
 6                 return;
 7             }
 8             $.ajax({
 9                 type:"POST",
10                 url:"<%=request.getContextPath() %>"+"/master/sysGroup_getOptions.action",
11                 dataType:"json",
12                 success:function(data){
13                     var options=data["options"];
14                     groups.innerHTML="<option value='0'>--请选择--</option>"+options;
15
16                 }
17             });
18     }
19
20     //当页面加载完成后,加载部门
21     $(document).ready(function(){
22         loadSysGroup();
23     });
24 </script>
25
26  <li><label>所属部门</label><select id="selectObj" name="sysGroupId"> </select></li>

View Code

 

后台action和sercive方法(省去dao层查数据的方法,主要是体现加工字符串)

 

  1     /**action 层
  2      * ajax查询出所有的部门信息
  3     * @Title: ajaxQueryGroup
  4     * @Description: TODO(这里用一句话描述这个方法的作用)
  5     * @return
  6     * @return String    返回类型
  7     * @author 尚晓飞
  8     * @date 2014-9-4 上午11:36:15
  9      */
 10     public String ajaxQueryGroup(){
 11
 12         try {
 13
 14             String sbString=sysUserService.findQueryGroup();
 15             jsonObject.put("options", sbString);
 16
 17         } catch (Exception e) {
 18             // TODO: handle exception
 19             e.printStackTrace();
 20             return "error";
 21         }finally{
 22             out.print(jsonObject);
 23             out.close();
 24         }
 25
 26         return null;
 27     }
 28
 29
 30 /**service层的加工数据
 31      * 加载出组
 32     * @Title: findQueryGroup
 33     * @Description: TODO(这里用一句话描述这个方法的作用)
 34     * @author 尚晓飞
 35     * @date 2014-9-25 上午11:38:16
 36     * @return
 37     * @see org.ledger.service.SysUserService#findQueryGroup()
 38      */
 39     @Override
 40     public String findQueryGroup() {
 41         // TODO Auto-generated method stub
 42         StringBuffer str=new StringBuffer();
 43         //院属单位institute_unit  非院属单位research_center
 44         //第一步拼接院属单位
 45         str.append("<optgroup label=\"院属单位\">");//optgroup是页面分类,无值。
 46         MyClass myClass=new MyClass();
 47         myClass.handleSb("institute_unit", 0);//算是一个父id
 48         str.append(myClass.sb.toString());
 49         str.append("</optgroup>");
 50
 51         //第二步拼接非院属单位
 52         str.append("<optgroup label=\"非院属单位\">");
 53         MyClass myClass2=new MyClass();
 54         myClass2.handleSb("research_center", 0);
 55         str.append(myClass2.sb.toString());
 56         str.append("</optgroup>");
 57
 58         return str.toString();
 59     }
 60
 61     /**
 62      * 内部类(加工数据的主要)递归
 63     * @ClassName: myClass
 64     * @Description: TODO(这里用一句话描述这个类的作用)
 65     * @author 尚晓飞
 66     * @date 2014-9-25 上午11:46:34
 67     *本示例,第一级没有加标示,数据只有两级,如果后台数据有多个级别的话,则会显示层次关系。掌握思想
 68      */
 69     class MyClass{
 70         StringBuffer sb=new StringBuffer();
 71
 72         //拼接内容
 73         public void handleSb(String unitType,Integer num){
 74             //根据父id查询出符合条件的集合(父子关系,在数据库表中,父的主键id 是子的父级id字段的值)
 75             List<SysGroup> listGroups=sysGroupService.queryGroupsByType(unitType);
 76             //如果不为空,则进行拼接加工字符串
 77             if(listGroups!=null&&listGroups.size()>0){
 78                 int m=0;//用来记录循环的次数
 79                 num++;//用来记录运行该方法的次数
 80
 81                 for(int i=0;i<listGroups.size();i++){
 82                     sb.append("<option value=\""+listGroups.get(i).getSysGroupId()+"\">");
 83
 84                     //决定位置
 85                     //一次递归说明是一个等级,则需要层次分明,则进行加空格,至于加多少,用递归次数决定,从而显示出层次感
 86                     for(int j=1;j<num;j++){
 87                         sb.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
 88                     }
 89
 90                     //决定前边装饰的符号
 91                     if(num!=1){
 92                         if(m<(listGroups.size()-1)){
 93                             //说明循环没有到最后一次
 94                             sb.append("&nbsp;&nbsp;┠&nbsp;&nbsp;");
 95                         }else {
 96                             sb.append("&nbsp;&nbsp;┖&nbsp;&nbsp;");
 97                         }
 98                     }else {
 99                         sb.append("&nbsp;&nbsp;");
100                     }
101
102                     //添加名字
103                     sb.append(listGroups.get(i).getSysGroupName());
104                     sb.append("</option>");
105                     //循环一次了,循环次数的标示自增1
106                     m++;
107
108                     //递归。用于添加当前组的子组(如果有,则sb会添加,如果没有,该方法运行一下,进入当前层的下一次循环)
109                     handleSb(listGroups.get(i).getSysGroupId(), num);
110                 }
111
112             }
113         }
114
115     }

View Code

 

时间: 2024-09-28 05:00:14

html页面下拉列表中动态添加后台数据(格式化数据,显示出数据的层次感)的相关文章

Android viewpager中动态添加view并实现伪无限循环的方法_Android

本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里有一个需求,就是viewpager里面加载的页数不是确定的,而是根据数据的多少来确定的.常见的应用就是在一个新闻的详细页面中,显示与此新闻有关的图片. 下面我们来看一下代码: activity_main.xml <RelativeLayout xmlns:android="http://sch

Android viewpager中动态添加view并实现伪无限循环的方法

本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里有一个需求,就是viewpager里面加载的页数不是确定的,而是根据数据的多少来确定的.常见的应用就是在一个新闻的详细页面中,显示与此新闻有关的图片. 下面我们来看一下代码: activity_main.xml <RelativeLayout xmlns:android="http://sch

如何在水晶报表中动态添加字段

原文:如何在水晶报表中动态添加字段 问题:水晶报表中,因为数据源的字段是不固定的,可否在运行时动态添加字段,就象在winform中动态添加控件一样?(更新:2003-11-05)--------------------------------------解决方案:用"公式字段"1.根据字段的最大数量,定义若干个"公式字段",FormulaFeild1.FormulaFeild2--,公式为空:2.把"公式字段"按顺序放在"详细资料&qu

combox-C#或者DEV控件高手进,求助大神!呀,gridview中动态添加COMBOX后出现问题

问题描述 C#或者DEV控件高手进,求助大神!呀,gridview中动态添加COMBOX后出现问题 步骤1:我定义一个全局的COMBOX控件变量: 步骤1:我为GRIDVIEW动态添加了一列,将这一列设置我步骤1中的COMBOX: 步骤2:我为这个COMBOX添加click事件,在事件中我读取GRIDVIEW中的focusROW,读取某一列,判断该列的值来动态为COMBOX添加ITEM; 问题:在click事件中,每次都能正确的获取focusROW,也能为combox添加ITEM,但是就是COM

radio button-Android中动态添加RadioButton,设置监听获取的id不对啊!

问题描述 Android中动态添加RadioButton,设置监听获取的id不对啊! 这样获取的checkId不对啊! radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group int checkedId) { int id = (int) group.getChildAt(checkedId).getT

如何获取布局中动态添加的spinner的内容?

问题描述 如何获取布局中动态添加的spinner的内容? 现在有父布局LinearLayout id为payItemts 有子布局LinearLayout id为payItem 子布局payItem中包含一个id为accountName的spinner.一个id为payMoney的EditText 在activity中,通过有一个按钮btA,可以动态的往父布局中添加子布局,每点击一次,动态添加一个item 有一个btB,如何通过点击btB获取Activity中所有Spinner的内容?(spin

extjs4-请问如何在window中动态添加一个列表

问题描述 请问如何在window中动态添加一个列表 我现在要在window中动态的添加一个grid, 前面有一些逻辑判断, 请问各位当满足特定条件下如何能动态的添加一个grid在window中 解决方案 用createwindow函数 也可以事先添加好,但是设置为隐藏,然后直接显示

C#在dataGridView中动态添加一个combox

问题描述 急求大神!!我在dataGridVIew1的某一列中动态添加一个combox,然后出现下面的情况: 解决方案 解决方案二:publicComboBoxmycombo=newComboBox();//全局变量....form_load(...){mycombo.Name="mycombo";mycombo.Items.Clear();mycombo.Items.Add("三甲");mycombo.Items.Add("二甲");mycom

html-内容页中动态添加tabpanel 调用下面js函数没反应

问题描述 内容页中动态添加tabpanel 调用下面js函数没反应 <script type="text/javascript"> function addTab() { var tabs = $find("TabContainer1"); var tabPanel = tabs.TabPanel; tabPanel.add ( { title: "web1", closable: true, html: "Login.as