背景
在实现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