针对《struts-hibernate-ajax完成区县和街道级联下拉框功能》进行补充,上一篇中,要在action中拼接JSON格式字符串,很容易手抖。直接用json处理一下转成json格式字符串即可。但之前也讲过,json对于hibernate级联关系的解析,不是很到位啊!
所以ajax那边就得层层循环剥离,找出想要的结果
action:
用的是
import com.alibaba.fastjson.JSON;
具体的jar包请自行百度!!
public String getStreets(){StreetDao streetDao=new StreetDaoImpl();try {streetlist = streetDao.getStreetsByDistrictId(Integer.parseInt(district_id));/*System.out.println("district_id=="+district_id);System.out.println(streetlist.size());*/String content = JSON.toJSONString(streetlist);/*ObjectMapper mapper = new ObjectMapper();String content = mapper.writeValueAsString(streetlist);*/HttpServletResponse response = (HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE); response.setCharacterEncoding("utf-8");System.out.println("array======="+content);response.getWriter().print(content); } catch (Exception e) {e.printStackTrace();}return null;}
action只是小小的改动,但语法简单了很多。
出来的json结果是:
array=======[{"district":{"id":1,"name":"天河区","streets":[{"district":{"$ref":"$[0].district"},"id":4,"name":"天河区街道4"},{"district":{"$ref":"$[0].district"},"id":2,"name":"天河区街道2"},{"$ref":"$[0]"},{"district":{"$ref":"$[0].district"},"id":3,"name":"天河区街道3"}]},"id":1,"name":"天河区街道1"},{"$ref":"$[0].district.streets[1]"},{"$ref":"$[0].district.streets[3]"},{"$ref":"$[0].district.streets[0]"}]
看上去真是头疼,即使json格式清晰要想取streets的id和name也不很规律啊,我用了firefox的hj插件JSON-Handle格式化了一下控制台的json字符串
[{"district": {"id": 1,"name": "天河区","streets": [{"district": {"$ref": "$[0].district"},"id": 4,"name": "天河区街道4"},{"district": {"$ref": "$[0].district"},"id": 2,"name": "天河区街道2"},{"$ref": "$[0]"},{"district": {"$ref": "$[0].district"},"id": 3,"name": "天河区街道3"}]},"id": 1,"name": "天河区街道1"},{"$ref": "$[0].district.streets[1]"},{"$ref": "$[0].district.streets[3]"},{"$ref": "$[0].district.streets[0]"}
]
那么ajax怎么获取街道呢?
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script><script type="text/javascript">$(document).ready(function(){$("#district_id").change(function(){var district_id = $("#district_id").val();var url="<%=request.getContextPath()%>/streetlist";$.ajax({url:url,type:'post',timeout:60000,data:{"district_id":district_id},dataType:'json',success:function(data){var $street_id = $("#street_id");var $option =[];$street_id.empty();//循环整个json大数组$.each(data,function(index,item){//找出第一级的街道IDif(item.id != '' && item.id !==undefined){$option.push("<option value='"+item.id+"'>"+item.name+"</option>");}//级联关系下的街道ID$.each(item.district.streets,function(inx,im){if(im.id!='' &&im.id !==undefined){$option.push("<option value='"+im.id+"'>"+im.name+"</option>");}});$street_id.append($option);});option.push("");},error:function(){alert("查询失败,请联系管理员");},});});});</script>
好吧,我也是一点点试的!不行就每一步alert呗!