struts2-json-plugin中文手册

      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

Android布局基础与UI设计入门:打造精美应用界面 恭喜你!现在你已经掌握了Android UI开发的基础知识,包括各种布局类型、常用控件的使用以及一些UI优化技巧。这些知识将帮助你设计出既美观又实用的Android应用界面。 阅读详情

相关推荐

即梦AI使用教程

摘要: 即梦AI是字节跳动推出的多模态AI创作平台,整合图片、视频、智能编辑功能,基于OmniHuman模型支持中英日三语操作。核心特点包括: 技术升级:4.0版本强化中文语义理解与微观表现力,新增故事分镜生成; 创作功能:支持文本/图片转视频、AI对口型、商业级抠图与多图层融合; 用户友好:移动/网页双端适配,灵感社区复用提示词,剪映生态无缝衔接; 应用场景:覆盖电商换装、虚拟主播、设计融合等需求,未来将开放API拓展生态。 (字数:149)

专业深耕,技术前沿 6300

struts2之json请求的异常处理方案

大家都知道,使用struts2的异常处理机制,几要几行配置,就可以在发生异常时,跳转到我们指定的页面,并显示出相应的异常信息,具体的使用操作过程如下: 1)struts.xml                          ...      login /WEB-INF/view/404.jsp /WEB-INF/view/500.jsp

无意摘花 1万+

struts2响应JSON数据遇到的问题

今天做了一个原以为很简单的异步查询功能,结果折腾了很久才发现问题,这里做一下记录。 公司的后管平台,前端框架采用的struts2,要修改点功能,其中涉及到一个异步请求。 问题如下: js发起ajax异步请求到后端,后台将一个List集合以JSON形式响应,断点跟代码后台一切正常,但是响应到前端时直接返回了定义好error页面。即下图中映射的error.jsp 并且后台也没有任何错误日志...

迈克擂的博客 722

零基础学simulink仿真建模--基于Simulink进行农业机械用开关磁阻电机的仿真建模

特点结构简单:无电刷、换向器等易损件,维护成本低。坚固耐用:适合恶劣的工作环境,如农业机械作业现场。宽调速范围:通过适当的控制策略可以实现较宽的速度调节范围。挑战非线性特性:SRM的电磁特性和转矩特性具有高度非线性。复杂性:涉及电气、机械动力学以及控制系统的设计与集成。实时性要求:需要快速响应以适应不断变化的操作条件。多变量优化:包括电流控制、速度控制等多个方面需综合考虑。使用Simscape Electrical库来构建一个开关磁阻电机模型。

amy_mhd的博客 909

张量积曲面:数学原理与Python实现

Suv∑i0m∑j0nPij⋅Bipu⋅BjqvSuvi0∑m​j0∑n​Pij​⋅Bip​u⋅Bjq​v其中PijP_{i,j}Pij​是控制点网格,BipuB_i^p(u)Bip​u和BjqvB_j^q(v)Bjq​v是基函数,分别沿uuu和vvv方向定义。

T20151470的博客 1155

json 与 struts2

下载地址: http://code.google.com/p/jsonplugin/downloads/list               Apache提供的一个插件包,可以把Action中的数据以JSON做个封装然后返回。 它会将整个action中的变量转化为JSON数据(根对象在JSON中数据添加一个”root”标识)。如果要使用它,Action必须遵循以下几点: 1.       返...

dong_java 183

喷涂机器人系列编程:ABB IRB 5500_(7).喷涂质量控制与优化

通过编程手段对ABB IRB 5500喷涂机器人进行质量控制和优化,可以显著提高喷涂的均匀性和附着力,减少涂层缺陷。具体的方法包括喷涂参数的调整、路径规划的优化、喷涂效果的检测与反馈,以及喷涂参数的动态调整。综合评估系统可以进一步确保喷涂质量的稳定性和一致性,帮助汽车制造企业提高产品质量和生产效率。

zhubeibei168的博客 851

Struts2框架接受/返回json数据

Struts接口可以从流中接受json数据并解析,并以流的形式返回给前端。如下所示: public class testController extends ActionSupport{ private InputStream inputStream; private String getRequestPostData(HttpServletRequest request)...

乐点的博客 947

【算能】TPU-MLIR 工具链之model_deploy

model_deploy.py 是算能 TPU-MLIR 工具链中实现模型高效部署的核心组件,通过灵活的量化配置与硬件优化,可在 ​精度损失 ≤1% 的前提下实现 ​3-5 倍加速。开发者需重点关注校准数据质量、混合精度策略及硬件兼容性

浩瀚之水的专栏 288

9.20华为OD机试真题 新系统 - 字符串分组求和 (Java/Py/C/C++/Js/Go)

9.20华为OD机试真题 新系统 - 字符串分组求和 (Java/Py/C/C++/Js/Go)

算法大师! 582

Struts2 + Json _ 配置,异常解决及深入了解Struts2返回JSON数据的原理及具体应用范例...

在struts2的基础上 配置 struts2还需要的包: commons-lang-2.4.jar; json-lib-2.3-jdk13.jar; jsonplugin-0[1].32.jar; ezmorph-1.0.2.jar; commons-beanutils-1.7.0...

cidaibian1932的博客 212

15、z/OS 优化配置与迁移实践

本文详细探讨了z/OS环境的优化配置与迁移实践,涵盖DASD存储库管理、用户目录更新、环境更新意义以及不同场景下的迁移案例。通过单笔记本系统和服务器级机器的实例,展示了迁移流程和关键要点,包括DASD文件创建、设备映射更新、系统重启初始化以及数据备份等步骤。文章还总结了迁移过程中的注意事项,并展望了未来z/OS优化的发展趋势,为z/OS系统的稳定运行和高效管理提供了实用指导。

zzz56的博客 129

解决struts2-json-plugin中GZIP压缩中文乱码问题

    当使用struts2的struts2-json-plugin输出接送数据时,如果配置enableGZIP为true,发现竟然有中文乱码问题。查看源代码,果然有一小小问题,所以干脆动手自己修改吧。  1.首先在struts.xml中加入下面的代码: &lt;!-- 修正struts2-json-plugin-2.1.8.1中enableGZIP为true时中文乱码问题 --&gt; ...

guofengcn的专栏 342

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

struts2 jquery ajax json,JQuery,AJAX,Struts2传送JSON数据

JQuery,AJAX,Struts2传送JSON数据。示例说明:整合Struts2的项目中,使用JQuery或AJAX传送JSON数据,实现页面无刷新更新数据。环境:Struts-2.3.4 JQuery-1.8.0其他说明:要传送JSON数据,另外需要几个Jar文件,拿我使用Struts2.3.4来说,要在struts2-blank的基础上额外导入的Jar文件是commons-logging...

weixin_31710835的博客 260

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

struts2通过JSON插件实现异步加载ajaxAcion

一、 添加jar包struts2-json-plugin-2.3.4.jar json-lib-2.3-jdk15.jar ezmorph-1.0.6.jar二、 写一个AjaxCheckAction异步加载类//定义一个User的成员变量 //给该变量添加getter和setter方法 //执行业务操作,将响应数据赋值给该成员变量public class AjaxCheckAction

北京Java青年 664

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

struts2中实现返回json格式请求

struts2作为一个mvc框架,请求一个方法,返回一个页面,当post请求成功之后,跳转到success页面,大多数情况下能够满足我们的要求,但是web开发中ajax技术的使用是不可避免的,我们知道ajax请求大多数情况下需要的数据是json格式。我们如何让struts这个mvc框架作为一个restful服务器,提供rest api,显得尤为重要,虽然这时候不能完全体现mvc框架的职能。 st...

feinifi的博客 2万+

Struts2 返回json对象

Strust2 的JSON插件提供了一个可以返回“JSON”结果类型的序列化动作。序列化过程是递归的,这意味着整个对象图,动作类(基类不包括在内)将被序列化(根对象可以使用的“root”属性定制)。如果使用拦截器,动作将是从JSON内容请求填充。 案例:返回json对象

3582

Struts2返回JSON对象的方法总结

一、为什么struts2要返回json       如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持。但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况。本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于

followMyInclinations的专栏 862

Struts2返回JSON对象的方法。

转载自品略图书馆http://www.pinlue.com/article/2020/03/2010/0610037658134.html 如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持。但是,在开发工作中,对功能的升级是基于既定...

yihuliunian的博客 199

Struts2,Spring,Struts2 JSON-plugin,JQueryAJAX on GAE

     建了第一个应用,简单了解了在gae上开发应用程序的一般规则,开发个有意思的应用就打算用框架开发,用单纯的servlet开发文件多了就难以管理了而且效率会很底,决定用框架,在网上看到这几篇文章一般都是用Struts +Spring,也看到过用pay这个框架的,有兴趣的可以上这个网站去看一下http://www.playframework.org/ , 以下就是转载的。流行的SSH组合没

如是所来的专栏 2319

Struts2返回JSON

如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持。但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况。本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的。    Struts2返回JS

Miss_kun的专栏 820

Struts2+json+ajax

导包:struts2-json-plugin.jar包 设置要返回的数据源 在struts.xml中 一旦为Action指定了该结果处理类型,Action里的数据序列化成JSON格式的数据, 并返回给客户端物理视图的JavaScript 。 该拦截器的包都要继承自json-default 在*.jsp显示页面中 在jquery1.7 中文手册中可以查看到ajax请求有6中方式:

iron李的博客 296

struts2学习 json数据返回

方法1: 通过在outpuutStream中写入数据的fang shi

西红柿炒土豆 713

Struts2 Result 返回JSON对象详解

如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持。但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况。本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的。   Struts2返回J

qq_29663071的博客 2145
上一篇: gson(Java的JSON类库)java对象和json互换
下一篇: pager-taglib的安装和使用入门
w3053_5fdf588
博客等级 码龄18年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值