首先,struts2对json是有支持的,听到“有支持”,我们应该就有点小放心了。就比如你在服装店看中了一件很拉风,很体现你的气质的衣服,在去结账的时候,当看到收银台有“银联”标记,表示对刷卡消费“支持”,你就只需要用卡一刷,提衣服走人。否则的话可能现金还不够,需要去取款机去取现金,再回来结账。多麻烦是吧。

无刷新技术不妨简化为从客户端到服务器端和从服务器端到客户端。

使用jquery的$.post(url,{json格式的传输数据},function(data){对返回结果进行处理});

struts2使用Action代替了servlet,所以先架起struts2+json的框架及包支持:

 

以及web.xml文件中增加对struts2的支持:

 

再简单的写一个struts.xml配置文件:

 

从客户端到服务器端:

记得最开始学ajax的时候,使用json格式传回数据时,采用的依然是


  
  1. var result = XmlHttpRequest.responseText; 

可以看出,json格式传回来是用文本Text的方式传回的,只是需要用eval()方法执行,把文本转换成json对象,所以,笔者认为json传输的实质还是一个符合json语法规则的字符串,而jquery的ajax对返回的字符串进行了封装转换,不再需要我们自己手动eval()去转换成json对象了。

客户端代码:


  
  1. $.post('json.action',{'username':'张三'},function(data){    
  2. //data是返回来的数据,是一个json对象  
  3. //可以通过alert(typeof data);查看其类型,是object  
  4.  alert(data.username+"  ,  "+data.password);       
  5.  }); 

 

jquery还提供了$.get(url,{要传过去的json格式的参数},callback)这种get提交方式,语法给你post提交是一样的,只是底层的提交方式不同。

从服务器端到客户端:

 前面讲到了struts2对json的支持,体现在哪方面呢?

首先,看看Action中是怎么写的:


  
  1. private String username;  
  2. private String password;  
  3. public String execute(){  
  4.     System.out.println("username====="+username);  
  5.     System.out.println("password====="+password);  
  6.     username="李四";  
  7.     password="11111";  
  8.     return "success";  
  9. }  
  10. public void setUsername(String username){  
  11.     this.username = username;  
  12. }  
  13.       
  14. @JSON(serialize=true)  
  15. public String getUsername() {  
  16.     return username;  
  17. }  
  18. public String getPassword() {  
  19.     return password;  

一个username和password属性以及其set和get方法。然后一个返回值为String的执行方法。

其中set是服务器端用来接收从客户端传过来的属性的方法,get方法是客户端用来接收服务器端的属性的方法。其底层是用序列化来实现的。

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

所以,一般的都加上属性的set和get方法。

有get方法的属性会被序列化,即可以通过json传输。控制属性序列化有有两种方式:

1、使用注解方式

JSON的注解是@JSON,共有4个属性分别是:
① name    String 类型     用户为属性起一个别名(我们序列化到JSON对象中的键默认是属性名称,如果使用了name属性那么键是name起的名字)
② serialize  Boolean类型   默认为true 也就是可以被序列化,如果设为false那么该属性将不包含在JSON对象中
③ format  String类型  主要是对日期进行格式化
④ deserialize Boolean类型 默认为true,它是指反序列化,和serialize相反。

所以,如果想某个属性不被序列化,则在其get方法上加上“@JSON(serialize=false)”即可

2、使用struts.xml配置文件方式

 

这个不赘述了,引用一个博客  隔叶黄莺  ,讲的比较详细。