因爲最近幾年日益流行先後端分離模式,JSON做爲數據載體也變得不可或缺。幾乎全部的web框架都須要支持JSON,下面咱就一塊兒瞭解下struts2是如何支持JSON的。html
這裏有兩種方法實現,一種就是最原始的,先使用工具將對象轉換成json字符串,再把數據放入response中返回。java
工具的我使用的是阿里的fastjsonweb
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.29</version> </dependency>
Action的代碼:spring
@Action(value = "info") //方法使用void public void info() throws IOException { //設置響應類型 ServletActionContext.getResponse().setContentType("text/html;charset=utf-8"); //經過response返回數據 PrintWriter out=ServletActionContext.getResponse().getWriter(); //數據載體,一個map Map<String,Object> data=new HashMap<>(); model.put("success",true); model.put("data","數據"); //使用fastJSON對對象進行轉換 String json=JSON.toJSONString(model); out.println(json); out.flush(); out.close(); }
能夠發現,若是使用最原始的方法來實現的話,代碼很是的臃腫。下面介紹struts2原生的方式:apache
<!--struts json支持-->
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-json-plugin</artifactId> <version>2.3.4</version> </dependency> <!-- struts核心包--> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.3.4</version> <exclusions> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency> <!--struts 集成spring --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.3.4</version> </dependency> <!-- struts零配置依賴 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-convention-plugin</artifactId> <version>2.3.4</version> </dependency>
這裏須要注意的是struts的版本號,若是能夠儘可能和個人同樣,否者可能會出現各類錯誤(血淋淋的經驗)json
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="base" extends="json-default,struts-default"> <!-- 這裏能夠設置一些全局的返回值映射關係等 --> </package> <!-- 將Action交給spring容器管理 --> <constant name="struts.objectFactory" value="spring" /> <!-- 零配置 --> <constant name="struts.convention.package.locators" value="action" /> <constant name="struts.convention.package.locators.basePackage" value="com.cky.blog.action" /> <!--默認全部的結果頁面都存儲的路徑--> <constant name="struts.convention.result.path" value="/WEB-INF/content" /> <!--設置靜態資源過濾,以static開頭的不處理--> <constant name="struts.action.excludePattern" value="/static/.*?" /> <!-- 模式爲開發模式,修改xml配置文件會自動加載,項目交付的時候設置爲false,以避免影響性能 --> <constant name="struts.devMode" value="true" /> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 字符集編碼 --> <constant name="struts.i18n.encoding" value="utf-8" /> <package name="defaultPackage" namespace="/" extends="struts-default"> </package> </struts>
@Controller @Scope("prototype") @ParentPackage("base") @Namespace("/category") public class CategoryIndex extends ActionSupport{ //@result中的value表明視圖名,
// type須要指定爲json,
// params中的"root"不能夠改變,
// "data"能夠改變,指定要轉換成json的對象 @Action(value = "update",results = {
@Result(name = "json",type = "json",params = {"root","data"})}) public String update() throws IOException { //實例化data data=new HashMap<String,Object>(); data.put("success",true); data.put("message","提交成功"); return "json"; } //經過data這個map集合來傳遞數據 private Map<String,Object> data; public Map getData(){return data;} public void setData(Map data){this.data=data} }
struts2默認就支持對json的解析,是否是很開心?也就是說他能夠像解析普通的post提交同樣,解析json數據,而後自動將根據鍵名將數據注入Action的屬性中,固然,前提是屬性存在並有getter、setter方法後端