JSON插件提供了一种json类型的Result,一旦为某个Action指定了一个类型为json的Result,则该Result无须映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的字符串,并将该字符串返回给客户端浏览器。
简单地说,JSON插件允许我们在客户端页面的JavaScript中异步调用Action,而且Action不再需要使用视图资源来显示该Action里的状态信息,而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式,就可以完成Ajax交互。
将Struts 2解压缩目录的lib子目录下struts2-json-plugin-2.2.1.jar文件复制到Web应用的WEB-INF\lib目录下,即可为该Struts 2应用增加JSON插件。
接下来配置提供返回JSON字符串的Action,配置该Action与配置普通Action存在小小的区别,应该为该Action配置类型为json的Result,而这个Result无须配置任何视图资源。
配置该Action的struts.xml文件代码如下。
程序清单:codes\04\4.6\struts2json\WEB-INF\src\struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="org.crazyit.app.action.JSONExample">
<!-- 配置类型的json的Result -->
<result type="json">
<!-- 为该Result指定参数 -->
<param name="noCache">true</param>
<param name="contentType">text/html</param>
</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
在上面配置文件中有两个值得注意的地方:
Ø 第一个地方是配置struts.i18n.encoding常量时,不再使用GBK编码,而是使用UTF-8编码,这是因为Ajax的POST请求都是以UTF-8的方式进行编码的。
Ø 第二个地方是配置包时,自己的包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
一旦我们将某个逻辑视图名配置成json类型,这将意味着该逻辑视图无须指定物理视图资源,因为JSON插件会将该Action序列化后发送给客户端。
正如上面的粗体字代码所示,配置json类型的Result时无须指定任何视图资源——JSON插件会将Action对象序列化成一个JSON格式的字符串,并将该字符串作为响应输出给请求者。
上面的粗体字代码中定义json类型的Result时,还指定了noCache、contentType两个参数,这都是json类型的Result的合法参数,json类型的Result可以接受如表4.1所示的常用参数。
表 4.1 json 类型的 Result 允许指定的参数
参 数 名 | 合 法 值 | 默 认 值 | 说 明 |
excludeProperties | 逗号隔开的多个属性名表达式 |
| 所有匹配其中任意一个属性名表达式的属性都不会被序列化到JSON字符串中 |
IncludeProperties | 逗号隔开的多个属性名表达式 |
| 所有匹配其中任意一个属性名表达式的属性都会被序列化到JSON字符串中 |
root | OGNL表达式,确定Action内某个属性 |
| 设置该参数将不再把整个Action对象序列化成JSON字符串。而是只将该参数所指定的Action属性序列化成JSON字符串,返回给客户端 |
wrapPrefix | 任意字符串 |
| 设置在系统生成的JSON结果字符串前添加固定的字符串前缀 |
wrapSuffix | 任意字符串 |
| 设置在系统生成的JSON结果字符串后添加固定的字符串后缀 |
ignoreHierarchy | true或false | true | 默认情况下,JSON插件只序列化Action对象的本身的属性,不会理会它的父类的属性。将该属性设false,将会序列化从Object类开始、所有父类、直到该Action类中所包含的全部属性 |
enableGZIP | true或false | false | 设置是否对JSON响应启用gzip压缩。如果启用gzip压缩,需要客户端浏览器支持 |
noCache | true或false | false | 设置是否取消浏览器缓存。将该参数设为true,将意味着增加如下响应头: Cache-Control: no-cache Expires: 0 Pragma: No-cache |
excludeNullProperties | true或false | false | 设置是否不序列化属性值为null的属性 |
contentType | 合法的MIME类型 | text/html | 设置服务器响应的类型。默认是text/html,通常无须修改 |