JSON在Struts2中的正确玩法

来源:互联网 发布:钱夫人雪梨淘宝图片 编辑:程序博客网 时间:2024/04/29 00:55

      • 背景
      • 干货
        • 添加jar包
        • Struts2中如何配置
      • 翻译

背景

在实现ajax与后台传输数据的时候用到了json,按照网上的文章,不停地趟雷,身心俱疲(再次吐槽一下网上那些乱七八糟的文章);万念俱灰的时候只能去硬着头皮看官方的英文文档。这篇文章最后是我的翻译。

干货

添加jar包

首先需要几个jar包

    commons-lang    json-lib-2.3-jdk15    //版本与我可以不一致,只要和你的struts2兼容就可以    struts2-json-plugin-2.5.1 // 同上    ezmorph    commons-beanutils

一定要和你的struts2版本一致,最简单粗暴做法就是从官方下载的struts2完整包中复制(如果你没有Maven的话),这里的所有的包都是版本匹配的。

Struts2中如何配置

在Course这个Bean中

public class Course {    private int id;    private String name;    private Set<Student> studentSet = new HashSet<>();    @JSON(serialize = false)     public Set<Student> getStudentSet() {        return studentSet;    }    public void setStudentSet(Set<Student> studentSet) {        this.studentSet = studentSet;    }    //省略其他getter setter

在CourseAjax中

public class CourseAjax extends ActionSupport {    private List listCourse;    private String name;    private String passwd;    @JSON(serialize = false) //json化的时候不把这个field放进去    public String getPasswd() {        return passwd;    }    public void setPasswd(String passwd) {        this.passwd = passwd;    }    @JSON(name = "newName") // 指定json化之后该属性的名称为newName    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public List getListCourse() {        return listCourse;    }    public void setListCourse(List listCourse) {        this.listCourse = listCourse;    }    public String getCourses() {        //给name赋值        //给listCourse赋值        return SUCCESS;    }}

struts.xml中

 <action name="ajaxCourses" class="com.dh.actions.CourseAjax" method="getCourses">            <result name="success" type="json">                <!-- 不指定param节点,就是默认把当前这儿Action类的对象变成json格式,可以用注解控制把哪些属性json化,json化的时候名字是什么等等 -->            </result>        </action>

上面的配置执行的结果是

{    "listCourse":[        {            "id":1,            "name":"计算机程序设计"        },等等],    "newName":"aha"} /* 由此可见struts2把一个对象变成json,是按照他的set方法不断的递归的。 CourseAjax有setName方法,这个name属性被JSON(name="newName")注解了,所以json中就是"newName":"aha" CourseAjaxz中有setPasswd,但是这个passwd被 JSON(serialize = false) 注解了,所以json字符串中没有这一项, CourseAjaxz中有setListCourse,所以json中有listCourse,但是因为listCourse是一个集合类型,所以还要递归下去把集合中的每一项都json化,发现集合中的每一项的类型为Course,然后就json化Course的每一个属性,这个过程也受JSON注解的控制 */

<!-- 当你的action中有一个listCourse,你不想把Course的某一个或者几个Field json化,你可以在Course的相关Field的get方法上用JSON(serialize = false)注解,还可以用下面的方式 --><param name="excludeProperties">listCourse\[\d+\]\.studentSet</param><!-- param中间如果有多个,用‘,’隔开 --><!-- 如果你只想让这个list包含course的某一个或多个Field --><param name="includeProperties">listCourse\[\d+\]\.id,listCourse\[\d+\]\.name,listCourse\[\d+\]\.teacherNam</param>

更多关于param的用法参见官方文档

翻译

//todo

0 0
原创粉丝点击