结论一:
<action name="" class="">
<result name="" type="json">
</result>
</action>
如果在struts.xml中有以上代码,那么Action中的东西将无法再用Struts2的标签取到,利用<s:debug></s:debug>你可以观察到此时Value Stack Contents和Stack Context根本不存在Action中的属性、方法等东西。
结论二:
关于<result type="json">下<paramt></param>标签的参数配置问题。
<result type="json">
<!-- root参数只会返回根层对象,以前我总是自己将Action中要返回前台的数据(如List)封装在jsonResult,然后配置root,可这样防线无法取到Acion中的其它东西,所以现在用结论三和四里的方法了-->
<param name="root">jsonResult</param>
<!-- 指定是否序列化空的属性 -->
<param name="excludeNullProperties">true</param>
<!-- 这里指定将序列化dataMap中的那些属性 -->
<param name="includeProperties">
userList.*
</param>
<!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化 -->
<param name="excludeProperties">
SUCCESS
</param>
</result>
结论三-配置实例:
Action部分代码
private String name;
private List<Dept> deptList;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Dept> getDeptList() {
return deptList;
}
public void setDeptList(List<Dept> deptList) {
this.deptList = deptList;
}
struts.xml部分代码
<package name="s2sh_json" extends="json-default" namespace="/departmentJSon">
<action name="deptJSon" class="deptJSon">
<result name="deptListWithJSon" type="json">
<param name="includeProperties">name,deptList.*</param>
</result>
</action>
</package>
注意:extends必须是json-default;
includeProperties中Action想要以json数据格式返回的属性除了String等基本类型外,其它都必须加.*(如此处的deptList.*,当然如果有valueBean也要这样);
项目中必须加入struts2-json-plugin.jar和commons-lang.jar这两个jar包。
Jsp中JQery部分代码
$.ajax({cache:false,
type:"post",
dataTyp:"json",
url:"<%=basePath%>departmentJSon/deptJSon!getAllDeptByAjax.action",
success:function(data) {
alert(data.name);
$.each(data.deptList, function(i, one) {
result = "<tr align='center'><td>"+one.dno+"</td><td>"+one.dname+"</td><td>"+one.dloc+"</td></tr>";
$(result).appendTo("#deptListDiv");
});
}
});
结论四-另一个配置实例:
如果不喜欢在struts.xml中配置<param name="includeProperties">name,deptList.*</param>,那么可以采用在Action写annotation,可以达到相同的效果。
struts.xml的配置如结论三中的,但是去掉<param name="includeProperties">name,deptList.*</param>。
而Action部分代码如下,关于@JSON中参数设置可以自己百度,常用的也就serialize。
private String name;
private List<Dept> deptList;
@JSON(serialize=true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JSON(serialize=true)
public List<Dept> getDeptList() {
return deptList;
}
public void setDeptList(List<Dept> deptList) {
this.deptList = deptList;
}
结论五-SpringMVC中的配置实例:
在springmvc中由于@ResponseBody返回的是可序列化的对象,因此只要将结果利用一些工具类事先转换为json对象,那么就能够返回给前端。
@RequestMapping(value = "/closingDetailView")
@ResponseBody
public JSONArray closingDetailView(@RequestParam(value = "closingId", required = true) String closingId)
{
List<ClosingDetail> detailList = closingDetailService.queryClosingDetailForListByClosingId(closingId);
JSONArray jsonArray = JSONArray.fromObject(detailList);
return jsonArray;
}