Ajax局部刷新--用“省”动态的选择“市”

在前端我们经常会使用到这样一种情况,选择一个省,然后再选择这个省底下的某个市,类似于这样的先选择一个范围,然后再在这个范围内再次精确的选择。这里一般使用异步刷新,也就是页面的局部刷新而不是整个页面刷新,因此需要使用到AJAX技术。下来我以修改个人信息的时候选择省和市为例,说一说我是如何做的(不对的地方,希望您指正):

首先打开修改信息页面(edit.jsp)时,后台将省的集合province(list集合)放在request中,前台使用EL表达式循环输出,形成下拉选择框。如下代码所示:

<select style="width: 80px;"name="province" id="province" οnclick="empty()">

<option>省</option>

<c:forEach items="${provinces }" var="province">

<option value="${province.dictContent }" name="province">${province.dictContent }</option>

</c:forEach>

</select> <select style="width: 100px;" name="city" id="city1">

<option id="city2">市</option></select>

正如所看到的,一般情况下,都是使用select选择框,下面的具体选择则是select内部的option,因此将集合在option这里使用EL表达式循环集合,实现后台查询,前台显示。

上面只是第一步,选择”省”,这一步是随着页面的打开进行的,并无难度,上面提到的异步刷新是针对市来说的,也就是选择一个省,然后将省的信息提交到后台,后台调用数据库查询该省下面的所有市的集合city(list集合),返回给前台,然后前台遍历显示。

这里需要用到ajax代码,如下所示:

       $(document)    .ready(

                      function() {                       

                      $('#province').click(    function() {

                      $.ajax({

              url : "http://localhost:8888/JavaEEProjectLoveFive/city.action",

                      type : "post",

                      dataType : "json",

                      data : {

                      "province" : $('#province').val(),

                      },

                      success : function(tip) {

                             var i=0;

                            var stateObj= document.getElementById("city1");

                             for (i=0;i<tip.length;i++){

                                                 var newOption = new Option(tip[i].city,tip[i].city);

                                                 stateObj.options.add(newOption);

                      }

                      }

                     });

                     });

              });

                            function empty(){

                                   $("#city1").empty();   

                            }     

没错,是在ajax代码中进行“市”的循环遍历输出,方法是先获得“市”所在的select对象Obj,然后使用循环声明新的Option对象,其有两个参数,(txt,value),将市的集合的某一个值赋给这个新的option,然后使用Obj.options.add(Option),将这个新的option添加入市的select对象,这样就实现了前台选择省,市随着动态显示的目的了。

此外,后面的empty()函数,是为了每次重新选择省时让上市下面的内容清空,以便于新的市显示。上面代码我写的是每选择一个省(由于页面没有刷新,因此edit.jsp加载的时候传递过来的省的集合一直有效,因此可以选择不同的省)时就调用这个empty()方法,以用来清空市select下面的内容。

 

以上是前段代码,下面我们来看后端代码,这里只说将省传递到后台然后后台查询数据库将“市”集合再传递给前台的这部分代码。

//拿到前台传递来的省的信息

String province = request.getParameter("province");

              if (!province.equals("省")) {

                     //使用前台的省信息查询相应的市的集合

                     List<Dict> citys = dictBiz.getCity(province, "");

                     //初始化一个json数据类型的集合

                     JSONArray jsonArray = new JSONArray();

                     //遍历市集合

                     for (Dict dict : citys) {

                            //初始化一个JSONObject对象

                            JSONObject jsonObject = new JSONObject();

                            //将一个市的信息放进刚声明的JSONObject对象内

                            jsonObject.put("city", dict.getDictContent());

                     //往声明的JSONArray集合内添加一个JSONObjest对象

                            jsonArray.add(jsonObject);

                            System.out.println(dict);

                     }

                     System.out.println(jsonArray);

                     try {

                     //将JSONArray集合传递给前台

                            response.getWriter().print(jsonArray);

                     } catch (IOException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                     }

              }

以上就是代码,需要注意的是JSON数据类型,踏实一种k-v形式的键值对格式,小白的我也是了解的皮毛,因此需要详细了解的请自行百度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值