json是一種輕量級的傳輸格式, 是javascript源生的傳輸數據的格式,最簡單的json格式:
{"key":"value"} 鍵和值之間用冒號分隔
個人覺得json中最小的單元就是{"key":"value"},它可以組合成許多複雜的結構,json有兩種結構:
1、key/value對的集合,就像上面最簡單的例子一樣,在許多不同的語言中,這種結構被理解爲 對象(object)、記錄(record)、結構(struct)、哈希表(HashTable)等,在java web開發中,常用到的model層模型就是這種結構的,比如一個對象裏面有許多屬性,屬性的名字就相當於key,屬性的值就是value
2、值的有序列表——數組
如果有多個key/value對,他們之間用逗號分隔
{"key0":"value0","key1":"value1","key2":"value2"}
複雜結構:
{
"students":[{"key0":"value0"},{"key1":"value1"}],
"teachers":[{"firstName":"阿坤"},{"123":"456"}],
"worker":[{"key1":{"name":"value1"}},{"key2":"value2"},{"key3":"value3"}]
}
使用方法: students[0].key0 得到字符串value0 teachers[1].123 得到字符串456 worker[0].key1.name 得到字符串value1
json與s2結合使用:
s2用package管理action :
<package name="gc" namespace="/gc" extends="json-default">
<action name="initData" class="GCSubplateAction" method="initData">
<result name="create">/pages/ipad/create.jsp</result>
<result name="query">/pages/ipad/query.jsp</result>
</action>
<action name="query" class="GCSubplateAction" method="query">
<result name="create">/pages/ipad/create.jsp</result>
<result name="query">/pages/ipad/query.jsp</result>
</action>
<action name="initDate" class="GCSubplateAction" method="initDate">
<result type="json">
<param name="includeProperties">
args123.*
</param>
</result>
</action>
</package>
關鍵點: extends="json-default" <result type="json"> <param name="includeProperties"> args123.* </param> 其實package繼承的包只做了兩個工作,
json-default其實也是最終繼承struts-default的 json-plugn中struts-plugn.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>
這裏你可以看到這個json-default是幹了什麼事情,無非就是:
1 加了個名爲json的result類型
2 加了一層名爲json的攔截器所以 對於你的問題,可以說 不繼承json-default ,可以,但是你必須在你的struts.xml中添加一個resultType 也就是在你的struts.xml 的<struts>節點下添加以下內容:
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>----這裏的name就按照你喜歡的取了
然後在你配置的攔截器聲明中加上
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>也就是json攔截器的聲明
在瀏覽器中直接輸入應用json的這個action的地址 :http://localhost:7001/gc/initDate.action struts配置文件裏可以發現 initDate這個action是調用initDate方法, 方法的內容如下:
public String initDate() throws Exception{
Map<String,String> paramMap = new HashMap<String,String>();
String currentDate = CommUtil.getCurrentDate();//獲取當前時間
String createEndDate = CommUtil.replaceAll(currentDate, "-", "");
String createBeginDate = CommUtil.replaceAll(CommUtil.addMonth(currentDate, -1), "-", "");
paramMap.put("createBeginDate", createBeginDate);
paramMap.put("createEndDate", createEndDate);
this.setArgs123(paramMap);
return SUCCESS;
}
這個action裏有 個專門接收json數據的Map<String,String> args123 這裏的名字可以隨便取,只要在配置文件中寫上相應的 XXX.*即可, 比如上面配置文件的 args123.* 不過這裏有一個小bug 就是 屬性名的第二個字符不要大寫,因爲這個屬性的getter和setter會自動把第一個字母大寫,如果你第二個字符是大寫的 就成了 getARgs123 java就會認爲, 原來的屬性名是 args123 而不是你定義的aRgs123 就會拋異常
輸入剛纔的地址後,就會自動下載一個文件,下載下來以後, 文件的內容就是json格式的數據了