`
xinklabi
  • 浏览: 1586735 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

struts-json-plugin(翻译自官方文档)(转)

 
阅读更多

转自:http://yshjava.iteye.com/blog/1333104

 

为了在网上找到struts-json-plugin-xx.jar的源码,可真是费了九牛二虎之力,最后也还是没能如愿以偿,最后只得在Apache-SVN 上一页一页的翻看源码来完成上一篇文章,真是悲惨...不过凡事不总是那么绝对——我想这也是生活的魅力所在,居然让我不经意间发现了Apache官网上的一篇关于struts-json-plugin的使用说明文档 ,非常的详细,非常的全面,不仅有配置说明,还有一个范例工程,赶紧将其拿出来与大家分享。

 

JSON 插件提供了一个 "json" 结果类型来把 action 序列化成 JSON. 这一序列化的过程是递归的, 意即整个对象图,从 action 类开始 (未包括基类) 将会被序列化 (可以用 "root" 属性来指定自己的根对象). 如果使用了 json 拦截器, action 将可通过请求中的 JSON 内容组装出来, 该拦截器遵循以下几条规则:

  1. "content-type" 必须为 "application/json"
  2. JSON 内容必须是格式良好的, 参考 json.org 中的语法.
  3. Action 里必须有欲获取值的属性的相应 public 的 "setter" 方法.
  4. 所支持的类型有: 原始类型 (int,long...String), Date, List, Map, 原始类型数组, 其他的类 (将会支持更多), 和其他类型的数组.
  5. JSON 中的任何将要被填入到 list 或 map 中的对象会是 Map 类型(属性映射到值), 任何整数都是 Long 类型, 任何小数会是 Double 类型, 任何数组会是 List 类型.

给定下面的 JSON 字符串:

 

Js代码  收藏代码
  1. {  
  2.    "doubleValue" : 10.10,  
  3.    "nestedBean" : {  
  4.       "name" "Mr Bean"   
  5.    },  
  6.    "list" : [ "A" , 10, 20.20, {  
  7.       "firstName" "El Zorro"   
  8.    }],  
  9.    "array" : [10, 20]   
  10. }  

 

action 中必须有一个 "setDoubleValue" 方法, 参数为 "float" 或者 "double"(拦截器将会把值转换为相应的类型). 还必须有一个 "setNestedBean" 方法,它的参数类型可以为任何类类型, 其中含有参数为 "String" 的 "setName" 方法. 还必须有一个参数为 "List" 的 "setList" 方法, 这个 List 中将会包含: "A" (String), 10 (Long), 20.20 (Double), Map ("firstName" -> "El Zorro"). "setArray" 方法可以是 "List", 或任何数字类型数组作参数的.
序列化你的对象成 javascript 的 JSON, 参考 json2

安装

本插件可通过把插件 jar 包到你的应用的 /WEB-INF/lib 目录来完成安装. 没有别的文件需要拷贝或被创建.

使用 maven 的话, 加入下列到你的 pom 中:

 

 

Xml代码  收藏代码
  1. < dependencies >   
  2.    ...  
  3.    < dependency >   
  4.        < groupId > org.apache.struts </ groupId >   
  5.        < artifactId > struts2-json-plugin </ artifactId >   
  6.        < version > STRUTS_VERSION </ version >   
  7.    </ dependency >   
  8.    ...  
  9. </ dependencies >   

 

定制化序列化和反序列化

使用 JSON 注解来达到定制序列化和反序列化过程. 可用的 JSON 注解如下:

 

 

名称 描述 默认值 序列化 反序列化

name 定制字段名 empty yes no
serialize 标识为可被序列化 true yes no
deserialize 标识为可被反序列化 true no yes
format 用于格式化或解析 Date 字段的格式 "yyyy-MM-dd'T'HH:mm:ss" yes yes

 

 

排除属性

 

逗号分隔的正则表达式列表可传递给 JSON Result 和 Interceptor(拦截器), 被任何 一个正则表达式匹配的属性将会在序列化过程时忽略掉:

 

Xml代码  收藏代码
  1. <!-- Result fragment -->   
  2. < result   type = "json" >   
  3.   < param   name = "excludeProperties" >   
  4.     login.password,  
  5.     studentList.*\.sin  
  6.   </ param >   
  7. </ result >   
  8.   
  9. <!-- Interceptor fragment -->   
  10. < interceptor-ref   name = "json" >   
  11.   < param   name = "enableSMD" > true </ param >   
  12.   < param   name = "excludeProperties" >   
  13.     login.password,  
  14.     studentList.*\.sin  
  15.   </ param >   
  16. </ interceptor-ref >   

 

包含属性

逗号分隔的正则表达式列表可被传递给 JSON Result, 用于限制哪些属性可用于序列化. 只有当能够匹配任何一个正则表达式的属性才会包含在序列化输出中.

注:
排除属性表达式优先于包含属性的表达式. 那就是说, 如果包含和排除表达式应用于同一个结果, 包含表达式对于被排除表达式匹配到的属性是不起作用的.

 

 

Xml代码  收藏代码
  1. <!-- Result fragment -->   
  2. < result   type = "json" >   
  3.   < param   name = "includeProperties" >   
  4.     ^entries\[\d+\]\.clientNumber,  
  5.     ^entries\[\d+\]\.scheduleNumber,  
  6.     ^entries\[\d+\]\.createUserId  
  7.   </ param >   
  8. </ result >   

 

 

根对象  

使用 "root" 属性(OGNL 表达式) 指定被用于序列化的根对象.

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "root" >   
  3.     person.job  
  4.   </ param >   
  5. </ result >   

 

 

"root" 属性(OGNL 表达式) 也可以用于拦截器来指定被组装的对象, 确保这个对象不会是 null .

 

Xml代码  收藏代码
  1. < interceptor-ref   name = "json" >   
  2.   < param   name = "root" > bean1.bean2 </ param >   
  3. </ interceptor-ref >   

 

 

包装

可能会有某些原因,你想要用些文本对 JSON 输出包装一下, 像用注释包裹, 加上前缀, 或使用文件上载让结果显示在 textarea 之中. 用 wrapPrefix 在开始处加上内容,wrapPostfix 添加内容在尾端. 这两个参数优先使用,而 "wrapWithComments" 和 "prefix" 自从 0.34 后就不推荐使用. 例子:

进行注释:

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "wrapPrefix" > /* </ param >   
  3.   < param   name = "wrapSuffix" > */ </ param >   
  4. </ result >   

 

添加前缀:

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "wrapPrefix" > {}&& </ param >   
  3. </ result >   

 

 

包裹上传的文件内容:

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "wrapPrefix" > <![CDATA[<html><body><textarea>]]> </ param >   
  3.   < param   name = "wrapSuffix" > <![CDATA[</textarea></body></html>]]> </ param >   
  4. </ result >   

 

包裹以注释

wrapWithComments 自 0.34 不推荐使用, 建议用 wrapPrefixwrapSuffix .
wrapWithComments 可使得安全的 JSON 文本变得不安全. 例如,

 

["*/ alert('XSS'); /*"]

谢谢 Douglas Crockford 的提示! 应考虑用 prefix .

假如被序列化的 JSON 是 {name: 'El Zorro'} . 那么此时输出就会是: {}&& ({name: 'El Zorro'}

假如 "wrapWithComments" (默认为 false) 属性被设为 true, 生成的被包裹上注释的 JSON 就如下:

 

Js代码  收藏代码
  1. /* {  
  2.    "doubleVal": 10.10,  
  3.    "nestedBean": {  
  4.       "name": "Mr Bean"  
  5.    },  
  6.    "list": ["A", 10, 20.20, {  
  7.       "firstName": "El Zorro"  
  8.    }],  
  9.    "array": [10, 20]   
  10. } */   

 

 欲取消上面的注释,可用:

 
Js代码  收藏代码
  1. var  responseObject = eval( "(" +data.substring(data.indexOf( "\/\*" )+2, data.lastIndexOf( "\*\/" ))+ ")" );  
 
 
前缀
 
prefix 从 0.34 后不建议用, 请用 wrapPrefixwrapSuffix .

假如参数 prefix 被设置为 true, 生成的 JSON 将被附上前缀 "{}&& ". 这有助于防止被劫持. 详细内容请看 this Dojo Ticket :

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "prefix" > true </ param >   
  3. </ result >   

 

 

基类
 

默认时,定义在 "root" 对象的基类中的属性不会被序列化, 要序列化来自于所有基类(直到 Object) 中的属性,需在 JSON result 里设置 "ignoreHierarchy" 为 false:

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "ignoreHierarchy" > false </ param >   
  3. </ result >   

 

枚举类型

默认的, Enum 被序列化为 name=value 对,这里的 value = name().

 

Java代码  收藏代码
  1. public   enum  AnEnum {  
  2.      ValueA,  
  3.      ValueB  
  4.   }  
  5.   
  6.   JSON:  "myEnum" : "ValueA"   

 

使用 result 的参数 "enumAsBean" 可使得 Enum 像一个 bean 一样的被序列化,特定的属性为 _name,值为 name(). 所有的枚举属性都会被序列化. 

 

 

Java代码  收藏代码
  1. public   enum  AnEnum {  
  2.      ValueA("A" ),  
  3.      ValueB("B" );  
  4.   
  5.      private  String val;  
  6.        
  7.      public  AnEnum(val) {  
  8.         this .val = val;  
  9.      }  
  10.      public  getVal() {  
  11.         return  val;  
  12.      }  
  13.    }  

 

 

Js代码  收藏代码
  1. JSON:  myEnum: {  "_name" "ValueA" "val" "A"  }  

 

在 struts.xml 中启用该参数:

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "enumAsBean" > true </ param >   
  3. </ result >   

 

 

压缩输出.

设置 enableGZIP 属性为 true 可用 gzip 压缩响应输出. 在请求后 "Accept-Encoding" 头中必须包含 "gzip" 才能正常工作.

 

Xml代码  收藏代码
  1. < result   type = "json" >   
  2.   < param   name = "enableGZIP" > true </ param >   
  3. </ result >   

 

防止浏览器缓存响应数据

noCache 设置为 true(默认为 false) 会设置如下响应头:

 

  • Cache-Control: no-cache
  • Expires: 0
  • Pragma: No-cache
  •  

    Xml代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "noCache" > true </ param >   
    3. </ result >   

     

     

    排除值为 null 的属性

    默认的,为 null 的字段也被序列化,生成像 {property_name: null}. 这能够通过设置 excludeNullProperties 为 true 来防止.

     

    Html代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "excludeNullProperties" > true </ param >   
    3. </ result >   

     

     

    状态和错误代码

    使用 statusCode 来设置响应状态代码:

     

    Xml代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "statusCode" > 304 </ param >   
    3. </ result >   

     

     

    同时可用 errorCode 来发送一个错误(the server might end up sending something to the client which is not the serialized JSON):

     

    Xml代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "errorCode" > 404 </ param >   
    3. </ result >   

     

    JSONP

    To enable JSONP, set the parameter callbackParameter in either the JSON Result or the Interceptor. A parameter with that name will be read from the request, and it value will be used as the JSONP function. Assuming that a request is made with the parameter "callback"="exec": 

     

    Xml代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "callbackParameter" > callback </ param >   
    3. </ result >   

     

    And that the serialized JSON is {name: 'El Zorro'} . Then the output will be: exec({name: 'El Zorro'})

    Content Type

    Content type will be set to application/json-rpc by default if SMD is being used, or application/json otherwise. Sometimes it is necessary to set the content type to something else, like when uploading files with Dojo and YUI. Use the contentType parameter in those cases.

     

    Xml代码  收藏代码
    1. < result   type = "json" >   
    2.   < param   name = "contentType" > text/html </ param >   
    3. </ result >     

     

     

    以上是前辈"隔叶黄莺 Unmi Blog "对该文档的翻译,感谢前辈的无私奉献!除上述翻译的部分,原文中还有三个具体的范例,除了示范普通的JSON调用外,还有一个JSON RPC范例,笔者看的不是很明白,所以这里不敢多说什么。原文地址:https://cwiki.apache.org/confluence/display/WW/JSON+Plugin ,感兴趣的童鞋可以去看看。

    分享到:
    评论

    相关推荐

      struts2-json-plugin-2.3.24-API文档-中文版.zip

      包含翻译后的API文档:struts2-json-plugin-2.3.24-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.struts:struts2-json-plugin:2.3.24; 标签:apache、struts2、plugin、struts、json、jar包、java、...

      struts-2.5.20-all.zip

      6. **Plug-in机制**:Struts2的插件系统允许扩展框架功能,例如,struts2-convention-plugin自动映射Action和结果页面,struts2-dojo-plugin则提供 dojo库的支持。 **Struts2的安全问题与应对策略** Struts2的某些...

      struts-2.3.16.3-docs.zip

      此压缩包"struts-2.3.16.3-docs.zip"包含了Struts 2版本2.3.16.3的官方文档,这个版本在Struts 2的生命周期中扮演了重要的角色,提供了许多增强的功能和修复了已知的漏洞。 Struts 2的核心特性包括: 1. **Action...

      struts2-json-plugin-2.3.24.jar中文-英文对照文档.zip

      中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 ...

      struts-2.3.31-all.zip

      - `struts2-json-plugin.jar`:处理JSON响应的插件。 - `struts2-spring-plugin.jar`:与Spring框架的集成插件。 - `struts2-struts1-plugin.jar`:与Struts1的互操作性插件。 - `其他相关的库文件和文档`:如依赖的...

      struts-2.0.11.2-lib

      - `struts2-json-plugin.jar`:支持JSON格式的输入输出,便于与AJAX进行交互。 - `struts2-dojo-plugin.jar`:与Dojo JavaScript库集成,提供富客户端功能。 4. **其他支持库**: - `commons-fileupload.jar`:...

      struts-2.5.2-all.zip

      - **插件(Plugins)**:每个插件通常对应一个单独的JAR,如`struts2-convention-plugin.jar`(约定优于配置)、`struts2-json-plugin.jar`(JSON支持)等。 - **依赖库(Dependent Libraries)**:Struts 2依赖于...

      struts-2.2.3-lib.zip struts2.jar 全部jar包

      同时,官方文档可以帮助开发者更好地理解和利用Struts2的特性,例如Action配置、拦截器链、结果类型、动态方法调用等。 Struts2.2.3版本相对于早期版本,修复了一些已知问题,提升了性能,并引入了新的特性和改进。...

      struts-2.3.16-all

      2. `struts2-plugins`目录:各种插件,如Freemarker、Tiles、JSON等。 3. `struts2-dojo-plugin`:提供与Dojo库的集成,用于创建富客户端界面。 4. `struts2-spring-plugin`:与Spring框架的集成库。 5. `struts2-...

      struts-2.3.4.rar(里面有整理的常用jar包)

      - `struts2-json-plugin.jar`:支持JSON数据交换,便于前后端交互。 - `ognl.jar`:Object-Graph Navigation Language,用于表达和操作对象属性,是Struts2中的表达式语言。 - `freemarker.jar`:FreeMarker是一...

      struts2.3.15.3+json+maven

      Struts2提供了JSON插件,使得将Action结果转换为JSON变得更加简单。前端JavaScript代码使用AJAX发送请求到特定的Struts2 Action,接收到JSON响应后,可以动态更新DOM元素,显示或操作数据。 总结起来,这个"struts...

      struts-2.5.16升级jar包.zip

      4. **struts2-json-plugin.jar**:支持JSON格式的数据交换,使得与AJAX和JavaScript更易于交互。 5. **struts2-spring-plugin.jar**:集成Spring框架,帮助管理Action和其他依赖项的生命周期。 此外,描述中提到的...

      struts-2.0.11-all.zip

      其他插件可能包括 strut2-json-plugin.jar,用于JSON数据交换,或者 strut2-tiles-plugin.jar,用于页面布局管理。 3. **示例和教程应用**:压缩包中可能包含一些示例应用,这些应用演示了如何使用Struts2框架来...

      struts-2.3.1.2-lib精简必须包

      - `struts2-json-plugin-2.3.1.2.jar`: 提供JSON支持,使应用能够与AJAX或JSON格式的数据交互。 - `struts2-dojo-plugin-2.3.1.2.jar` (可能包含): 如果存在,提供与Dojo JavaScript库的集成,用于创建富客户端...

      struts-2.3.4.1第一部分

      - 主要的jar包可能包括`struts2-core.jar`(核心库)、`struts2-convention-plugin.jar`(约定优于配置插件)、`struts2-json-plugin.jar`(JSON支持)和`struts2-dojo-plugin.jar`(Dojo UI库支持)等。...

      struts-2.3.8 doc

      这个"struts-2.3.8 doc"压缩包包含的是Struts 2框架版本2.3.8的官方文档,对于开发者来说是理解和使用Struts 2的关键参考资料。以下是基于该文档的Struts 2核心知识点的详细说明: 1. **MVC模式**:Struts 2遵循...

      struts-2.1.8.1的全部jar包

      7. **struts2-json-plugin.jar**:支持JSON数据格式的输入和输出,方便与AJAX或移动设备进行通信。 8. **struts2-spring-plugin.jar**:如果项目中使用了Spring框架,这个插件可以帮助集成Struts 2和Spring,实现...

      Struts-2.0.12-lib

      6. **struts2-json-plugin.jar**:支持JSON数据格式的插件,允许Struts 2应用程序与AJAX或JSON接口进行交互。 7. **struts2-dojo-plugin.jar**:提供与Dojo JavaScript库集成的插件,用于创建富客户端界面。 8. **...

      struts-2.5.12-all.zip

      - `struts2-json-plugin`: 用于处理JSON数据,支持RESTful服务。 - `struts2-spring-plugin`: 集成Spring框架,进行依赖注入和AOP支持。 - `struts2-tiles-plugin`: 集成Tiles框架,方便布局和复用视图。 - `struts2...

      struts-2.5.16-lib.zip

      升级Struts2框架时,开发者需要确保按照官方文档或网络教程的步骤操作,以避免因版本不兼容导致的问题。这可能包括修改配置文件、更新依赖库、调整代码以适应新版本的API变化,以及进行充分的测试,以确保所有功能在...

    Global site tag (gtag.js) - Google Analytics