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,通常无须修改 |
本文出自 “疯狂Java李刚” 博客,http://javaligang.blog.51cto.com/5026500/897429