关于Struts-JSON的提高开发效率

来源:互联网 发布:桌面特效软件 编辑:程序博客网 时间:2024/05/16 08:40

一、JSON是什么?

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

二 、struts2对于JSON有什么支持?

struts2提供了一个struts2-json-plugin.jar 用于支持JSON的使用。当我们在struts2中使用JSON的时候必须导入struts2-json-plugin.jar
并且需要一下几点:
1.<package name="struts2" extends="json-default">
       //必须是继承struts2-json-plugin.jar中struts-plugin.xml文件中的定义的json-default
       /*struts2-json-plugin.jar中struts-plugin.xml配置信息:
         <struts>
         <package name="json-default" extends="struts-default">
                           <result-types>
                            <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
                           </result-types>
                           <interceptors>
                          <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>                                       
 </interceptors>
           </package>
        </struts>

       通过配置信息我们可以知道
       1.json-default其实是继承了struts-default的
       2.定义了一个name为json的返回类型和一个name为json的拦截器*/
       2.<action name="*" class="*"><result name="success" type="json"/></action>//我们需要将result
         的 返回类型定义为json

三、关于JSON在struts.xml中的一些属性的功能。

<action name="*"  class="*">                <result name="success" type="json">     <param name=""></param>//关于对JSON的一些定义     /*excludeProperties   //代表排除Action中的哪些属性,排除多个属性时,使用逗号进行分隔(即不需要序列化的属性)    例:<param name="excludeProperties">age</param>  排除getAge()这个方法 为什么是排除这个方法下面详解                            includeProperties   //代表包含Action中的哪些属性,包含多个属性是,使用逗号进行分隔(即需要序列化的属性)    例:<param name="includeProperties">address</param>包含getAddress()这个方法 为什么是包含这个方法下面详解                           excludeNullProperties //代表排除Action中属性值为空的字段    例:<param name="excludeNullProperties">true</param> 使用true/false 默认为false(即包含属性值为null的字段)                          root  //代表从哪里开始序列化    例:<param name="root">person</param> person对应的可以是一个属性,也可以是一个对象,也可以是一个集合      //当在这里定义后,只会将person进行序列化,如果person是一个对象,则会将person对象中所有的getter方法都进行序列化                          注意:如果相同属性同时定义了excludeProperties和includeProperties         那么excludeProperties的优先级要高,因此不对     该属性进行序列化         */      </result>  </action> 

四、对于JSON的注解主要有一下几个属性可以定义
name:指定序列化的时候对应的名称
/*
   例:@JSON(name = "myname") 则在客户端接收到的JSON中UserName属性对应的地方为 :
                     {myname:"张三"} 以前的则是{username:"张三"}
     public String getUsername() {
return username;
     }
*/
serialize:对该方法进行序列化  true/false
/*
例:@JSON(serialize=true) 对该方法序列化,如果为false则不进行序列化
public String getUsername() {
return username;
}
*/
deserialize:不对该方法进行序列化  true/false
/*
例:@JSON(deserialize=true) 不对该方法序列化,如果为false则进行序列化
public String getUsername() {
return username;
}
*/
format:设置JSON对该方法的转换方式,一般用于对时间进行转换 
/*
例:@JSON(format="yyyy-MM-dd")  则客户端接收的JSON中date对应的值为:
                                              {date:"2011-10-2"}
public Date getDate() {
return date;
}
*/关于JSON在Action对象中注解的使用。

五、具体的实例:

<pre name="code" class="java">package com.lxs.test.newstudent.action;import java.util.Date;import org.apache.struts2.json.annotations.JSON;import org.springframework.beans.factory.annotation.Autowired;import com.lxs.test.core.action.BaseAction;import com.lxs.test.newstudent.dao.po.Student;import com.lxs.test.newstudent.service.IStudentService;public class StudentAction extends BaseAction{ /**  * @Fields serialVersionUID : TODO  */private static final long serialVersionUID = 1L;@Autowiredprivate IStudentService iStudentService;private String username;      private String password;      private int age;      private Date date;      @JSON(serialize = true)      public String getUsername() {          return username;      }      public void setUsername(String username) {          this.username = username;          }            @JSON(name="mypassword")      public String getPassword() {          return password;      }      public void setPassword(String password) {          this.password = password;      }      @JSON(serialize = false)      public int getAge() {          return age;      }      public void setAge(int age) {          this.age = age;      }            @JSON(format="yyyy-MM-dd")      public Date getDate() {          return date;      }      public void setDate(Date date) {          this.date = date;      }      @Override      public String execute() throws Exception {          this.setDate(new Date());          this.setAge(10);          this.setPassword("world");          this.setUsername("hello");          return SUCCESS;      } }


struts.xml
<struts>      <package name="struts2"  extends="json-default">      //这里一定要继承json-default          <action name="getjsons" class="org.svse.action.GetJsonAction">              <result name="success"  type="json">              //这里一定要定义type属性为json                  <param name="excludeProperties">age</param>                   //排除getAge()方法                        </result>          </action>        </package>  </struts> 

JSP:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>      <head>          <script type="text/javascript" src="WEB-JS/jquery-1.5.1.js"></script>   //使用jquery一定要导入js                            <script type="text/javascript"> //使用jquery实现异步提交                      function getJson() {                          $.post(                              "/struts2/getjsons.action",{},function(returnedData,status)                              {                                  if("success"==status)                                  {                                      alert(returnedData);                                  }                              }                          )                      }                  </script>      </head>      <body id="theBody">          <input type="button" value="GetJson" onclick="getJson();">        </body>  </html>  

得到的结果为:{"date":"2011-03-21","mypassword":"world"} 

//使用浏览器的bug工具查看 alert(returnedData);弹出来的只是 [object,Object]
//这里我们可以看见password的名称已经改为mypassword了 而设定那么的data属性,名称则没有变

以上文章转载自点击打开链接

这里我贴一下过程中遇到的一个错误,其实整个过程也是照着上面执行的,只是我在Action自动生成了request的Get、Set方法,问题就出在Get方法上。返回的JSON对象也将这个Get方法当作类实体的属性来返回。解决的办法是1.去掉get()方法。2.在get()方法上面加上@JSON("serialize=true")或者是在struts.xml的<param name="includeProperties">get方法属性</param>意思就是将该方法放进json管理起来
0 0
原创粉丝点击