Structs2中Action返回json到前台方法


1.傳統方式JSON輸出

這一點跟傳統的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>

  JSON 數據在Action類中是根據getter方法的返回值自動裝配的,也就是說完全可以不需要重寫execute方法。 JSON 的生成機制(上述兩個必需的包中提供的方法)會直接從setter方法獲取到request中提供的值,並且自動裝配getter方法提供的返回值。期間如果有其它的功能操作,如計算、查詢數據庫、重組數據等,可以寫到getter方法中,也可以寫到execute方法中統一執行。

這里需要注意的是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數據,不需要跳轉頁面。


 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM