JSON在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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值