11级_Java_曹建波 04.06 Struts2 返回json数据的详细介

Struts2返回json数据的详细介绍

Action中以传统方式输出JSON数据

publicvoiddoAction()throwsIOException{

HttpServletResponseresponse=ServletActionContext.getResponse();

//以下代码从JSON.java中拷过来的

response.setContentType("text/html");

PrintWriterout;

out=response.getWriter();

//将要被返回到客户端的对象

Useruser=newUser();

user.setId("123");

user.setName("JSONActionGeneral");

user.setPassword("JSON");

user.setSay("Hello,iamaactiontoprintajson!");

JSONObjectjson=newJSONObject();

json.accumulate("success",true);

json.accumulate("user",user);

out.println(json.toString());

// 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端

// 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段

// StringjsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello,iamaactiontoprintajson!\",\"password\":\"JSON\"},\"success\":true}";

// out.println(jsonString);

out.flush();

out.close();

}

struts.xml中的配置:

<packagename="default"extends="struts-default"namespace="/">

<actionname="testJSONFromActionByGeneral"class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="doAction">

</action>

</package>

注意:这个action没有result,且doAction方法没有返回值!

Action中以Struts2的方式输出JSON数据

本着不重复发明轮子的原则,我们将转换JSON数据的工作交给Struts2来做,那么相对于在Action中以传统方式输出JSON不同的是,Action是需要将注意力放在业务处理上,而无需关心处理结果是如何被转换成JSON被返回客户端的——这些工作通过简单的配置,Struts2会帮我们做的更好。

publicStringtestByAction(){

//dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据

dataMap.clear();

Useruser=newUser();

user.setId("123");

user.setName("JSONActionStruts2");

user.setPassword("123");

user.setSay("Helloworld!");

dataMap.put("user",user);

//放入一个是否操作成功的标识

dataMap.put("success",true);

//返回结果

returnSUCCESS;

}

struts.xmlaction的配置:

<packagename="json"extends="json-default"namespace="/test">

<actionname="testByAction"

class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByAction">

<resulttype="json">

<!--这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法-->

<paramname="root">dataMap</param>

</result>

</action>

</package>

凡是使用Struts2序列化对象到JSONaction,所在的package必须继承自json-default,注意,这里唯一的result,没有指定name属性。

结果如下图所示:

上面很详细的说明了在WEB应用中如何返回JSON数据到客户端,讲了那么多种方式,涉及的技术核心无非只有两点:

1、将对象转换成符合JSON语法格式的字符串;
2、将符合JSON语法格式的字符串返回客户端;


第二点是整个实现过程的本质,但却不难做到;第一点其实也不难,他甚至有两种做法,一是通过字符串拼接方式,而是通过JSONObject以对象方式转换。看下面的一个例子:

packagecn.ysh.studio.struts2.json.demo.test;

importcn.ysh.studio.struts2.json.demo.bean.User;

importnet.sf.json.JSONObject;

publicclassJSONTest{

/**

*将普通的pojo转换成JSON字符串

*@return

*/

publicJSONObjectbean2json(){

Useruser=newUser();

user.setId("JSONTest");

user.setName("JSONTest");

user.setPassword("JSON");

user.setSay("Hello,iamJSONTest.java");

JSONObjectjsonObject=newJSONObject();

jsonObject.accumulate("user",user);

System.out.println("User转换后的字符串:"+jsonObject.toString());

returnjsonObject;

}

/**

*JSONObject对象中反向解析出User对象

*@paramjsonObject

*/

publicvoidjson2bean(JSONObjectjsonObject){

Useruser=(User)JSONObject.toBean((JSONObject)jsonObject.get("user"),User.class);

System.out.println("转换得到的User对象的Name:"+user.getName());

}

publicstaticvoidmain(String[]s){

JSONTesttester=newJSONTest();

tester.json2bean(tester.bean2json());

}

}

JSON格式的字符串返回到客户端后,客户端会将其解析并封装成真正的JSON对象,以供JS调用。

返回JSON数据时在result中配置的参数的含义及其常见常见配置

<resulttype="json">

<!--这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法-->

<!--默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性-->

<paramname="root">dataMap</param>

<!--指定是否序列化空的属性-->

<paramname="excludeNullProperties">true</param>

<!--这里指定将序列化dataMap中的那些属性-->

<paramname="includeProperties">

userList.*

</param>

<!--这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现-->

<paramname="excludeProperties">

SUCCESS

</param>

</result>

值得一提的是通过Struts2来返回JSON数据,在IE中会提示下载,这个不用关心,换个浏览器就能正常展示JSON数据,而在JS调用中,更是毫无影响。

下面是整个Action的完整代码

packagecn.ysh.studio.struts2.json.demo.action;

importjava.io.IOException;

importjava.io.PrintWriter;

importjava.util.HashMap;

importjava.util.Map;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.struts2.ServletActionContext;

importnet.sf.json.JSONObject;

importcn.ysh.studio.struts2.json.demo.bean.User;

importcom.opensymphony.xwork2.ActionSupport;

publicclassUserActionextendsActionSupport{

/**

*

*/

privatestaticfinallongserialVersionUID=1L;

//将会被Struts2序列化为JSON字符串的对象

privateMap<String,Object>dataMap;

/**

*构造方法

*/

publicUserAction(){

//初始化Map对象

dataMap=newHashMap<String,Object>();

}

/**

*测试通过action以视图方式返回JSON数据

*@return

*/

publicStringtestByJSP(){

Useruser=newUser();

user.setId("123");

user.setName("JSONActionJSP");

user.setPassword("123");

user.setSay("Helloworld!");

JSONObjectjsonObject=newJSONObject();

jsonObject.accumulate("user",user);

jsonObject.accumulate("success",true);

//这里在request对象中放了一个data,所以strutsresult配置中不能有type="redirect"

ServletActionContext.getRequest().setAttribute("data",jsonObject.toString());

returnSUCCESS;

};

/**

*测试通过actionStruts2默认方式返回JSON数据

*@return

*/

publicStringtestByAction(){

//dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据

dataMap.clear();

Useruser=newUser();

user.setId("123");

user.setName("JSONActionStruts2");

user.setPassword("123");

user.setSay("Helloworld!");

dataMap.put("user",user);

//放入一个是否操作成功的标识

dataMap.put("success",true);

//返回结果

returnSUCCESS;

}

/**

*通过action是以传统方式返回JSON数据

*@throwsIOException

*/

publicvoiddoAction()throwsIOException{

HttpServletResponseresponse=ServletActionContext.getResponse();

//以下代码从JSON.java中拷过来的

response.setContentType("text/html");

PrintWriterout;

out=response.getWriter();

//将要被返回到客户端的对象

Useruser=newUser();

user.setId("123");

user.setName("JSONActionGeneral");

user.setPassword("JSON");

user.setSay("Hello,iamaactiontoprintajson!");

JSONObjectjson=newJSONObject();

json.accumulate("success",true);

json.accumulate("user",user);

out.println(json.toString());

// 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端

// 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段

// StringjsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello,iamaactiontoprintajson!\",\"password\":\"JSON\"},\"success\":true}";

// out.println(jsonString);

out.flush();

out.close();

}

/**

*Struts2序列化指定属性时,必须有该属性的getter方法,实际上,如果没有属性,而只有getter方法也是可以的

*@return

*/

publicMap<String,Object>getDataMap(){

returndataMap;

}

}

完整的struts.xml配置文件如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<packagename="json"extends="json-default"namespace="/test">

<actionname="testByAction"

class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByAction">

<resulttype="json">

<!--这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法-->

<!--默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性-->

<paramname="root">dataMap</param>

<!--指定是否序列化空的属性-->

<!--

<paramname="excludeNullProperties">true</param>

-->

<!--这里指定将序列化dataMap中的那些属性-->

<!--

<paramname="includeProperties">

userList.*

</param>

-->

<!--这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现-->

<!--

<paramname="excludeProperties">

SUCCESS

</param>

-->

</result>

</action>

</package>

<packagename="default"extends="struts-default"namespace="/">

<actionname="testJSONFromActionByGeneral"

class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="doAction">

</action>

<actionname="testByJSP"

class="cn.ysh.studio.struts2.json.demo.action.UserAction"method="testByJSP">

<resultname="success">/actionJSP.jsp</result>

</action>

</package>

</struts>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值