`
wolfandlili
  • 浏览: 77627 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

struts2-json-plugin中文手册

阅读更多

      Apache提供的一个插件包,可以把Action中的数据以JSON做个封装然后返回。

 

    它会将整个action中的变量转化为JSON数据(根对象在JSON中数据添加一个”root”标识)。如果要使用它,Action必须遵循以下几点:

1.       返回的页面类型中”content-type”必须是”application/json”.(这个已经Internet Community采用).

2.       JSON内容必须是符合格式要求的.

3.       Actionfield必须有publicset方法.(是不是没有set方法就不会将field添加到JSON数据中,有待验证).

4.       它支持的类型有: 基本类型(int,long...String), Date, List, Map, Primitive Arrays, 其它class, 对象数组.

5.       JSON中任何的Object会被封装在listmap中,数据会被封装程Long,如果是含有的数据则会被封装程Double,数组会被封装程List.

下面给出JSON的数据格式:

{

   "doubleValue": 10.10,

   "nestedBean": {

      "name": "Mr Bean"

   },

   "list": ["A", 10, 20.20, {

      "firstName": "El Zorro"

   }],

   "array": [10, 20]

}

说明:

a.       这个插件支持以下几个注释:

注释名

简介

默认值

序列化

反序列化

name

配置JSONname

empty

yes

no

serialize

serialization

true

yes

no

deserialize

deserialization

true

no

yes

format

格式化Date字段

"yyyy-MM-dd'T'HH:mm:ss"

yes

yes

可以通过配置来显示指出要放在JSONfield,其中有个自己的验证规则需要研究.

<!-- Result fragment -->

<result type="json">

  <param name="excludeProperties">

    login.password,

    studentList.*\.sin

  </param>

</result>

<!-- Interceptor fragment -->

<interceptor-ref name="json">

  <param name="enableSMD">true</param>

  <param name="excludeProperties">

    login.password,

    studentList.*\.sin

  </param>

</interceptor-ref>

b.       根对象

 <result type="json">

  <param name="root">

    person.job

  </param>

</result>

也可以使用拦截器配置操作父对象

<interceptor-ref name="json">

  <param name="root">bean1.bean2</param>

</interceptor-ref>

c.       JSON数据用注释封装

如果wrapWithComments设置为true(默认值为false),则生成的JSON数据会变成这样:

/* {

   "doubleVal": 10.10,

   "nestedBean": {

      "name": "Mr Bean"

   },

   "list": ["A", 10, 20.20, {

      "firstName": "El Zorro"

   }],

   "array": [10, 20]

} */

这样做可以避免js中一些潜在的风险,使用时需要:

Var responseObject = eval("("+data.substring(data.indexOf("\/\*")+2, data.lastIndexOf("\*\/"))+")");

d.       父类

“root”对象中父类的field不会默认存放到JSON数据中,如果不想这样做,需要在配置时指定ignoreHierarchyfalse:

<result type="json">

  <param name="ignoreHierarchy">false</param>

</result>

e.       枚举类型

默认处理枚举类型时,会被处理成JSON数据中name等于枚举中valuevalue等于枚举中name.

public enum AnEnum {

     ValueA,

     ValueB

  }

  JSON:  "myEnum":"ValueA"

如果在处理枚举类型时,在xml中配置了enumAsBean,则会被当作一个Bean处理,在JSON数据中会有一个特别的属性”_name”值为name().这个枚举中的所有属性都会被处理.

public enum AnEnum {

     ValueA("A"),

     ValueB("B");

     private String val;

     public AnEnum(val) {

        this.val = val;

     }

     public getVal() {

        return val;

     }

   }

  JSON:  myEnum: { "_name": "ValueA", "val": "A" }

Xml中配置:

<result type="json">

  <param name="enumAsBean">true</param>

</result>

f.        例子

a)         Action

import java.util.HashMap;

import java.util.Map;

import com.opensymphony.xwork2.Action;

public class JSONExample {

    private String field1 = "str";

    private int[] ints = {10, 20};

    private Map map = new HashMap();

    private String customName = "custom";

    //'transient' fields are not serialized

    private transient String field2;

    //fields without getter method are not serialized

    private String field3;

    public String execute() {

        map.put("John", "Galt");

        return Action.SUCCESS;

    }

    public String getField1() {

        return field1;

    }

    public void setField1(String field1) {

        this.field1 = field1;

    }

    public int[] getInts() {

        return ints;

    }

    public void setInts(int[] ints) {

        this.ints = ints;

    }

    public Map getMap() {

        return map;

    }

    public void setMap(Map map) {

        this.map = map;

    }

    @JSON(name="newName")

    public String getCustomName() {

        return this.customName;

    }

}

b)        Xml配置

 <?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

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

<struts>

  <package name="example"  extends="json-default">

     <action name="JSONExample" class="example.JSONExample">

        <result type="json"/>

     </action>

  </package>

</struts>

这里有两个地方需要注意:

1)      需要继承json-default

2)      <result>签的定义

c)         JSON数据

 { 

   "field1" : "str",

   "ints": [10, 20],

   "map": {

       "John":"Galt"

   },

   "newName": "custom"

}

d)        JSON RPC

JSON插件可以在js中调用action方法,返回执行结果。这个已经在dojo中有了实现,可以用Simple Method Definition调用远程服务。来一起看看下面的例子:

首先写一个Action

package smd;

import com.googlecode.jsonplugin.annotations.SMDMethod;

import com.opensymphony.xwork2.Action;

 

public class SMDAction {

    public String smd() {

        return Action.SUCCESS;

    }

    @SMDMethod

    public Bean doSomething(Bean bean, int quantity) {

        bean.setPrice(quantity * 10);

        return bean;

    }

}

e)         方法必须用SMDMethod加上注解,这样才能被远程调用,为了安全因素。这个方法会产生一个bean对象,实现修改价格的功能。Action被添加上SMD注解会生成一个SMD,同时参数也会被加上SMDMethodParameter注解。像你所看到的,Action中定义了一个空方法:smd。这个方法是作为Simple Method Definition (定义class中提供的服务),在struts.xml配置<result>时使用type属性值为”json”

下面是bean的定义:

package smd;

 

public class Bean {

    private String type;

    private int price;

   

    public String getType() {

        return type;

    }

    public void setType(String type) {

        this.type = type;

    }

    public int getPrice() {

        return price;

    }

    public void setPrice(int price) {

        this.price = price;

    }

 

}

Xml文件:

<package name="RPC" namespace="/nodecorate" extends="json-default">

    <action name="SMDAction" class="smd.SMDAction" method="smd">

        <interceptor-ref name="json">

            <param name="enableSMD">true</param>

        </interceptor-ref>

        <result type="json">

             <param name="enableSMD">true</param>

        </result>

    </action>

</package>

这里需要注意一点:” enableSMD”这个必须在interceptorresult都要配置.

Js代码:

<s:url id="smdUrl" namespace="/nodecorate" action="SMDAction" />

<script type="text/javascript">

    //load dojo RPC

    dojo.require("dojo.rpc.*");

    //create service object(proxy) using SMD (generated by the json result)

    var service = new dojo.rpc.JsonService("${smdUrl}");

    //function called when remote method returns

    var callback = function(bean) {

        alert("Price for " + bean.name + " is " + bean.price);

    };

    //parameter

    var bean = {name: "Mocca"};

    //execute remote method

    var defered = service.doSomething(bean, 5);

    //attach callback to defered object

    defered.addCallback(callback);

</script>

JsonService会发出一个请求到action加载SMD,同时远程方法会返回一个JSON对象,这个过程是Dojoaction中的方法创建了一个Proxy。因为这是异步调用过程,当远程方法执行的时候,它会返回一个对象到callback方法中。

f)         代理的对象

当使用的注解不是继承自Java,可能你使用代理会出现一些问题。比如:当你使用aop拦截你的action的时候。在这种情况下,这个插件不会自动发现注解的方法。为了避免这种情况发生,你需要在xml中配置ignoreInterfacesfalse,这样插件会自己查找注解的所有接口和父类。

注意:这个参数只有在Action执行的过程是通过注解来运行的时候才应该设为false

<action name="contact" class="package.ContactAction" method="smd">

   <interceptor-ref name="json">

      <param name="enableSMD">true</param>

      <param name="ignoreInterfaces">false</param>

   </interceptor-ref>

   <result type="json">

      <param name="enableSMD">true</param>

      <param name="ignoreInterfaces">false</param>

   </result>

   <interceptor-ref name="default"/>

</action>

g)        使用方法

把插件的jarcopy” /WEB-INF/lib”就可以了。

h)        版本历史

Version

Date

Author

Notes

0.19

Nov 02, 200t

musachy

Return a JSON error instead of execeptions. Some bug fixes and refactoring. Thanks Joe Germuka and the other anonymous guys

0.18

Aug 10, 2007

musachy

Add SMDMethodsHack, fix 16 ,18 ,21 thanks for the patches guys!

0.17

Aug 10, 2007

Oleg Mikheev

Ignore properties matching 'excludedProperties' when generating SMD

0.16

Jul 27, 2007

musachy

Resolve issue where method is evaluated even if its result is ignored (#14)

0.15

Jul 18, 2007

musachy

Add excludedProperties attribute to interceptor

0.14

Jun 27, 2007

musachy

Add root (OGNL expression) attribute to interceptor

0.13

Jun 14, 2007

EN-U

分享到:
评论

相关推荐

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

    中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...

    struts2.x所需要的支持类库,内附struts2的学习资料

    struts2-json-plugin则支持JSON数据格式的交互,便于与AJAX应用集成。 3. **依赖库** - **Struts2与Spring集成(struts2-spring-plugin)**:允许开发者使用Spring管理Action和其它依赖,实现依赖注入,提高代码的可...

    struts-2.3.25-all.zip part1

    5. **Plugins**:Struts 2支持丰富的插件,比如 strut2-convention-plugin 自动配置插件,strut2-dojo-plugin 提供 dojo JavaScript 库的集成,strut2-json-plugin 支持JSON格式的数据交互。 描述中提到的“为了...

    struts2官方中文帮助文档.chm

    “插件”部分将介绍Struts2的扩展性,包括已有的插件如Struts2-dojo-plugin、Struts2-json-plugin等,以及如何开发自己的插件来增强框架功能。 此外,文档可能还会包含“异常处理”、“国际化”、“测试”等主题,...

    struts2.0中文帮助手册

    3. **插件架构**:Struts2具有强大的插件支持,可以扩展其功能,如Struts2-dojo-plugin用于富客户端界面,Struts2-json-plugin支持JSON数据交换等。 4. **模板技术**:Struts2支持多种视图技术,如JSP、FreeMarker...

    Struts应用开发完全手册源代码

    此外,Struts框架还提供了插件系统,允许开发者扩展其功能,例如Struts2-convention插件简化了配置,Struts2-dojo-plugin支持Dojo库进行AJAX交互,还有Struts2-json-plugin方便JSON数据的处理。这些在实际项目中都...

    struts2帮助文档

    6. **插件支持**:Struts2具有丰富的插件库,如.tiles(用于页面布局)、struts2-dojo-plugin(提供Dojo JavaScript库的支持)、struts2-json-plugin(支持JSON数据交换)等,这些插件极大地丰富了Struts2的功能。...

    struts2权威指南.rar

    5. **插件机制**:Struts2具有丰富的插件库,如Struts2-Convention插件可以自动发现Action,Struts2-dojo-plugin提供了与Dojo JavaScript库的集成,Struts2-json-plugin支持JSON响应。 6. **OGNL(Object-Graph ...

    struts2权威指南

    5. **插件体系**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin、Struts2-json-plugin等,支持Ajax、JSON等现代Web技术,方便开发富客户端应用。 6. **异常处理**:Struts2提供了一套完善的异常处理机制,可以...

    struts2全部文件

    2. 插件库:如struts2-convention-plugin.jar、struts2-dojo-plugin.jar等,提供了额外的功能,如自动配置、Dojo JavaScript库的集成。 3. 拦截器库:如struts2-interceptor.jar,包含Struts2内置的拦截器,用于实现...

    Struts中文手册.rar

    14. ** strut2-json-plugin**: 支持JSON格式的数据交换,便于实现Ajax和移动应用。 通过阅读“Struts中文手册”,开发者不仅可以了解这些基本概念,还能深入学习如何配置Struts框架,编写Action类和ActionForm,...

    struts2帮助手册(英文chm)

    7. **Struts2插件**:Struts2拥有丰富的插件库,如Struts2 Dojo Plugin支持Dojo库,Struts2 JSON Plugin提供JSON支持,Struts2 JUnit Plugin方便单元测试等。 **开发流程** 1. 创建Action类,定义业务逻辑方法。 2...

    struts2 帮助文档

    6. **插件系统**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin支持Dojo库,Struts2-jquery-plugin支持jQuery,这些插件简化了前端交互的实现。 在这个"struts2.0中文帮助手册.chm"中,你可能会找到关于这些...

    Struts2完全学习手册源代码第21章

    本章源自《Struts2完全学习手册》,由王伟平编著,清华大学出版社出版,主要涵盖了Struts2框架的深入理解和实践应用。 在Struts2框架中,核心概念包括Action、Result、Interceptor等。Action是业务逻辑的载体,它...

    struts in action中文手册

    15. ** strut2-json-plugin**:Struts 2还支持JSON数据交换,方便前后端交互,适应现代Web应用的需求。 阅读Struts in Action中文手册,开发者可以深入理解Struts框架的内部工作原理,掌握其配置和使用技巧,从而...

    Struts中文手册

    10. ** strut2-struts1-plugin**:Struts2提供了一个插件,使得Struts1和Struts2的应用程序可以在同一项目中平滑过渡。 11. **ActionSupport与Interceptor**:在Struts2中,ActionSupport是Action类的基础类,包含...

    struts2 ajax 实例

    2. **JSON结果类型**:在struts.xml中配置JSON结果类型,使Action可以返回JSON格式的数据,供Ajax请求接收。 3. **JQuery/Ajax库**:使用JQuery库发送Ajax请求,例如`$.ajax()`或`$.getJSON()`方法,与Struts2的...

    struts 使用手册

    8. **配置文件**:除了struts.xml,Struts 2还支持其他的配置文件,如struts-default.xml、struts-plugin.xml等,它们定义了框架的行为和默认设置。 9. **国际化与主题**:Struts 2支持多语言和自定义界面主题,...

    ssh框架操作手册

    3. **配置Spring**:创建`servlet-context.xml`,定义Bean和数据源,以及Struts2与Spring的整合配置,如使用`struts-plugin.xml`来启用Struts2的Spring插件。 最后,Hibernate作为ORM框架,负责数据库操作。整合...

    Nutz官方手册

    2. **IoC (Inversion of Control)**:使用JSON格式的配置文件来实现依赖注入,支持声明式的切片管理。 3. **MVC (Model-View-Controller)**:采用注解风格的配置方式,内置了多文件上传功能,使得控制器的编写更加...

Global site tag (gtag.js) - Google Analytics