如何使用 jQuery 将 JSON 数据发布到 Struts2 Action 类

问题描述 投票:0回答:3

我在将数据从 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模型。

请帮助我。非常感谢!

java json jquery struts2
3个回答
9
投票
{"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!");
  }
});

以上代码未经测试。


1
投票

嘿问题是你直接发布对象数组。所以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。


0
投票

对于那些正在为这个问题苦苦挣扎的人,我只是做了几个步骤:

第1步.添加依赖(maven)

  • 确保该依赖的版本与你使用的struts版本相匹配
<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 类
  • 创建一个javaBean来匹配传输数据的格式
  • 记住你的javaBean的getter/setter
  • 确保你的 javaBean 应该实现
    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

© www.soinside.com 2019 - 2024. All rights reserved.