jQuery中ajax的使用

java 下常见的json类库都有Gson,JSON_lib 和 jackson等,但 jackson相对来说比较高效,在项目中主要也是使用jackson进行json和Java对象转换;

那么什么是jackson呢  ?

  1):Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象
   和xml文档,同样也可以将json、xml转换成Java对象

     1.1):Java对象转成json字符串

package com.damei.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Temp1 {

	public static void main(String[] args) throws JsonProcessingException {
		/*
		 * ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,
		 */
		ObjectMapper oMapper = new ObjectMapper();
		
		//json对象
		Student student1 = new Student("s001","黄");
		Student student2 = new Student("s002","黄圆");
		/*
		 * oMapper.writeValueAsString将Java对象转成json字符串
		 */
		System.out.println(oMapper.writeValueAsString(student1));
		
		//json数组
		List<Student> listStu = new ArrayList<Student>();
		
		listStu.add(student1);
		listStu.add(student2);
		
		String writeValueAsString = oMapper.writeValueAsString(listStu);
		
		System.out.println(writeValueAsString);
		
		
		//json混合
		Map<String, Object> map = new HashMap<>();
		
		map.put("hello",6);
		
		map.put("studentS", listStu);
		
		String writeValueAsString2 = oMapper.writeValueAsString(map);
		
		System.out.println(writeValueAsString2);
	}
}

d

1.2):javaBean 与 map 集合转换成json字符串是一样的   

package com.damei.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * javaBean 与 map 集合转换成json字符串是一样的
 * @author Administrator
 *
 */
public class Temp3 {

	public static void main(String[] args) throws JsonProcessingException {
		//对象
		Map<String, Object> map1 = new HashMap<>();
		
		map1.put("sid","s001");
		
		map1.put("sname", "胡");
		
		ObjectMapper mapper = new ObjectMapper();
		
		System.out.println(mapper.writeValueAsString(map1));
		
		Map<String, Object> map2 = new HashMap<>();
		 
        map2.put("sid","s002");
		
		map2.put("sname", "胡2");
		
		//数组
		List<Map<String,Object>> list1 = new ArrayList<>();
		
		list1.add(map1);
		
		list1.add(map2);
		
		System.out.println(mapper.writeValueAsString(list1));
		
		//混合
		Map<String, Object> map3 = new HashMap<>();
		
		map3.put("hello", 521);
		
		map3.put("Student", list1);
		
		System.out.println(mapper.writeValueAsString(map3));
	}
}

cc

1.3):讲解 json 双向绑值 死循环     

package com.damei.entity;

import java.util.HashSet;
import java.util.Set;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * 讲解 json 双向绑值 死循环     
 * @author Administrator
 *
 */
public class Temp2 {

	public static void main(String[] args) throws JsonProcessingException {
		Student student1 = new Student("s001","胡");
		
		Student student2 = new Student("s002","H Y Y");
		
		Teacher teacher1 = new Teacher("t001", "嗯哈1", null);
		
		Teacher teacher2 = new Teacher("t002", "嗯哼2", null);
		
		Set<Teacher> teachers = new HashSet<>();
		
		teachers.add(teacher1);
		
		teachers.add(teacher2);
		
		student1.setSetT(teachers);    //一个学生装着两个老师
		
		Set<Student> students = new HashSet<>();
		
		students.add(student1);
		
		students.add(student2);
		
		teacher2.setSetS(students);    //一个老师里有两个学生(两边互相调用会进行死循环)


		ObjectMapper oMapper = new ObjectMapper();
		
		System.out.println(oMapper.writeValueAsString(student1));  //输出时出现死循环问题
		
	}
}

z

解决方案: 
  1): 将双向绑定改成单向绑定   (将彼此之间的关系交予一方维护)

  2):用 @JsonIgnore/程序控制一个属性 

z

 jQuery的ajax请求(与后台进行交互)

首先我们写一个JsonBasedao来写那个dao方法  一个查询方法  然后在dao方法继承JsonBasedao 来进行对应的SQL语句处理  再通过servlet配置调用  之后就通过jsp页面访问


			public List<Map<String, Object>> foreach(ResultSet rs) throws InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, SQLException{
			/*
			 * 创建一个实体类的实列
			 * 给创建的实体类属性赋值
			 * 将添加完成的实体类加到list集合里面去
			 */
			List<Map<String, Object>> list=new ArrayList<>();
			//获取原数据
			ResultSetMetaData metaData = rs.getMetaData();
			//获取列
			int columnCount = metaData.getColumnCount();
			Map<String, Object> map = null;
			while(rs.next()) {
				map = new HashMap<>();
				for (int i = 1; i < columnCount; i++) {
					//拿到 数据库里面每个列名下的不同值
					map.put(metaData.getColumnName(i), rs.getObject(i));
				}
				//将map集合里面的值加到list容器里去
				list.add(map);
			}
			//返回list
			return list;
		}
public class JsonUtitls {

	/** 用来处理json数据
	 * 在这里面拿到我们所需要用到的查询维度   用于sql语句拼接
	 * @param pareMap   获取从jsp页面传递到后台的参数集合
	 * @param key    值     
	 * @return
	 */
	public static String getPareMap(Map<String,String[]> pareMap,String key) {
		if(pareMap != null && pareMap.size()>0) {
			String[] values = pareMap.get(key);
			if(values != null && values.length>0) {
				String value = Arrays.toString(values);
				return value.substring(1, value.length()-1);
			}
			return "";
		}
		return "";
	}

public class RegionDao extends RegionBaesDao{

	/**
	 * 用来查询方法
	 * @throws SQLException 
	 * @throws InstantiationException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 */
	public List<Map<String, Object>> findAll(Map<String,String[]> pareMap,PageBean pageBean) throws IllegalArgumentException, IllegalAccessException, InstantiationException, SQLException{
		String id = JsonUtitls.getPareMap(pareMap, "ID");
		String sql = "select * from ch_region where true";
		if(StringUtils.isBlank(id)) {
			sql += " and parent_id=7459";
		}else {
			sql += " and parent_id="+id;
		}
		return super.ExecuteQuery(sql, null);
	}
	

jsp页面可直接调用自己写的js里面Ajax代码就能直接获取

 自己写的一个function程序入口 然后调用Ajax直接去掉那个url刷新 当点击一个值会进行局部刷新 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/easy/jquery.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/easy/ajax.js"></script>
<title>Insert title here</title>
</head>
<body>
<div>
<!-- 传一个全限类名id过去 -->
<input type="hidden" id="ctx" value="${pageContext.request.contextPath}"/>
	
	<div>
		收货地址&nbsp;&nbsp;
		<select id="province">
			<option selected="selected">---请选择省份---</option>
		</select>&nbsp;&nbsp;
		<select id="city">
			<option selected="selected">---请选择城市---</option>
		</select>&nbsp;&nbsp;
		<select id="county">
			<option selected="selected">---请选择县区---</option>
		</select>
	</div>
</div>
</body>
</html>
$(function(){
	var c = $("#ctx").val();  //获取页面传过来的隐藏id
	
	$.ajax({
		url:c+"/regionServlet",   //获取到servlet里面方法对象
	    success:function(data){   //请求成功后的回调函数
	    	for(index in data){   //遍历每一个值  
//	    		console.log(data[index]);
	    		$("#province ").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
	    	}
	    },
	    dataType:"json"         //把类型变成json类型对象object

	});
	
	$("#province").change(function(){     //获取省份的id并且加上change事件
		$("option:gt(0)","#city").remove();   //当执行改变他的值的时候其他的要清空上次的内容 不然会叠加
		$("option:gt(0)","#county").remove();  //属于这个option里第一位后面的全部移除
		$.ajax({                                   //再发一次ajax请求过去拿到这个id的所有option
			url:c+"/regionServlet?ID="+this.value,
		    success:function(data){
		    	for(index in data){
//		    		console.log(data[index]);
		    		$("#city ").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
		    	}
		    },
		    dataType:"json"
		});
	});
	
	$("#city").change(function(){
		$("option:gt(0)","#county").remove();
		
		$.ajax({
			url:c+"/regionServlet?ID="+this.value,
		    success:function(data){
		    	for(index in data){
		    		console.log(data[index]);
		    		$("#county").append("<option value='"+data[index].PARENT_ID+"'>"+data[index].REGION_NAME+"</option>");
		    	}
		    },
		    dataType:"json"
		});
	});
	
})

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值