网上看到struts2+json的文章,很不错

转自:http://www.blogjava.net/mac521/archive/2008/01/11/174653.html
下载地址: http://code.google.com/p/jsonplugin/downloads/list

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

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

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

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

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

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

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

下面给出JSON的数据格式:

{

"doubleValue": 10.10,

"nestedBean": {

"name": "Mr Bean"

},

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

"firstName": "El Zorro"

}],

"array": [10, 20]

}

说明:

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

注释名
简介
默认值
序列化
反序列化

name
配置JSON中name
empty
yes
no

serialize
在serialization中
true
yes
no

deserialize
在deserialization中
true
no
yes

format
格式化Date字段
"yyyy-MM-dd'T'HH:mm:ss"
yes
yes


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

<!-- 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数据中,如果不想这样做,需要在配置时指定ignoreHierarchy为false:

<result type="json">

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

</result>

e. 枚举类型

默认处理枚举类型时,会被处理成JSON数据中name等于枚举中value而value等于枚举中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”这个必须在interceptor和result都要配置.

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对象,这个过程是Dojo给action中的方法创建了一个Proxy。因为这是异步调用过程,当远程方法执行的时候,它会返回一个对象到callback方法中。

f) 代理的对象

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

注意:这个参数只有在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) 使用方法

把插件的jar包copy到” /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
musachy
Add 'ignoreHierarchy' property to JSON result to allow serialization of properties on base classes
Win11 C盘瘦身终极指南:哪些能删/能移/不能碰?附详细目录清单 本文提供了一份详细的Win11 C盘瘦身终极指南,清晰区分了可安全删除、适合迁移以及绝对不能触碰的系统目录。文章不仅列出了具体的文件夹清单与操作建议,还介绍了使用符号链接和Robocopy进行安全迁移的高阶方法,并附带了自动化脚本,帮助用户从根本上解决C盘空间不足的问题,同时确保系统稳定。 阅读详情

相关推荐

struts2-json-plugin

struts2-json-plugin,Struts JSON插件

Struts2-Json-Plugin 的使用(翻译自官方文档)

Struts2 中要使用 Ajax 获得 Json 数据我认为目前还是 struts2-json-plugin 了。当然你你可以用手工用像 XStream、Google Gson、Jackson 这样的工具手工把 Java 对象转换成 Json 字符串再写往 Response 去,要写的代码自然多不了,还得留心字符集与 content type。而 struts2-json-plugin

hld_hepeng的专栏 1万+

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

赠送jar包:struts2-json-plugin-2.3.24.jar; 赠送原API文档:struts2-json-plugin-2.3.24-javadoc.jar; 赠送源代码:struts2-json-plugin-2.3.24-sources.jar; 赠送Maven依赖信息文件:struts2-json-plugin-2.3.24.pom; 包含翻译后的API文档:struts2-json-plugin-2.3.24-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.apache.struts:struts2-json-plugin:2.3.24; 标签:apache、struts2、plugin、strutsjson、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

json插件(struts2-json-plugin)的使用

struts2-json-plugin的使用

宏微的博客 5343

struts2-json-plugin-2.2.3 使用

最近在做struts+ajax+json项目,项目中使用了struts2-json-plugin-2.2.3.jar(一款json转化插件),研究了一段时间,今天来总结一下具体的使用过程。 使用struts2-json-plugin-2.2.3.jar需要理解以下几点:1、struts2-json-plugin-2.2.3.jar就是一个将对象属性转化成json的东东,2、要转化的对象中必须要有

u013864585的专栏 1755

Struts2插件 —— struts2-json-plugin-2.x.x

为了方便AJAX与服务器进行数据交换,struts2中加入的json插件可用于对象的序列化和反序列化。 相关JAR包 struts2-json-plugin.2.x.x.jar 修改Struts2配置文件 更改package元素的extends属性 span style="font-size:12px">package name="defaul

robbinBlog 1016

Extjs3.x Struts2 -Json-plugin学习实例 01

我写下这个一是为了自己学习的整理,另一是为了其它入门的网友,   相关的资料网上不多,有的都是一段代码一段代码的,好像没有完整,最起码我没有搜索到完整的,最近google好像不好使,只好fanqiang了访问。   代码非常的简单,就是列表、添加、编辑、删除等操作,但这是学习Ext整合Struts2项目,会了其它就OK了。哈哈。   这段时间我正在学习Ext,以前自己开发小项目时后...

wjt276的专栏 186

Struts2返回JSON数据的具体应用范例

转载自 yshjava的个人博客主页 《Struts2返回JSON数据的具体应用范例》 早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身,渐渐的也淡忘了此事。直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章,从头到尾将Strut

Dai丶Yu 536

JQuery EasyUI 的datagrid 整合Struts2的实现一 (基本实现)

ExtJS一个很好的,一个非常好的UI工具,但太庞大,太复杂了。对于一些简单的应用也没有必要使用。     最近在网上转着,发现了一款还不错的UI插件-----JQuery EasyUI。对于个人来说,对JQuery还比较熟悉,既然是基于JQuery的,也不妨试试。    JQuery EasyUI其实挺强大的,一些比较常用的比如 windows,tab,datagrid,pagination ,layout,menu,tree等都有,这已经可以构造一些比较实用的东东了。另一方面我发觉比较好的是,

gxjiang_iflytek的专栏 3975

Jquery autocomplete在struts2中的使用及体会(json plugin)

     struts2项目中需要在页面上使用jquery的autocomplete,在网上查到可以用struts2json plugin,就此麻烦开始。先下载了json0.34,老是提示出错,找不到某某方法,一看说是版本问题,我用的是struts2.1.6,按json plugin的网站说的,0.34应该支持struts2.1.x的,却不能支持。只好下载0.33来用,还不错,这次没有闹腾,顺利

Eddyx的专栏 2891

Struts2 的XSLTResult输出问题

一下内容为引用“今天本打算做一些基于XML的WebService接口,不料遇到了bug,折腾了一个下午带半个晚上,最后才在网上搜到原因和解决办法,特来分享。原本正常情况下,Struts2是支持将一个Action中的全部属性以XML形式输出的,这就是XSLTResult。在struts.xml中这样配置   class="org.lilystudio.winter.actions.servi

狂飙的蜗牛 2027

使用JQuery+Struts1.3实现JSON的post传递

json格式的数据传递已经红遍全球,JQuery的AJAX功能自然也可以对其进行进行传递。但是一般的传递都是使用GET方式进行的传递,如果内容不多,数据量不大那还是不错的。但是如果数据量比较大,使用get传递就不太适合,我们自然而然的想到了POST传递。     网上很多的说法都是使用流来读取请求流中的POST过来的数据。对于使用SSH越来越多的今天,写个doPost方法来接收数据其实并不合适,

810

SpringMVC和Struts2的区别

网上看到了这个问题, 突然想起之前没有仔细总结过, 于是写了这篇博客. 现在使用Struts2的公司估计是很少了, 除非是一些很久以前的历史遗留项目(很有可能是已经在重构的路上或者准备重构的路上了) 我的第一份工作使用的还是Struts2的框架, 在大概一年以后公司也使用SSM框架代替原有框架了. 现在估计很多公司是直接使用SpringCloud了, 个人感觉SpringCloud虽然好, 但是极个别情景下使用个人感觉有点杀鸡用牛刀, 不同微服务间的通信浪费了很多不必要的资源(采用http协议, 一般会使

yytoo2的博客 321

struts2学习笔记——struts2-json-plugin

介绍 使用Struts2-Json插件可以不用更改action中的任何代码,只需要在配置文件中进行配置即可。默认情况下它会将action中的所有对象序列化,这个序列化过程是递归的。 配置使用 以下面的studentAction为例进行演示: public class StudentAction extends ActionSupport { private StudentServ...

weixin_30911451的博客 241

Struts2——对JSON的支持(struts2-json-plugin.jar )

一、struts2对于JSON支持   struts2提供了一个struts2-json-plugin.jar 用于支持JSON的使用。当我们在struts2中使用JSON的时候必须导入struts2-json-plugin.jar并且需要一下几点: struts2-json-plugin.jar中struts-plugin.xml配置信息:需要转换jsonstruts.xml文件,其拦截器所在包

JAVA那些事 2480

struts的插件struts2-json-plugin

struts2-json-plugin插件支持struts返回json类型的结果 加载struts2-json-plugin插件 <dependency> <groupId>org.apache.struts</grou...

chengyin4096的博客 307

Struts2-json-plugin 的使用(翻译自官方文档)

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

fyqcdbdx的专栏 926

[记录]struts2json插件配置详解(附demo)

为了方便ajax调用传输数据,在struts2中加入的json插件用来做对象的序列化和反序列化,json插件的下载地址 http://code.google.com/p/jsonplugin/ 1. 下载json插件包,将jar包拷贝到WEB-INF/lib目录 注:struts2json插件有两个版本0.32和0.34,我用的struts2的版本是2.0.11,在加入0.34版本jso...

IT 292

springboot城市公交运营管理系统.docx

springboot城市公交运营管理系统

上一篇: struts2+json后action的返回要注意
下一篇: SSH+sitemesh
yangkaikai
博客等级 码龄18年 0粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值