jquery - JSON के माध्यम से काम नहीं करने के लिए handsutable से Struts2 एक्शन के लिए डेटा पुनर्प्राप्त करें




ajax handsontable (2)

मैं जेएसएएन (स्रोत के मुताबिक) डेटा के साथ जेएसएएन डेटा और अजाक्स को तैयार करने के लिए struts2-json प्लगइन का उपयोग कर रहा हूं (हँडसटेबल)

अब, मुझे JSON द्वारा अजाक्स का उपयोग करके तालिका से डेटा स्ट्रटस 2 एक्शन को पुनर्प्राप्त करने की आवश्यकता है I सबसे पहले मैंने टेबल पर स्ट्रॉस 2 एक्शन से हैण्डसेट योग्य JSON द्वारा पास किए गए डेटा के साथ तालिका तैयार की है, जो काफी आसान था और यह काम करता है। लेकिन क्यों सहेजना काम नहीं करते जैसा कि आप संलग्न कोड में देख सकते हैं?

जैसा कि मैंने एक फायरबग में देखा है कि POST भेजा जाता है और डीबग में अनुरोध को मेरे JSONSaveAction कार्रवाई में लिया जाता है लेकिन फ़ील्ड डेटा JSON डेटा के साथ नहीं आ रहा है, क्यों? डाटा को जावा ऑब्जेक्ट को स्वचालित रूप से स्ट्रट्स -2-जेसन प्लगइन से बाँध नहीं किया जाना चाहिए? मैं क्या गलत कर रहा हूं?

हेन्डसैंटेबल भाग में फ़ंक्शन handsontable.getData() तालिका) से संपूर्ण डेटा प्राप्त करने के लिए ज़िम्मेदार है। तो मैं इसे इस तरह प्रयोग कर रहा हूं लेकिन सफलता के बिना:

$.ajax({
        url: "../json/saveJSONDataAction.action",
        data: {data: handsontable.getData()}, //returns all cells' data
        dataType: 'json',
        type: 'POST',
        success: function (res) {
            if (res.result === 'ok') {
                $console.text('Data saved');
            }
            else {
                $console.text('Save error');
            }
        }
    });

फ़ंक्शन handsontable.getData() वास्तव में सभी डेटा पुनर्प्राप्त करता है जो मैंने जांच की थी लेकिन इसके बजाय डेटा को java ऑब्जेक्ट के साथ बाइंड नहीं किया गया है List<Report> data JSONSaveAction कार्रवाई में List<Report> data report List<Report> data तुम जानते हो क्यों?

मेरी मेज और फायरबग जानकारी के साथ पोस्ट अनुरोध के बाद यहां स्क्रीनशॉट है:

जेसनसन को हैंडसेट करने योग्य (कार्य करने योग्य) भेजना:

@ParentPackage("json-default")
@Action(value="getJSONDataAction")
@Result(name="success", type="json")
public class JSONDataAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    private List<Report> data = new ArrayList<Report>();

    public JSONDataAction(){
        data.add(new Report(1, "Chris", true, "2008-01-01", "orange"));
        data.add(new Report(2, "Kate", false, "2013-03-03", "blue"));
        data.add(new Report(3, "Blade", true, "2013-05-03", "black"));
        data.add(new Report(4, "Zack", false, "2013-01-01", "yellow"));
    }

    public String execute() {
        return SUCCESS;
    }

    public List<Report> getData() {
        return data;
    }

    public void setData(List<Report> data) {
        this.data = data;
    }
}

जो JSON स्वचालित रूप से उत्पन्न तालिका जनरेट करने के लिए भेजा जाता है:

{"data":[
    {"active":true,"color":"orange","date":"2008-01-01","id":1,"name":"Chris"},
    {"active":false,"color":"blue","date":"2013-03-03","id":2,"name":"Kate"},
    {"active":true,"color":"black","date":"2013-05-03","id":3,"name":"Blade"},
    {"active":false,"color":"yellow","date":"2013-01-01","id":4,"name":"Zack"}]
}

जेसन के माध्यम से तालिका से डेटा पुनर्प्राप्त करना (काम नहीं कर रहा है):

यहां फ़ील्ड List<Report> data हमेशा रिक्त है, JSON से डेटा के साथ पॉपुलेटेड नहीं है :(

@ParentPackage("json-default")
@Action(value="saveJSONDataAction")
@Result(name="success", type="json")
public class JSONSaveAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    private List<Report> data;

    public JSONSaveAction(){
    }

    public String execute() {
        try {
            JSONObject jsonData = (JSONObject) JSONSerializer.toJSON(data);
            String name = jsonData.getString("name");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return SUCCESS;
    }

    public List<Report> getData() {
        return data;
    }

    public void setData(List<Report> data) {
        this.data = data;
    }
}

रिपोर्ट वर्ग:

public class Report {
    private int id;
    private String name;
    private boolean active;
    private String date;
    private String color;

    //getters and setters
}

JSON के माध्यम से और तालिका में डेटा लोड और सहेजें:

<div id="spreadsheet">
    <p>
        <button type="button" name="load">Load</button>
        <button type="button" name="save">Save</button>
    </p>
</div>
<div id="console" class="console"></div>

<script>
    var $container = $("#spreadsheet");
    var $console = $("#console");
    var $parent = $container.parent();
    $container.handsontable({
        startRows: 4,
        startCols: 20,
        rowHeaders: true,
        colHeaders: true,
        contextMenu: true,
        columns: [
            {data: "id", type: 'text'},
            {data: "name", type: 'text'},
            {data: "active", type: 'checkbox'},
            {data: "date", type: 'date'},
            {data: "color",
                type: 'autocomplete',
                source: ["yellow", "red", "orange", "green", "blue", "gray", "black", "white"]
            }
        ]
    });
    var handsontable = $container.data('handsontable');

    $parent.find('button[name=load]').click(function () {
        $.ajax({
            url: "../json/getJSONDataAction.action",
            dataType: 'json',
            type: 'GET',
            success: function (res) {
                handsontable.loadData(res.data);
                $console.text('Data loaded');
            }
        });
    });

    $parent.find('button[name=save]').click(function () {     
        $.ajax({
            url: "../json/saveJSONDataAction.action",
            data: {data: handsontable.getData()}, //returns all cells' data
            dataType: 'json',
            type: 'POST',
            success: function (res) {
                if (res.result === 'ok') {
                    $console.text('Data saved');
                }
                else {
                    $console.text('Save error');
                }
            },
            error: function () {
                $console.text('Save error.');
            }
        });
    });
</script>

कृपया मुझे तालिका से डेटा को सही ढंग से जावा ऑब्जेक्ट को पुनर्प्राप्त करने के लिए मदद करें, क्योंकि यह वास्तव में मुझे अवरुद्ध करता है मुझे नहीं पता कि मैं क्या कर रहा हूं ...

किसी भी इनपुट के लिए बड़ा धन्यवाद!


मैंने आपके कोड को अच्छी तरह से नहीं देखा है, लेकिन पहली बार ऐसा लगता है कि जब आप अपने Action में उस new ArrayList<Report>() साथ नया बनाते हैं तो आप data संग्रह मिटा रहे हैं। बस अकेले घोषित घोषणा private List<Report> data;


मैंने इसे तय किया है

1: स्ट्रट्स.एक्सएमएल में जोड़ें:

<interceptor-ref name="json">
    <param name="enableSMD">true</param>
</interceptor-ref>

2: अजाक्स अनुरोध में जोड़ें:

contentType: 'application/json'

3: JSON प्रारूप बदलें, जो स्वचालित रूप से खराब है, जो हाथों योग्य है। JSON में कुछ पात्रों जैसे:% 5B% 5D% 7B% 7D% 22 के बजाय: [] {} "

मैंने उन्हें अपने निर्धारित एन्कोडयूआरआई () फ़ंक्शन द्वारा प्रतिस्थापित किया है:

var data = '{"data":' + fixedEncodeURI(JSON.stringify(handsontable.getData())) + '}';
$.ajax({
    url: "../json/saveJSONDataAction.action",
    data: data, //returns all cells' data
    dataType: 'json',
    contentType: 'application/json',
    type: 'POST',
    success: function (res) {
    }
  });

function fixedEncodeURI (str) {
    return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']').replace(/%7B/g, '{').replace(/%7D/g, '}').replace(/%22/g, '"');
}




struts2-json-plugin