Hi,
I would expose you a simple solution to encode an array of objects during the submission of a form on client side (in Javascript) and decode this same array on server side (in JAVA).
Client side
During the submission of a form, we create a parameter named MyArrayParam which will contain the array of objects:
{ xtype: 'container', height: 30, items: [ { id: 'saveButtonID', margin: '0 0 0 20', xtype: 'button', iconCls: 'save-icon', text: 'Save', handler: function() { var form = this.up('form').getForm(); if(form.isValid()==false){ // Hide the waiting message box Ext.MessageBox.hide(); //Ext.MessageBox.close(); Ext.MessageBox.alert('Alert','Some fields are invalid'); }else{ form.submit({ url: 'mySpringMVCController.do?action=handleUpdate', method: 'POST', params: { MyArrayParam: getArrayParam() }, waitTitle: 'Please wait', waitMsg: 'Sending and processing the data...', success: function(form, action) { // ... } ,invalid: function(form, action){ // ... } ,failure: function(form, action) { // ... } }); // End of form.submit(...) }//end-if-else }//end of handler } ] }
We need a method to create the parameter MyArrayParam (for example by ranging the records in a store):
function getArrayParam(){ var storeValues=[]; var allRecords = Ext.getCmp('myGridPanelID').getStore().getRange(); for (i=0;i < allRecords.length;i++){ var rec = allRecords[i]; storeValues[i] = rec.data; } var myArrayParam = new MyArrayParam(); myArrayParam.arrayItems = storeValues; return Ext.encode(myArrayParam); } MyArrayParam = function() { var arrayItems; }
Server side
First, we will create a class AnArrayItem for the mapping the fields of an record in store (ExtJs) :
myArrayParam.arrayItems = storeValues;
…
/** * This class bind with Extjs from fields. */ public class AnArrayItem { // Fields private String id = null; private String type = null; private String reference = null; // ... }
…then, the command class MyParameterCommand containing the array of above class AnArrayItem named arrayItems:
/** * This class bind with Extjs from fields. */ public class MyParameterCommand { // Classic fields private String globalId = null; private String globalType = null; // Array field private AnArrayItem[] arrayItems;
Important note: The name arrayItems of array field in JAVA side
private AnArrayItem[] arrayItems;
and in EXTJS side
MyArrayParam = function() { var arrayItems; }
must be equal.
…finally, in the MVC controller, we retrieve the datas from the request and inject they in the JAVA bean MyParameterCommand:
Dans le controller Spring pour récupérer les données et les mettre dans un bean Java :
//... public ModelAndView handleUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, InterruptedException { // Get the classic parameters MyParameterCommand parameters = new MyParameterCommand(); ServletRequestDataBinder binder = new ServletRequestDataBinder(parameters); binder.bind(request); // Retrieval of the datas and injection of they in a JAVA bean: String myArrayParams = request.getParameter("MyArrayParam"); if(myArrayParams!=null){ JSONObject jsonObject = JSONObject.fromObject(myArrayParams); MyParameterCommand parametersTmp = (MyParameterCommand) JSONObject.toBean(jsonObject, MyParameterCommand.class); parameters.setArrayItems(parametersTmp.getArrayItems()); // simple setter/getter } // ... } //...
That’s all!!!!
Huseyin OZVEREN
thanks