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屬性,名稱則沒有變。