一、struts2对于JSON支持
struts2提供了一个struts2-json-plugin.jar 用于支持JSON的使用。当我们在struts2中使用JSON的时候必须导入struts2-json-plugin.jar
并且需要一下几点:
struts2-json-plugin.jar中struts-plugin.xml配置信息:
需要转换json的struts.xml文件,其拦截器所在包必须继承json-default
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
<interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/>
<!-- Sample JSON validation stack -->
<interceptor-stack name="jsonValidationWorkflowStack">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="jsonValidation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
</package>
</struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="system" namespace="/system" extends="json-default">
<action name="elecUserAction_*" class="elecUserAction" method="{1}">
<!-- 如果List集合转换成json数组,如果是Object对象转换成json对象-->
<result name="findJctUnit" type="json">
<!-- \[\d+\]\ 表示多个集合数组 -->
<param name="includeProperties">\[\d+\]\.ddlCode,\[\d+\]\.ddlName</param>
</result>
<result name="checkUser" type="json">
<!-- root表示,root指定message就表示查找栈顶中是否有message属性,如果有直接通过message的get方法,获取值放置到栈顶 -->
<param name="root">message</param>-->
<param name="includeProperties">message</param>
</result>
</action>
</package>
</struts>
二、关于JSON在struts.xml中的一些属性的功能
代表排除Action中的哪些属性,排除多个属性时,使用逗号进行分隔(即不需要序列化的属性)
例:<param name="excludeProperties">age</param>
排除getAge()这个方法
代表包含Action中的哪些属性,包含多个属性:使用逗号进行分隔(即需要序列化的属性)
例:address包含getAddress()这个方法 为
代表排除Action中属性值为空的字段
例:<param name="excludeNullProperties">true</param>
使用true/false 默认为false(即包含属性值为null的字段)
代表从哪里开始序列化 。
例:<param name="root">person</param>
person对应的可以是一个属性,也可以是一个对象,也可以是一个集合
当在这里定义后,只会将person进行序列化,如果person是一个对象,则会将person对象中所有的getter方法都进行序列化
注意:如果相同属性同时定义了excludeProperties和includeProperties ,那么excludeProperties的优先级要高,因此不对该属性进行序列化
三、关于JSON在Action对象中注解的使用
对于JSON的注解的属性定义:
@JSON(name = "myname")
//在客户端接收到的JSON中UserName属性对应的地方为 :{myname:"张三"} 以前的则是{username:"张三"}
public String getUsername() {
return username;
}
@JSON(serialize=true) // 对该方法序列化,如果为false则不进行序列化
public String getUsername() {
return username;
}
@JSON(deserialize=true) //不对该方法序列化,如果为false则进行序列化
public String getUsername() {
return username;
}
@JSON(format="yyyy-MM-dd")//则客户端接收的JSON中date对应的值为: {date:"2011-10-2"}
public Date getDate() {
return date;
}
四、具体的实例:
package org.viancent.action;
import java.util.Date;
import org.apache.struts2.json.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;
public class GetJsonAction extends ActionSupport {
private String username;
private String password;
private int age;
private Date date;
@JSON(serialize = false)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@JSON(name="mypassword")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@JSON(format="yyyy-MM-dd")
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String execute() throws Exception {
this.setDate(new Date());
this.setAge(10);
this.setPassword("world");
this.setUsername("hello");
return SUCCESS;
}
}
<struts>
//这里一定要继承json-default
<package name="struts2" extends="json-default">
<action name="getjsons" class="org.viancent.action.GetJsonAction">
//这里一定要定义type属性为json
<result name="success" type="json">
//排除getAge()方法
<param name="excludeProperties">age</param>
</result>
</action>
</package>
</struts>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script type="text/javascript" src="WEB-JS/jquery-1.5.1.js"></script>
<script type="text/javascript"> //使用jquery实现异步提交
function getJson() {
$.post("/struts2/getjsons.action",{},function(returnedData,status){
if("success"==status){
alert(returnedData);
}
}
)
}
</script>
</head>
<body id="theBody">
<input type="button" value="GetJson" onclick="getJson();">
</body>
</html>
得到的结果为:{“date”:”2011-03-21”,”mypassword”:”world”}
使用浏览器的bug工具查看 alert(returnedData);弹出来的只是 [object,Object]
这里我们可以看见password的名称已经改为mypassword了 而设定那么的data属性,名称则没有变。