在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實(shí)例
下面是整個(gè)Action的完整代碼:
package cn.ysh.studio.struts2.json.demo.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import net.sf.json.JSONObject;
import cn.ysh.studio.struts2.json.demo.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
//將會(huì)被Struts2序列化為JSON字符串的對(duì)象
private Map<String, Object> dataMap;
/**
* 構(gòu)造方法
*/
public UserAction() {
//初始化Map對(duì)象
dataMap = new HashMap<String, Object>();
}
/**
* 測(cè)試通過(guò)action以視圖方式返回JSON數(shù)據(jù)
* @return
*/
public String testByJSP() {
User user = new User();
user.setId("123");
user.setName("JSONActionJSP");
user.setPassword("123");
user.setSay("Hello world !");
JSONObject jsonObject=new JSONObject();
jsonObject.accumulate("user", user);
jsonObject.accumulate("success", true);
//這里在request對(duì)象中放了一個(gè)data,所以struts的result配置中不能有type="redirect"
ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());
return SUCCESS;
};
/**
* 測(cè)試通過(guò)action以Struts2默認(rèn)方式返回JSON數(shù)據(jù)
* @return
*/
public String testByAction() {
// dataMap中的數(shù)據(jù)將會(huì)被Struts2轉(zhuǎn)換成JSON字符串,所以這里要先清空其中的數(shù)據(jù)
dataMap.clear();
User user = new User();
user.setId("123");
user.setName("JSONActionStruts2");
user.setPassword("123");
user.setSay("Hello world !");
dataMap.put("user", user);
// 放入一個(gè)是否操作成功的標(biāo)識(shí)
dataMap.put("success", true);
// 返回結(jié)果
return SUCCESS;
}
/**
* 通過(guò)action是以傳統(tǒng)方式返回JSON數(shù)據(jù)
* @throws IOException
*/
public void doAction() throws IOException{
HttpServletResponse response=ServletActionContext.getResponse();
//以下代碼從JSON.java中拷過(guò)來(lái)的
response.setContentType("text/html");
PrintWriter out;
out = response.getWriter();
//將要被返回到客戶端的對(duì)象
User user=new User();
user.setId("123");
user.setName("JSONActionGeneral");
user.setPassword("JSON");
user.setSay("Hello , i am a action to print a json!");
JSONObject json=new JSONObject();
json.accumulate("success", true);
json.accumulate("user", user);
out.println(json.toString());
// 因?yàn)镴SON數(shù)據(jù)在傳遞過(guò)程中是以普通字符串形式傳遞的,所以我們也可以手動(dòng)拼接符合JSON語(yǔ)法規(guī)范的字符串輸出到客戶端
// 以下這兩句的作用與38-46行代碼的作用是一樣的,將向客戶端返回一個(gè)User對(duì)象,和一個(gè)success字段
// String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello , i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
// out.println(jsonString);
out.flush();
out.close();
}
/**
* Struts2序列化指定屬性時(shí),必須有該屬性的getter方法,實(shí)際上,如果沒(méi)有屬性,而只有g(shù)etter方法也是可以的
* @return
*/
public Map<String, Object> getDataMap() {
return dataMap;
}
}
完整的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="json" extends="json-default" namespace="/test">
<action name="testByAction"
class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="testByAction">
<result type="json">
<!-- 這里指定將被Struts2序列化的屬性,該屬性在action中必須有對(duì)應(yīng)的getter方法 -->
<!-- 默認(rèn)將會(huì)序列所有有返回值的getter方法的值,而無(wú)論該方法是否有對(duì)應(yīng)屬性 -->
<param name="root">dataMap</param>
<!-- 指定是否序列化空的屬性 -->
<!--
<param name="excludeNullProperties">true</param>
-->
<!-- 這里指定將序列化dataMap中的那些屬性 -->
<!--
<param name="includeProperties">
userList.*
</param>
-->
<!-- 這里指定將要從dataMap中排除那些屬性,這些排除的屬性將不被序列化,一半不與上邊的參數(shù)配置同時(shí)出現(xiàn) -->
<!--
<param name="excludeProperties">
SUCCESS
</param>
-->
</result>
</action>
</package>
<package name="default" extends="struts-default" namespace="/">
<action name="testJSONFromActionByGeneral"
class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="doAction">
</action>
<action name="testByJSP"
class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="testByJSP">
<result name="success">/actionJSP.jsp</result>
</action>
</package>
</struts>
以上這篇在Action中以Struts2的方式輸出JSON數(shù)據(jù)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決IntelliJ IDEA 控制臺(tái)輸出中文亂碼問(wèn)題(史上最簡(jiǎn)單)
這篇文章主要介紹了史上最簡(jiǎn)單的IntelliJ IDEA 控制臺(tái)輸出中文亂碼問(wèn)題的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-05-05
Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解
這篇文章主要介紹了Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解,負(fù)載均衡,其含義就是指將負(fù)載進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù),需要的朋友可以參考下2023-08-08
hibernate關(guān)于session的關(guān)閉實(shí)例解析
這篇文章主要介紹了hibernate關(guān)于session的關(guān)閉實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Java實(shí)現(xiàn)精準(zhǔn)Excel數(shù)據(jù)排序的方法詳解
在數(shù)據(jù)處理或者數(shù)據(jù)分析的場(chǎng)景中,需要對(duì)已有的數(shù)據(jù)進(jìn)行排序,在Excel中可以通過(guò)排序功能進(jìn)行整理數(shù)據(jù),而在Java中,則可以借助Excel表格插件對(duì)數(shù)據(jù)進(jìn)行批量排序,下面我們就來(lái)學(xué)習(xí)一下常見(jiàn)的數(shù)據(jù)排序方法吧2023-10-10
使用resty Quartz執(zhí)行定時(shí)任務(wù)的配置方法
這篇文章主要為大家介紹了使用resty?Quartz來(lái)執(zhí)行定時(shí)任務(wù)的配置方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
實(shí)例講解Java設(shè)計(jì)模式編程中的OCP開(kāi)閉原則
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的開(kāi)閉原則,開(kāi)閉原則的大意被作者總結(jié)為用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié),需要的朋友可以參考下2016-02-02
SpringBoot項(xiàng)目接入Nacos的實(shí)現(xiàn)步驟
SpringBoot項(xiàng)目使用nacos作為配置中心和服務(wù)注冊(cè)中心,同時(shí)兼容dubbo的注冊(cè)中心。 本Demo項(xiàng)目使用的SpringBoot版本是2.3.9.RELEASE2021-05-05

