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