我想使用 jQuery 向我的 Struts 操作发送 Ajax
POST
请求,如下所示:
$.ajax({
type: "POST",
url: "ds/query",
data :JSON.stringify(data),
dataType:"json",
contentType: "application/json; charset=utf-8",
success : function(d, t, x){
console.log(x);
}
});
我的动作配置:
<package name="ds" namespace="/ds" extends="json-default">
<action name="query" class="gov.cbrc.gzbanking.action.DataServiceAction" method="query">
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
<result type="json">
<param name="noCache">true</param>
<param name="excludeNullProperties">true</param>
<param name="root">qRes</param>
</result>
</action>
</package>
我的动作课:
public class DataServiceAction {
private QueryRequest qReq;
private QueryResponse qRes;
public QueryRequest getQr() {
return qReq;
}
public void setQr(QueryRequest qReq) {
this.qReq = qReq;
}
public QueryResponse getqRes() {
return qRes;
}
public void setqRes(QueryResponse qRes) {
this.qRes = qRes;
}
public String query() throws Exception{
App.getLogger().debug(qReq.toString());
String dsClz = SysCodes.getCodeItem("data_service", qReq.getDs()).getConfig1();
Class<?> dsCls = Class.forName(dsClz);
if(!DataService.class.isAssignableFrom(dsCls)){
throw new Exception("specified class does't implement DataService interface.");
}else{
DataService ds = (DataService) dsCls.newInstance();
System.out.println(JsonUtil.toJson(ds.query(qReq)));
qRes = ds.query(qReq);
}
return ActionSupport.SUCCESS;
}
}
QueryRequest
和QueryResponse
只是Java bean,当我执行代码时,服务器可以读取JSON数据并毫无错误地完成其工作,并且我确信QueryResponse
对象已填充了数据。但我可以'在客户端没有得到任何东西,responseText
和responseJson
都是null
。
为什么 struts2-json-plugin 没有自动将我的
QueryResponse
对象转换为 JSON 字符串?
我的
QueryResponse
班级:
public class QueryResponse {
private int total;
private List<?> data;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<?> getData() {
return data;
}
public void setData(List<?> data) {
this.data = data;
}
}
列表包含的数据的实际类型必须在运行时确定,例如,如果数据包含
Role
对象列表:
包 gov.cbrc.gzbanking.domain;
public class Role {
private String id;
private String name;
private String remark;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那么预期的结果是这样的:
{
total : "1", data :[{"id":"admin", "name":"admin role"}]
}
因为你使用的是Struts2。 Struts2 用于将属性名称大写来解析 getter 方法,在“get”方法名称可以解析属性
"qRes"
之前,将其大写为 "QRes"
并以“get”为前缀。因此,方法名称将是getQRes
。 您可以从结果中删除 root
参数,看看是否可以使用它,或者将 getter 方法名称重命名为
public QueryResponse getQRes() {
return qRes;
}
您还可以阅读this问题,了解为什么 Eclipse 中生成的 getter 和 setter 不能与 Struts2 OGNL 一起使用。
我认为您没有在客户端正确读取数据。试试这个:
$.ajax({
type: "POST",
url: "ds/query",
data :JSON.stringify(data),
dataType:"json",
contentType: "application/json; charset=utf-8",
success : function(d, t, x){
console.log(t);
console.log(d[0].id);
console.log(d[0].name);
}
});