程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts2 Result 前往JSON對象詳解

Struts2 Result 前往JSON對象詳解

編輯:關於JAVA

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對象的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved