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
|
EN-U
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
struts2-json-plugin则支持JSON数据格式的交互,便于与AJAX应用集成。 3. **依赖库** - **Struts2与Spring集成(struts2-spring-plugin)**:允许开发者使用Spring管理Action和其它依赖,实现依赖注入,提高代码的可...
5. **Plugins**:Struts 2支持丰富的插件,比如 strut2-convention-plugin 自动配置插件,strut2-dojo-plugin 提供 dojo JavaScript 库的集成,strut2-json-plugin 支持JSON格式的数据交互。 描述中提到的“为了...
“插件”部分将介绍Struts2的扩展性,包括已有的插件如Struts2-dojo-plugin、Struts2-json-plugin等,以及如何开发自己的插件来增强框架功能。 此外,文档可能还会包含“异常处理”、“国际化”、“测试”等主题,...
3. **插件架构**:Struts2具有强大的插件支持,可以扩展其功能,如Struts2-dojo-plugin用于富客户端界面,Struts2-json-plugin支持JSON数据交换等。 4. **模板技术**:Struts2支持多种视图技术,如JSP、FreeMarker...
此外,Struts框架还提供了插件系统,允许开发者扩展其功能,例如Struts2-convention插件简化了配置,Struts2-dojo-plugin支持Dojo库进行AJAX交互,还有Struts2-json-plugin方便JSON数据的处理。这些在实际项目中都...
6. **插件支持**:Struts2具有丰富的插件库,如.tiles(用于页面布局)、struts2-dojo-plugin(提供Dojo JavaScript库的支持)、struts2-json-plugin(支持JSON数据交换)等,这些插件极大地丰富了Struts2的功能。...
5. **插件机制**:Struts2具有丰富的插件库,如Struts2-Convention插件可以自动发现Action,Struts2-dojo-plugin提供了与Dojo JavaScript库的集成,Struts2-json-plugin支持JSON响应。 6. **OGNL(Object-Graph ...
5. **插件体系**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin、Struts2-json-plugin等,支持Ajax、JSON等现代Web技术,方便开发富客户端应用。 6. **异常处理**:Struts2提供了一套完善的异常处理机制,可以...
2. 插件库:如struts2-convention-plugin.jar、struts2-dojo-plugin.jar等,提供了额外的功能,如自动配置、Dojo JavaScript库的集成。 3. 拦截器库:如struts2-interceptor.jar,包含Struts2内置的拦截器,用于实现...
14. ** strut2-json-plugin**: 支持JSON格式的数据交换,便于实现Ajax和移动应用。 通过阅读“Struts中文手册”,开发者不仅可以了解这些基本概念,还能深入学习如何配置Struts框架,编写Action类和ActionForm,...
7. **Struts2插件**:Struts2拥有丰富的插件库,如Struts2 Dojo Plugin支持Dojo库,Struts2 JSON Plugin提供JSON支持,Struts2 JUnit Plugin方便单元测试等。 **开发流程** 1. 创建Action类,定义业务逻辑方法。 2...
6. **插件系统**:Struts2拥有丰富的插件库,如Struts2-dojo-plugin支持Dojo库,Struts2-jquery-plugin支持jQuery,这些插件简化了前端交互的实现。 在这个"struts2.0中文帮助手册.chm"中,你可能会找到关于这些...
本章源自《Struts2完全学习手册》,由王伟平编著,清华大学出版社出版,主要涵盖了Struts2框架的深入理解和实践应用。 在Struts2框架中,核心概念包括Action、Result、Interceptor等。Action是业务逻辑的载体,它...
15. ** strut2-json-plugin**:Struts 2还支持JSON数据交换,方便前后端交互,适应现代Web应用的需求。 阅读Struts in Action中文手册,开发者可以深入理解Struts框架的内部工作原理,掌握其配置和使用技巧,从而...
10. ** strut2-struts1-plugin**:Struts2提供了一个插件,使得Struts1和Struts2的应用程序可以在同一项目中平滑过渡。 11. **ActionSupport与Interceptor**:在Struts2中,ActionSupport是Action类的基础类,包含...
2. **JSON结果类型**:在struts.xml中配置JSON结果类型,使Action可以返回JSON格式的数据,供Ajax请求接收。 3. **JQuery/Ajax库**:使用JQuery库发送Ajax请求,例如`$.ajax()`或`$.getJSON()`方法,与Struts2的...
8. **配置文件**:除了struts.xml,Struts 2还支持其他的配置文件,如struts-default.xml、struts-plugin.xml等,它们定义了框架的行为和默认设置。 9. **国际化与主题**:Struts 2支持多语言和自定义界面主题,...
3. **配置Spring**:创建`servlet-context.xml`,定义Bean和数据源,以及Struts2与Spring的整合配置,如使用`struts-plugin.xml`来启用Struts2的Spring插件。 最后,Hibernate作为ORM框架,负责数据库操作。整合...
2. **IoC (Inversion of Control)**:使用JSON格式的配置文件来实现依赖注入,支持声明式的切片管理。 3. **MVC (Model-View-Controller)**:采用注解风格的配置方式,内置了多文件上传功能,使得控制器的编写更加...