Struts2 Result 前往JSON對象詳解。本站提示廣大學習愛好者:(Struts2 Result 前往JSON對象詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Struts2 Result 前往JSON對象詳解正文
假如是作為客戶真個HTTP+JSON接口工程,沒有JSP等view視圖的情形下,應用Jersery框架開辟相對是第一選擇。而在基於Spring3 MVC的架構下,對HTTP+JSON的前往類型也有很好的支撐。然則,在開辟任務中,對功效的進級是基於既定架構是很罕見的情形。自己碰著須要用開辟基於Struts2的HTTP+JSON前往類型接口就是基於既定框架構造下停止的。
Struts2前往JSON有兩種方法:1.應用Servlet的輸入流寫入JSON字符串;2.應用Struts2對JSON的擴大。
一.應用Servlet的輸入流
JSON接口的本質是:JSON數據在傳遞進程中,其實就是傳遞一個通俗的相符JSON語法格局的字符串罷了,所謂的“JSON對象”是指對這個JSON字符串解析和包裝後的成果。
所以這裡只須要將一個JSON語法格局的字符串寫入到Servlet的HttpServletResponse中,這裡應用的是PrintWriter的方法,固然也能夠采取Stream流的方法。須要留意的是:在挪用getWriter之前未設置編碼(既挪用setContentType或許setCharacterEncoding辦法設置編碼), HttpServletResponse則會前往一個用默許的編碼(既ISO-8859-1)編碼的PrintWriter實例。如許就會形成中文亂碼。並且設置編碼時必需在挪用getWriter之前設置,否則是有效的。
編寫接口代碼:
這裡的辦法與普通的Struts2辦法的差別是這裡是void前往類型。
public void write() throws IOException{ HttpServletResponse response=ServletActionContext.getResponse(); /* * 在挪用getWriter之前未設置編碼(既挪用setContentType或許setCharacterEncoding辦法設置編碼), * HttpServletResponse則會前往一個用默許的編碼(既ISO-8859-1)編碼的PrintWriter實例。如許就會 * 形成中文亂碼。並且設置編碼時必需在挪用getWriter之前設置,否則是有效的。 * */ response.setContentType("text/html;charset=utf-8"); //response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); //JSON在傳遞進程中是通俗字符串情勢傳遞的,這裡簡略拼接一個做測試 String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"張三\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}"; out.println(jsonString); out.flush(); out.close(); }
設置裝備擺設action
從以下的設置裝備擺設中可以顯著的看到設置裝備擺設與通俗的action設置裝備擺設沒有任何差別,只是沒有前往的視圖罷了。
<action name="write" class="json.JsonAction" method="write" />
前往值
{"user":{"id":"123","name":"張三","say":"Hello , i am a action to print a json!","password":"JSON"},"success":true}
二.應用Struts2對JSON的擴大
要應用這個擴大功效確定須要添加支撐包。經由自己的調試,這裡有兩種選擇:
1.xwork-core-2.1.6.jar和struts2-json-plugin-2.1.8.jar。假如你想應用struts2-json-plugin-2.1.8.jar這類支撐方法,你的xwork-core-*.jar不克不及選擇2.2.1及以上版本,由於xwork-core-*.jar的2.2.1及以上版本中沒有了org.apache.commons.lang等包。啟動tomcat的時刻會湧現:java.lang.NoClassDefFoundError: org.apache.commons.lang.xwork.StringUtils。
2.xwork-2.1.2.jar和jsonplugin-0.34.jar。假如想用jsonplugin-0.34.jar這類支撐方法,那須要切換你的xwork-core-*.jar為xwork-2.1.2.jar。由於jsonplugin-0.34.jar須要com.opensymphony.xwork2.util.TextUtils這個類的支撐。而xwork-core-*.jar的2.2.1以上版本均為找到該類,且在xwork-core-2.1.6.jar中也沒有該類。
最初說一句,還由於用原始構建方法而一直蹚雷,確切不值得,真心累。應用Maven等主動化構件方法,會在很年夜水平上防止依附包間的版本差別的bug。第三節的“struts2零設置裝備擺設”中會應用maven的構件方法。
編寫接口代碼
該類中json()辦法就是通俗Struts2的辦法。在這裡沒有看就任何JSON格局的字符串,由於我們將要把這項任務交給擴大去完成。在沒有任何設定的情形下,改類下的一切getter辦法的前往值將被包括在前往給客戶真個JSON字符串中。要剔除不須要包括的屬性,在類構造構造中須要在getter辦法上應用@JSON(serialize=false)停止注解,固然在不影響其他營業的時刻也能夠直接去失落這個getter辦法。所以本例中的前往成果是將dataMap對象轉換成的JSON格局的字符串。
package json; import java.util.HashMap; import java.util.Map; import org.apache.struts2.json.annotations.JSON; import com.opensymphony.xwork2.ActionSupport; /** * JSON測試 * * @author Watson Xu * @date 2012-8-4 下晝06:21:01 */ public class JsonAction extends ActionSupport{ private static final long serialVersionUID = 1L; private Map<String,Object> dataMap; private String key = "Just see see"; public String json() { // dataMap中的數據將會被Struts2轉換成JSON字符串,所以這裡要先清空個中的數據 dataMap = new HashMap<String, Object>(); User user = new User(); user.setName("張三"); user.setPassword("123"); dataMap.put("user", user); // 放入一個能否操作勝利的標識 dataMap.put("success", true); // 前往成果 return SUCCESS; } public Map<String, Object> getDataMap() { return dataMap; } //設置key屬性不作為json的內容前往 @JSON(serialize=false) public String getKey() { return key; } }
設置裝備擺設aciton
在設置裝備擺設中,起首須要action地點的package繼續了json-default,或許繼續的父包繼續了json-default。這設置裝備擺設action的前往類型的type為json,而且可以設置裝備擺設其序列化的屬性等一些類參數
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="json" extends="struts-default,json-default" > <action name="json" class="json.JsonAction" method="json"> <result type="json"> <!-- 這裡指定將被Struts2序列化的屬性,該屬性在action中必需有對應的getter辦法 --> <param name="root">dataMap</param> </result> </action> </package> </struts>
前往值
{"success":true,"user":{"name":"張三","password":"123"}}
三. Struts2零設置裝備擺設應用辦法,應用Maven構件:
3.1) 樹立一個webapp,這裡照樣采取Maven構建,構建進程參考limingnihao的blog: 應用Eclipse構建Maven的SpringMVC項目 。
3.2) 添加Struts2的依附、struts2零設置裝備擺設依附和struts2的json依附:
<dependencies> <!-- struts2焦點依附 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.4</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- struts2零設置裝備擺設依附 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.4</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- struts2的json依附 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.4</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies>
經由測試,下面的依附包間沒有湧現版本兼容的bug,不只僅由於他們是統一個版本,加倍得益於Maven的主動構建方法。
3.3) 設置裝備擺設web.xml,啟用Struts2:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>StrutsPrepareAndExecuteFilter </filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> <init-param> <param-name>config</param-name> <param-value>struts-default.xml,struts-plugin.xml,struts.xml</param-value> </init-param> </filter> <filter-mapping> <filter-name>StrutsPrepareAndExecuteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3.4)設置裝備擺設struts.xml,設置一些根本常量和運用:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="base" extends="json-default,struts-default"> <!-- 這裡可以設置一些全局的前往值映照關系等 --> </package> <constant name="struts.action.extension" value="" /> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.i18n.encoding" value="utf-8" /> <constant name="struts.multipart.maxSize" value="1073741824"/> <constant name="struts.devMode" value="false"/> </struts>
3.5)編寫和設置裝備擺設Action。由並未指定Convention停止設置,所以關於Convention插件而言,默許的它會把一切類名以Action開頭的java類當做Action處置:
package watson.action; import java.util.HashMap; import java.util.Map; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; @ParentPackage("base") @Namespace("/watson") @Results({ @Result(name = "json",type="json", params={"root","msg"}) }) public class JsonAction { @Action(value="json") public String json() { msg = new HashMap<String, Object>(); msg.put("flag", "success"); Map<String, String> user = new HashMap<String, String>(); user.put("name", "張三"); user.put("age", "34"); msg.put("user", user); return "json"; } //================================== private Map<String, Object> msg; public Map<String, Object> getMsg() { return msg; } }
3.6)安排項目,啟動容器,閱讀器地址欄中輸出:http://localhost:7070/Struts2foo/watson/json。比及成果以下:
{"flag":"success","user":{"age":"34","name":"張三"}}
從下面成果可知在啟用了零設置裝備擺設今後,只是少了在xml中的設置裝備擺設,改成在每一個action頂用annotation停止注解。這裡刪除下面在xml中的設置裝備擺設,將上面的代碼寫入到下面的JsonAction的上部:
@ParentPackage("base") @Namespace("/watson") @Results({ @Result(name = "json",type="json", params={"root","msg"}) })
root就相當xml設置裝備擺設中的參數設置裝備擺設。
四.附 :
action的前往類型為json時的可設置裝備擺設參數詳解:
<result type="json"> <!-- 這裡指定將被Struts2序列化的屬性,該屬性在action中必需有對應的getter辦法 --> <!-- 默許將會序列一切有前往值的getter辦法的值,而不管該辦法能否有對應屬性 --> <param name="root">dataMap</param> <!-- 指定能否序列化空的屬性 --> <param name="excludeNullProperties">true</param> <!-- 這裡指定將序列化dataMap中的那些屬性 --> <param name="includeProperties">userList.*</param> <!-- 這裡指定將要從dataMap中消除那些屬性,這些消除的屬性將不被序列化,普通不與上邊的參數設置裝備擺設同時湧現 --> <param name="excludeProperties">SUCCESS</param> </result>
附件下載
StrutsJson.rar
Struts2foo.rar
以上就是Struts2前往JSON對象的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。