码农小汪-struts2学习9-json数据的返回

为啥子,我要说这个问题呢?实在是太流行的传递数据的方式,非常特别的就是作为手机客服端的时候,我们和服务器进行交流,这个是难免的,必须实行的手段,json作为当时,xml传递数据的代替者,还是非常的方便的。使用倒是很简单。

第一种方式啊,还是非常的简单,类似我们的servlet中的一样的

       PrintWriter out = response.getWriter();
        //将要被返回到客户端的对象
        User user=new User();
        user.setId("123");
        user.setName("JSONServlet");
        user.setPassword("JSON");
        user.setSay("Hello , i am a servlet !");
        JSONObject json=new JSONObject();
        json.accumulate("success", true);
        json.accumulate("user", user);
        out.println(json.toString());
        out.flush();
        out.close();
如上就是直接在servlet中执行的数据是一样的效果啊,在exe...这个方法中,不需要有返回值,直接把方法的返回值该为void 在xml配置文件中没得result这个属性,简单暴力的处理
package name="loginAction" namespace="/user" extends="struts-default">
        <action name="login" class="userAction" method="userLogin"></action>
        <action name="checkUser" class="userAction" method="checkUser"></action>
        <action name="register" class="userAction" method="register"></action>
    </package>
和以前没得什么变化的,都是简单的改变,没得返回值啦,这些都在一个方法体重的,因为是写的android的验证,所以没得result这个属性,也没有利用structs2中的json的处理方式,其实都可以的,只要可以得到解决的方案都是可以的。

利用属性设置来处理,

这个时候jsp页面可以的,如果在Android端的话或者通过ajax异步请求的也是不能得到结果的,这样的方式不可以的,我们不可以共享属性这种事情啊

User user = new User();
        user.setId("123");
        user.setName("Struts2");
        user.setPassword("123");
        user.setSay("Hello world !");
        JSONObject jsonObject=new JSONObject();
        jsonObject.accumulate("user", user);
        //这里在request对象中放了一个data,所以struts的result配置中不能有type="redirect" 
        ServletActionContext.getRequest().setAttribute("data", jsonObject.toString());
        return SUCCESS;

jsp页面只要简单的给个值就行了
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 ${data }

在Action中以Struts2的方式输出JSON数据

dataMap是Action中的一个属性值

        dataMap.clear();
        User user = new User();
        user.setId("123");
        user.setName("JSONActionStruts2");
        user.setPassword("123");
        user.setSay("Hello world !");
        dataMap.put("user", user);
        // 放入一个是否操作成功的标识
        dataMap.put("success", true);
        // 返回结果
        return SUCCESS;

在xml配置中怎么处理呢?

       package name="json" extends="json-default" namespace="/test">
        <action name="testByAction"class="json.demo.action.UserAction" >
            <result type="json">
<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
                <param name="root">dataMap</param>
            </result>
        </action>
</package>

我在文档中看到的,Json返回的属性中不止root这个属性可以设置的还有些其他的,我就讲一些可以用的吧,可能用的比较少,我觉得第一种比较实在点啊,不用配置。

  • 正则表达式的逗号分隔列表可以传递到JSON结果和拦截器,属性匹配这些正则表达式将被忽略在序列化过程:
<!-- Result fragment -->
<result type="json">
  <param name="excludeProperties">//不包括那些属性
    login.password,
    studentList.*\.sin
  </param>
</result>
  • Use the “root” attribute(OGNL expression) to specify the root object to be serialized.对跟对象进行序列化,只对她处理涩
<result type="json">
  <param name="root">和我们上面的一样
    person.job
  </param>
</result>

默认属性上定义基类的对象不会被序列化的“根”,序列化属性在所有基类(对象)设置“ignoreHierarchy”假的JSON结果:
By default properties defined on base classes of the “root” object won’t be serialized, to serialize properties in all base classes (up to Object) set “ignoreHierarchy” to false in the JSON result:
父亲的属性要不要包括进来,默认不包括的

<result type="json">
  <param name="ignoreHierarchy">false</param>
</result>

防止浏览器缓存响应

<result type="json">
  <param name="noCache">true</param>
</result>

不包括属性与零值

<result type="json">
  <param name="excludeNullProperties">true</param>
</result>

状态和错误代码

<result type="json">
  <param name="statusCode">304</param>
</result>

内容类型

<result type="json">
  <param name="contentType">text/html</param>
</result>

编码

<result type="json">
  <param name="encoding">UTF-8</param>
</result>

例子

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;
    }
}
import java.util.HashMap;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Result;

@Result(type = "json")
public class JSONExample extends ActionSupport {
// action code
把上面的放进来就行了
}

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>

输出的结果

{  
   "field1" : "str", 
   "ints": [10, 20],
   "map": { "John":"Galt" },
   "newName": "custom" }

doc中的也是看的查不多了…自己去看看吧,码农加油!
WW/docs/json-plugin.html

你可能感兴趣的:(STRUCTS2)