1. 程式人生 > >Struts2——對JSON的支援(struts2-json-plugin.jar )

Struts2——對JSON的支援(struts2-json-plugin.jar )

一、struts2對於JSON支援

  struts2提供了一個struts2-json-plugin.jar 用於支援JSON的使用。當我們在struts2中使用JSON的時候必須匯入struts2-json-plugin.jar

並且需要一下幾點:

  • struts2-json-plugin.jar中struts-plugin.xml配置資訊:

    需要轉換json的struts.xml檔案,其攔截器所在包必須繼承json-default

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<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"/>
<interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/> <!-- Sample JSON validation stack --> <interceptor-stack name="jsonValidationWorkflowStack"> <interceptor-ref
name="basicStack"/>
<interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel</param> </interceptor-ref> <interceptor-ref name="jsonValidation"/> <interceptor-ref name="workflow"/> </interceptor-stack> </interceptors> </package> </struts>
  • 通過配置資訊我們可以知道:
    1.json-default其實是繼承了struts-default的
    2.定義了一個name為json的返回型別和一個name為json的攔截器
    3.我們需要將包繼承json-default,相應的result返回型別定義為json
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <package name="system" namespace="/system" extends="json-default">
        <action name="elecUserAction_*" class="elecUserAction" method="{1}">

            <!-- 如果List集合轉換成json陣列,如果是Object物件轉換成json物件-->
            <result name="findJctUnit" type="json">
                <!-- \[\d+\]\ 表示多個集合陣列 -->
                <param name="includeProperties">\[\d+\]\.ddlCode,\[\d+\]\.ddlName</param>
            </result>

            <result name="checkUser" type="json">
                <!-- root表示,root指定message就表示查詢棧頂中是否有message屬性,如果有直接通過message的get方法,獲取值放置到棧頂 -->
                <param name="root">message</param>-->
                <param name="includeProperties">message</param> 
            </result>       

        </action>
    </package>
</struts>

二、關於JSON在struts.xml中的一些屬性的功能

  • excludeProperties

      代表排除Action中的哪些屬性,排除多個屬性時,使用逗號進行分隔(即不需要序列化的屬性)
例:<param name="excludeProperties">age</param>排除getAge()這個方法

  • includeProperties

      代表包含Action中的哪些屬性,包含多個屬性:使用逗號進行分隔(即需要序列化的屬性)
例:address包含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的優先順序要高,因此不對該屬性進行序列化

三、關於JSON在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;
 }

四、具體的例項:

  • Action:
package org.viancent.action;  

import java.util.Date;  
import org.apache.struts2.json.annotations.JSON;  
import com.opensymphony.xwork2.ActionSupport;  

public class GetJsonAction extends ActionSupport {  
   private String username;  
   private String password;  
   private int age;  
   private Date date;  

   @JSON(serialize = false)  
   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;  
   }  

   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>  
    //這裡一定要繼承json-default 
    <package name="struts2"  extends="json-default">  
        <action name="getjsons" class="org.viancent.action.GetJsonAction">  
            //這裡一定要定義type屬性為json 
            <result name="success"  type="json">   
                //排除getAge()方法 
                <param name="excludeProperties">age</param>                  
            </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>   
        <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屬性,名稱則沒有變。