J Modi J Modi - 28 days ago 4
Java Question

Uncaught Ext.Error: You're trying to decode an invalid JSON String: Form Submission using Ext JS and Spring MVC

I am getting the following error after submitting my Ext JS form:


Uncaught Ext.Error: You're trying to decode an invalid JSON String


JS:

Ext.onReady(function() {

var simple = Ext.create('Ext.form.Panel', {

frame : true,
title : 'Login Form',
bodyStyle : 'padding:5px 5px 0',
width : 350,
fieldDefaults : {
msgTarget : 'side',
labelWidth : 75
},
defaultType : 'textfield',
defaults : {
anchor : '100%'
},

items : [{
fieldLabel : 'User Name',
name : 'userName',
allowBlank : false,
emptyText : 'UserName'
}, {
fieldLabel : 'Password',
name : 'password',
allowBlank : false,
inputType : 'password',
emptyText : 'Password'
}],

buttons : [{
text : 'Save',
handler : function() {
var form = this.up('form').getForm();
form.submit({
url : saveFormUrl
// waitMsg : 'Sending the info...',
// success : function(fp, o) {
// Ext.Msg.alert('Success',
// 'Form submitted.');
// }
});
}
}, {
text : 'Cancel'
}]
});
simple.render(document.body);
simple.getEl().center();
});


Controller class:

@Controller
public class UserController {

private static final Logger logger = LoggerFactory
.getLogger(TController.class);

private TService tService = null;

@Autowired
public void setTService(TService tService) {
this.tService = tService;
}

@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public String home() {
System.out.println("Welcome home!");
return "login";
}

@RequestMapping(value = "/save-form.html", method = RequestMethod.POST)
public ModelAndView submitData(User user){
System.out.println("User name:"+user.getUserName());
ModelAndView mv = new ModelAndView("htmlLinks");
return mv;
}


save-form.html:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
<html>
<head>
<title>POC</title>

</head>
<body>
Welcome User !!
</body>
</html>


What am I doing wrong? What is the solution? I am using Ext JS 4 and Spring MVC.

Answer

According to the documentation for form.submit, it looks like the response is REQUIRED to be either JSON or XML ( http://docs.sencha.com/ext-js/4-0/#!/api/Ext.form.action.Submit ), formatted like so:

{
    success: true,
    data: {
        url: "http://somewhere",
        someData: "whatever you want"
    }
}

In your javascript's success handler, you can reference "o.data.[variable]" to get custom data.

Unfortunately you will need to change the submitData method (in your controller) to return a JSON response object in the structure defined above. In the response object, you can include a URL to save-form.html. Then you can make an additional GET request for it in the success handler.

I don't know if this will work because I have no experience with extJS, but I would envision the success handler to look something like this:

success: function(fp, o) {
    Ext.Msg.alert('Success', 'Form submitted.');
    Ext.Ajax.request({
        url: o.data.url,
        method: "GET",
        success: function(response, request) {
            // do whatever you need to with the generated HTML
            alert(response.responseText);
        },
        failure: function(response, request) {
            alert('failed');
        }
    });
}
Comments