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);
}
}
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));
}
}
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)); //输出时出现死循环问题
}
}
解决方案:
1): 将双向绑定改成单向绑定 (将彼此之间的关系交予一方维护)
2):用 @JsonIgnore/程序控制一个属性
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>
收货地址
<select id="province">
<option selected="selected">---请选择省份---</option>
</select>
<select id="city">
<option selected="selected">---请选择城市---</option>
</select>
<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"
});
});
})