這一點跟傳統的Servlet的處理方式基本上一模一樣,代碼如下
01 |
public void doAction() throws IOException{ |
02 |
HttpServletResponse response=ServletActionContext.getResponse(); |
03 |
//以下代碼從JSON.java中拷過來的 |
04 |
response.setContentType( "text/html" ); |
05 |
PrintWriter out; |
06 |
out = response.getWriter(); |
07 |
//將要被返回到客戶端的對象 |
08 |
User user= new User(); |
09 |
user.setId( "123" ); |
10 |
user.setName( "JSONActionGeneral" ); |
11 |
user.setPassword( "JSON" ); |
12 |
user.setSay( "Hello , i am a action to print a json!" ); |
13 |
JSONObject json= new JSONObject(); |
14 |
json.accumulate( "success" , true ); |
15 |
json.accumulate( "user" , user); |
16 |
out.println(json.toString()); |
17 |
// 因為JSON數據在傳遞過程中是以普通字符串形式傳遞的,所以我們也可以手動拼接符合JSON語法規范的字符串輸出到客戶端 |
18 |
// 以下這兩句的作用與38-46行代碼的作用是一樣的,將向客戶端返回一個User對象,和一個success字段 |
19 |
// String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}"; |
20 |
// out.println(jsonString); |
21 |
out.flush(); |
22 |
out.close(); |
23 |
} |
struts.xml中的配置:
1 |
< package name = "default" extends = "struts-default" namespace = "/" > |
2 |
< action name = "testJSONFromActionByGeneral" class = "cn.ysh.studio.struts2.json.demo.action.UserAction" method = "doAction" > |
3 |
</ action > |
4 |
</ package > |
這個action沒有result,且doAction方法沒有返回值!
2.structs2封裝方式01 |
< result type = "json" > |
02 |
<!-- 這里指定將被Struts2序列化的屬性,該屬性在action中必須有對應的getter方法 --> |
03 |
<!-- 默認將會序列所有有返回值的getter方法的值,而無論該方法是否有對應屬性 --> |
04 |
< param name = "root" >dataMap</ param > |
05 |
<!-- 指定是否序列化空的屬性 --> |
06 |
< param name = "excludeNullProperties" >true</ param > |
07 |
<!-- 這里指定將序列化dataMap中的那些屬性 --> |
08 |
< param name = "includeProperties" > |
09 |
userList.* |
10 |
</ param > |
11 |
<!-- 這里指定將要從dataMap中排除那些屬性,這些排除的屬性將不被序列化,一半不與上邊的參數配置同時出現 --> |
12 |
< param name = "excludeProperties" > |
13 |
SUCCESS |
14 |
</ param > |
15 |
</ result > |
這里需要注意的是execute方法的返回值字符串是無效的,可以隨意設置,因為在后面的配置文件中並不會用到。
getter方法返回值的類型可以采用基本數據類型、String類、集合類(List、Map等)以及諸如Double、Integer等打包類。這些都不會影響JSON的生成,因為對於結果而言都是字符串類型的;而集合類在生成時會被自動迭代,因此生成的結果中其本身的集合類型(列表、映射表等)也不會改變。
因此在Action類可以將所有的結果數據保存到一個List或Map中在通過getter方法輸出,也可以設置多個getter方法返回不同類型、不同變量的數據。這些數據在JSON中的名稱與getter方法名中一致。
與基本的Action相比,生成JSON的Action在配置文件struts.xml中主要有兩點不同:
1. 不能與基本的Action配置在同一個package中,新的package必須擴展自(extends)json-default命名空間;
2. result標簽中可以不包含name屬性(因為沒用),但是必須包含type屬性,且值必須為“json”,即<result type=”json” ></result>,表明這是一個JSON數據,不需要跳轉頁面。