平时在使用ajax发出请求从后台获取数据的时候,经常需要将数据转换为json格式,struts2自己提供了方便的jar包来对数据进行json格式转换,下面是配置详情.:
在struts2的基础上 配置 struts2还需要的包:
commons-lang-2.4.jar;
json-lib-2.3-jdk13.jar;
jsonplugin-0[1].32.jar;
ezmorph-1.0.2.jar;
commons-beanutils-1.7.0.jar;
另外,可以通过: @JSON(name="mymessage") 来给 action 中的get属性设 json节点 别名
通过给 属性设置: @JSON(serialize=false) 来给控制 哪些属性 不序列化输出.
root:只包含xx对象
excludeProperties :除了xx之外的集合
includeProperties : 包含xx的集合
wrapPrefix :json结果开头添加xx(比如<paramname="wrapPrefix">[</param>)
wrapSuffix :同上,只不过是结尾
ignoreHierarchy :转化时是否忽略继承关系true/false
enumAsBean : 是否将枚举当做一个bean处理
enableGZIP :是否支持gzip压缩输出
noCache :是否缓存
excludeNullProperties : 是否转化输出 null值
statusCode :设置响应代号比如 304
callbackParameter : JSONP跨域访问的回调设置
contentType : 输出类型
action.java 中的配置:
//将会被Struts2序列化为json字符串的对象
private
Map<String,
Object> dataMap=
new
HashMap<String,
Object>(); //初始化
public
Map<String,
Object> getDataMap() {
return
dataMap;}//
Struts2序列化指定属性时,必须有该属性的getter方法,实际上,如果没有属性,而只有getter方法也是可以的
方式1: 通过action以视图方式返回JSON数据
public
String
testByJSP() {
041
User
user =
new
User();
043
user.setName(
"JSONActionJSP"
);
044
user.setPassword(
"123"
);
045
user.setSay(
"Hello
world !"
);
046
JSONObject
jsonObject=
new
JSONObject();
047
jsonObject.accumulate(
"user"
,
user);
048
jsonObject.accumulate(
"success"
,
true
);
049
//这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect"
050
ServletActionContext.getRequest().setAttribute(
"data"
,
jsonObject.toString());
方式2:
通过action以Struts2默认方式返回JSON数据
public
String
testByAction() {
059
//
dataMap中的数据将会被Struts2转换成JSON字符串,所以这里要先清空其中的数据
061
User
user =
new
User();
063
user.setName(
"JSONActionStruts2"
);
064
user.setPassword(
"123"
);
065
user.setSay(
"Hello
world !"
);
066
dataMap.put(
"user"
,
user);
068
dataMap.put(
"success"
,
true
);
public
void
doAction()
throws
IOException{
078
HttpServletResponse
response=ServletActionContext.getResponse();
079
//以下代码从JSON.java中拷过来的
080
response.setContentType(
"text/html"
);
082
out
= response.getWriter();
084
User
user=
new
User();
086
user.setName(
"JSONActionGeneral"
);
087
user.setPassword(
"JSON"
);
088
user.setSay(
"Hello
, i am a action to print a json!"
);
089
JSONObject
json=
new
JSONObject();
090
json.accumulate(
"success"
,
true
);
091
json.accumulate(
"user"
,
user);
092
out.println(json.toString());
093
// 因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端
094
// 以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段
095
// String jsonString="{\"user\":{\"id\":\"123\",\"name\":\"JSONActionGeneral\",\"say\":\"Hello
, i am a action to print a json!\",\"password\":\"JSON\"},\"success\":true}";
096
// out.println(jsonString);
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
02
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
03
"http://struts.apache.org/dtds/struts-2.0.dtd">
05
<
package
name
=
"json"
extends
=
"json-default"
namespace
=
"/test"
>
06
<
action
name
=
"testByAction"
07
class
=
"cn.ysh.studio.struts2.json.demo.action.UserAction"
method
=
"testByAction"
>
09
<!--
这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
10
<!--
默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
11
<
param
name
=
"root"
>dataMap</
param
>
14
<param
name="excludeNullProperties">true</param>
16
<!--
这里指定将序列化dataMap中的那些属性 -->
18
<param
name="includeProperties">
22
<!--
这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
24
<param
name="excludeProperties">
31
<
package
name
=
"default"
extends
=
"struts-default"
namespace
=
"/"
>
32
<
action
name
=
"testJSONFromActionByGeneral"
33
class
=
"cn.ysh.studio.struts2.json.demo.action.UserAction"
method
=
"doAction"
>
35
<
action
name
=
"testByJSP"
36
class
=
"cn.ysh.studio.struts2.json.demo.action.UserAction"
method
=
"testByJSP"
>
37
<
result
name
=
"success"
>/actionJSP.jsp</
result
>