我在将数据从 jQuery 发送到 struts2 操作类时遇到问题。 我看到了这个问题:JSON Jquery to Struts2 action,但我不太了解解决方案。
这是我的问题:
json数组是这样的:
[{"id":"1","code":"111","name":"ddd"},
{"id":"2","code":"222","name":"sss"},
{"id":"3","code":"333","name":"eee"}]
我想将json数据发送到struts2的action类。 jQuery 代码是这样的:
var data = JSON.stringify(dataObj);
$.ajax({
url: "Update",
type: "post",
data: data,
dataType: 'json',
contentType:"application/json;charset=utf-8",
success : function(){
alert("You made it!");
}
});
但是,在Chrome的开发工具中,我看到了提交到服务器端的数据。但在服务器端,我不知道如何接收json数据。
行动:
public class Update extends ActionSupport{
private String data;
public String getData(){
return data;
}
public void setData(String data){
this.data= data;
}
public String execute(){
System.out.println(data);
return SUCCESS;
}
}
这样,
data
为空。
我还尝试过使用 List 来接收 JSON 数据。将“数据”类型从 String 更改为
List<Node>
,再次失败。可能是因为我不太了解Struts2使用的OGNL模型。
请帮助我。非常感谢!
{"id":"1","code":"111","name":"ddd"}
第1步:创建bean/pojo来累积/封装上述字段
class MyBean{
String id,code,name;
//getters & setters
}
第 2 步:更改操作代码以接收 MyBeans 列表
public class Update extends ActionSupport{
private List<MyBean> data;
//other code, getters & setters
}
第 3 步:配置操作以反序列化 JSON 数据并填充操作字段(使用 json-plugin)
<action name="Update" class="Update">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="json">
<param name="enableSMD">true</param>
</interceptor-ref>
</action>
第 4 步:对发送的 ajax 请求正文进行必要的更改,以匹配操作参数/字段
var data = JSON.stringify(dataObj);
$.ajax({
url: "Update",
type: "post",
data: "data:"+data,
dataType: 'json',
contentType:"application/json;charset=utf-8",
success : function(){
alert("You made it!");
}
});
以上代码未经测试。
嘿问题是你直接发布对象数组。所以Struts2不知道调用哪个方法。如下更改您的 json 数据。然后就可以了。
{"data":[{"id":"1","code":"111","name":"ddd"},
"id":"2","code":"222","name":"sss"},
{"id":"3","code":"333","name":"eee"}]}
然后在setter内部读取对象
public void setData(List < Report > data) {
System.out.println("Setter Call Flow");
this.data = data;
}
其中 Report 是一个 java 类,包含 id、code、name,因为它的成员具有 setter 和 getter。
对于那些正在为这个问题苦苦挣扎的人,我只是做了几个步骤:
第1步.添加依赖(maven)
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.22</version>
</dependency>
第2步.修改struts.xml
json-default
标签中添加 <package>
<interceptor-ref name="json" />
添加到我的自定义<interceptor-stack>
中,那么它应该如下所示:<struts>
<package name="your-custom-package-name" extends="struts-default json-default">
<interceptors>
<interceptor-stack name="your-custom-interceptor-stack">
...
<interceptor-ref name="json" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="your-custom-interceptor-stack"/>
</package>
第3步.修改Action类
@ParentPackage("your-custom-package-name")
添加到您的 Action 类Serializable
@ParentPackage("your-custom-package-name")
public class XXXAction extends ActionSupport implements SessionAware
{
CustomJavaBean po;
...
@Action(value="test")
public void test()
{
System.out.println(po != null);
}
public void setPo(CustomJavaBean po){
this.po = po;
}
public CustomJavaBean getPo(){
return this.po;
}
}
第4步.遵循jQuery/ajax规则
{"your-javaBean-name": data}
并将其转换为字符串 JSON.stringify()
let obj = {
'addr': 'AAA',
'postcode': 'AAA',
'mail': 'AAA',
};
let data = {'po': obj};
data = JSON.stringify(data);
$.ajax({
type: "post",
url: "getAllEmployee.action",
data: data,
contentType:"application/json",
success: function() {
console.log("success");
},
error: function() {
console.log("error");
}
});
仍然,如果遇到像
it's not well formed JSON (invalid char d)
这样的异常,请尝试重命名 Action 类中的 javaBean。例如,我遇到这个问题,我把 CustomJavaBean data
放在我的 Action 类中。我改成CustomJavaBean po
后就解决了。
顺便说一下,现在还有谁用struts,太糟糕了:P