1.什么是Jackson?
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象
和xml文档,同样也可以将json、xml转换成Java对象
2. jackson将java( JavaBean/Map)-->json
javaBean(实体类)与map集合转换成字符串格式都是一样的:
里面的核心代码:
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(obj);(由这个来使Java变成json的体现格式)
//实体类
//对象
Student stu1=new Student("o1", "lisi", null);
ObjectMapper objectMap=new ObjectMapper();//核心词
System.out.println(objectMap.writeValueAsString(stu1));//把stu转换成json体现形式
//数组
Student stu2=new Student("o2", "wangwu", null);
List<Student> list=new ArrayList<>();
list.add(stu1);
list.add(stu2);
System.out.println(objectMap.writeValueAsString(list));
//混合
Map<String,Object> map=new HashMap<String, Object>();
map.put("tid","1");
map.put("str",list);
System.out.println(objectMap.writeValueAsString(map));
System.out.println("----------------");
//map集合
//对象
Map<String,Object> map2=new HashMap<>();
map2.put("sid","o1");
map2.put("sname","lisi");
System.out.println(objectMap.writeValueAsString(map2));//把map转换成json体现形式
//数组
List<Map<String,Object>> list2=new ArrayList<>();
Map<String,Object> map3=new HashMap<>();
map3.put("sid","o2");
map3.put("sname","wangwu");
list2.add(map2);
list2.add(map3);
System.out.println(objectMap.writeValueAsString(list2));
//混合
Map<String,Object> map4=new HashMap<String, Object>();
map4.put("tid","2");
map4.put("str",list2);
System.out.println(objectMap.writeValueAsString(map4));
结果如下:不管是JavaBean还是Map的三种转换格式都是一样的。
{"sid":"o1","sname":"lisi","set":null}
[{"sid":"o1","sname":"lisi","set":null},{"sid":"o2","sname":"wangwu","set":null}]
{"str":[{"sid":"o1","sname":"lisi","set":null},{"sid":"o2","sname":"wangwu","set":null}],"tid":"1"}
----------------
{"sname":"lisi","sid":"o1"}
[{"sname":"lisi","sid":"o1"},{"sname":"wangwu","sid":"o2"}]
{"str":[{"sname":"lisi","sid":"o1"},{"sname":"wangwu","sid":"o2"}],"tid":"2"}
3.java->json死循环
解决方法:
3. 1. 忽略双向关联的一个方向即可
Student stu1=new Student("o1", "lisi", null);
// Student stu2=new Student("o2", "wangwu", null);
// Teacher te1=new Teacher("1", "小哥", null);
// Teacher te2=new Teacher("2", "袁哥", null);
// Set<Teacher> set1=new HashSet<>();
// set1.add(te1);
// set1.add(te2);
// stu1.setSet(set1);//一个学生里装两个老师
// Set<Student> set2=new HashSet<>();
// set2.add(stu1);
// set2.add(stu2);
// te1.setSet(set2);//一个老师里有两个学生(两边互相调用会进行死循环)
// System.out.println(objectMap.writeValueAsString(stu1));//输出会出现栈异常
3. 2. 用 @JsonIgnore/程序控制一个属性
private String tid;
private String tname;
@JsonIgnore//这个类上面加这个符号
private Set<Student> set=new TreeSet<>();
4.jQuery的ajax请求(与后台进行交互)
首先通过增强JsonBasedao来写那个dao方法 一个查询方法 然后在dao方法继承他 来进行对应的SQL处理 再通过servlet配置调用 之后就通过jsp页面访问
//获取数据源rs.getMetaData() rs所有属性
ResultSetMetaData md = rs.getMetaData();关键字
//拿到它的count 多少列(sid,sname......)
int count = md.getColumnCount();
@Override
public List<Map<String,Object>> fore(ResultSet rs) throws SQLException, InstantiationException, IllegalAccessException {
// TODO Auto-generated method stub
List<Map<String,Object>> list=new ArrayList<>();
//获取数据源rs.getMetaData() rs所有属性
ResultSetMetaData md = rs.getMetaData();
//拿到它的count 多少列
int count = md.getColumnCount();
Map<String,Object> map=null;
while(rs.next()) {
map=new HashMap<String, Object>();
//循环
for (int i = 1; i <=count; i++) {
//拿到每一个i的列名 后面是所有不同类型的值
map.put(md.getColumnName(i),rs.getObject(i));
}
list.add(map);
}
return list;
}
});
public List<Map<String, Object>> list(Map<String,String[]> par,PageBean page) throws InstantiationException, IllegalAccessException, SQLException{
String id = JsonUtil.getParam(par,"ID");//通过专门处理类调用方法处理数组结果集
String sql="select * from t_address where true";
if(StringUtils.isBlank(id)) {
sql+=" and parent_id=7459";
}else {
sql+=" and parent_id="+id;
}
return super.execute(sql, page);
}
专门用来处理json数据的工具包
* 从par拿到自己所需要用的查询维度 用来sql语句拼接
* @param par 获取从jsp页面传过来到后台的参数集合req.getparmMap
* @param key 某一个键
* @return
*/
public static String getParam(Map<String,String[]> par,String key) {
if(par!=null && par.size()!=0) {
//拿到一个键的值
String[] var = par.get(key);
if(var!=null && var.length>0) {
//把它变成一个String数组[1,2,3]
String val = Arrays.toString(var);
//截取从数组第一个字到最后一个括号 -1去除后面括号
return val.substring(1,val.length()-1);
}
return "";
}
return "";
}
jsp页面可直接调用那个js里面写的Ajax代码就能直接展现
这是一个三级联动的js 首先是程序入口 然后调用Ajax直接去掉那个url刷新 当点击一个值会进行局部刷新
$(function(){
var i=$("#hi").val();
$.ajax({
url:i+"/add",//url拿到那个servlet里的方法对象
success:function(data){//这里是字符串所有的属性值
for(index in data){//遍历每一个 拿到这个id拼接他的option
$("#province").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
}
},
dataType:"json"//把类型变成json类型对象object
});
$("#province").change(function(){
//当执行改变他的值的时候其他的要清空上次的内容 不然会叠加
//属于这个option里第一位后面的全部remove
$("option:gt(0)","#city").remove();
$("option:gt(0)","#county").remove();
$.ajax({//再发一次Ajax请求过去拿到这个id的所有option
url:i+"/add?ID="+this.value,//url拿到那个servlet里的方法对象
success:function(data){//这里是字符串所有的属性值
for(index in data){
$("#city").append("<option value='"+data[index].ID+"'>"+data[index].REGION_NAME+"</option>");
}
},
dataType:"json"//把类型变成json类型对象object
});
});