json是一种数据格式,struts2中,通过引入struts2-json-plugin.jar。编写Struts2的Action类:
public class LoginAction extends ActionSupport{ private String name;//普通属性 private Teacher teacher;//类属性 private List<Student> students;//集合 ......省略get,set public String returnName(){ name = "12312312"; return success; } public String returnTeacher(){ teacher = new Teacher("wang",29); } public String returnList(){ students = new ArrayList<Student>(); Student s1 = new Student("li",13); Student s2 = new Student("zhang",13); students .add(s1); students .add(s2); return success; } }
在struts.xml中配置action,这个地方是重点:
1.要继承json-default包
2.resulst 的type要设置为json
3.对于普通属性和普通类属性,直接<param name="includeProperties">属性名</param>指定要返回的属性。
但返回集合属性时,需要使用正则表达式了。
<package name="json" extends="json-default" > <action name="loginAction" class="loginAction" method="xxx"> <result name="success" type="json"> <!------- includeProperties 指定包括的属性---------> <param name="includeProperties">name</param> </result> </action> </package> <package name="json" extends="json-default" > <action name="loginAction" class="loginAction" method="xxx"> <result name="success" type="json"> <!------- includeProperties 指定包括的属性---------> <param name="includeProperties">teacher</param> </result> </action> </package> <action name="loginAction" class="loginAction" method="xxx"> <result name="success" type="json"> <!--如果返回的结果为集合,需要使用正则表达式来指定集合中实体的属性---> <param name="includeProperties"> students\[\d+\]\.name, styles\[\d+\]\.age </param> </result> </action> </package>
在页面中写js代码
function callback(data){
//在js中使用eval('(' + json字符串 +')'),来转换为json对象。一定要加上'(' 和')'
var jsonObj= eval( '(' + data+ ')' );
1.data为对应action中的普通属性
//如果data对应的是普通属性时,可以直接使用json对象.属性名的形式来使用该值
document.getElementById("show").innerHTML = "name:"+jsonObj.name;
2.data对应action中类属性
//如果打他对应的是类属性,可以使用json对象.类属性.属性,来使用该类属性的属性值。
document.getElementById("show").innerHTML = "name:"+jsonObj.teacher.name;
3.data对应是集合属性
//可以使用json对象.集合属性名,来得到该集合,然后遍历
for(var i = 0;i<list.styles.length;i++){
var style = list.styles[i];
select.append("<option value='"+ style.name +"'>"+style.name+"</option>");
}