ajax(2)

来源:互联网 发布:linux cpuinfo 编辑:程序博客网 时间:2024/06/06 01:10
1.json  本质:字符串,具有特定的描述规格
  json串的描述规格:
  *java:new User(1,"c35",true); new User(2,"c36",false)
   json:{"id":1,"name":"c35","gender":true} -- {"id":2,"name":"c36","gender":false}
  *java:String[]{"c35","c36","c37"};  Object[]{123,true,"c35"}
   json:["c35","c36","c37"] --   [123,true,"c35"]
  *java:Map-->【name:"c35",age:18,gender:true】  
   json:{"name":"c35","age":18,"gender":true}
  *java:List<object>【123,"c35",Map【name:"c35",age:18,gender:true】 】
   json:[123,"c35",{"name":"c35","age":18,"gender":true}]
  class User{
id
name
gender
  }
======================================================================================
2.ajax中json的使用思路:
  目的:在服务器和客户端之间有更大的数据量的通信
  1.在服务器端将java对象转换成json:
gson.jar:java-->json
//通过gson.jar的支持将java对象user转换成json
GsonBuilder gsonB=new GsonBuilder();
Gson gson=gsonB.create();
//利用gson将java-->json
String jsonStr=gson.toJson(user);
  2.在客户端解析json,从中获取数据
    jquery:$.parseJson(json);
var a='[{"id":1,"name":"c35","age":18},"c35",true,123]';
var aObj=$.parseJSON(a);//[{"id":1,"name":"c35","age":18},"c35",true,123]
aObj[0].id;
aObj[0].name;
aObj[2];

   数据通信载体:
   json:轻便   可读性较差
   xml:重  可读性好
      <user>
<id name="xxx">35</id>
<name>c35</name>
<gender>true</gender>
 </user>
======================================================================================
3.ajax流程简化
  $.ajax({
type:"post",
url:"${pageContext.request.contextPath}/cascade35",
data:"sheng="+$("#s>option:selected").val(),
success:function(ret35){//服务器的响应值
//清空
$("#city").empty();
for(var i=0;i<ret35.length;i++){
$("#city").append("<option>"+ret35[i]+"</option>");
}
},
dataType:"json"//指明返回为json,则ajax方法会自动解析响应值
  });
  $.get("${pageContext.request.contextPath}/cascade35",
{sheng:$("#s>option:selected").val()},
function(ret35){//ret35:响应值
//清空
$("#city").empty();
for(var i=0;i<ret35.length;i++){
$("#city").append("<option>"+ret35[i]+"</option>");
}
   },
"json"
  );
  $.post("${pageContext.request.contextPath}/cascade35",
 {sheng:$("#s>option:selected").val()},
 function(ret35){//ret35:响应值
//清空
$("#city").empty();
for(var i=0;i<ret35.length;i++){
$("#city").append("<option>"+ret35[i]+"</option>");
}
 },
 "json"
  );
=====================================================================================
4.ajax跨域
  协议:主机:端口  域的唯一标示
  http://127.0.0.1:8989    project1  发起ajax请求,请求project2
  http://127.0.0.1:9090    project2  
  http://192.168.1.123:9090
  情景:
 http://localhost:8989   ajax1  发起ajax请求 请求ajax2
 http://localhost:9999   ajax2
      需要在ajax2中为ajax1添加访问权限:
   //为ajax1增设访问权限
res.addHeader("Access-Control-Allow-Origin","http://localhost:8989");
=====================================================================================
5.json回环问题解决:在将java对象转换json时,出现的死循环现象
  class User{
int id;
String name;
Address address;
  }
  class Address{
int id;
String city;
User user;
  }
  User user=new User(1,"c35");
  Address addr=new Address(1,"bj");
  user.setAddress(addr);
  addr.setUser(user);
  
  Gson gson;
  gson.toJson(user);==>{"id":1,"name":"c35","address":{"id":1,"city":"bj","user":{}}}
  gson.toJson(addr);==>{"id":1,"city":"bj","user":{"id":1,"name":"c35","address":{}}}
  
  *5.1 解决方案一:排除策略:
GsonBuilder gsonB=new GsonBuilder().setExclusionStrategies(new ExclusionStrategy(){
//指定要排除的属性
public boolean shouldSkipField(FieldAttributes field) {
//获取当前要序列化到json串中的属性名
String name=field.getName();
if("user".equals(name)){
return true;//排除此属性
}
return false;
}

public boolean shouldSkipClass(Class<?> arg0) {
// TODO Auto-generated method stub
return false;
}
});
Gson gson=gsonB.create();
  *5.2 解决方案二:expose策略,指定哪些属性参加json的生成
       *在参加json生成的属性前,添加Expose注解:
public class Address {
@Expose
private Integer id;
@Expose
private String city;
...
  *创建Gson对象:
GsonBuilder gsonB=new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
Gson gson=gsonB.create();
=====================================================================================

0 0