JSON / Ajax in Spring MVC
How do you configure your Spring MVC web application to serve JSON for Ajax? It is not difficult. You probably have a view resolver in your dispatcher-servlet.xml that looks like this:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"></bean> |
In order to serve JSON content, you need to use the ContentNegotiatingViewResolver. The configuration looks like this:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="mediaTypes"> <map> <entry key="html" value="text/html"/> <entry key="json" value="application/json"/> </map> </property> <property name="viewResolvers"> <list> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> </list> </property> <property name="defaultViews"> <list> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/> </list> </property> </bean> |
Here, I’m using the Jackson Java-JSON processor. You will need the appropriate Jackson jar files in your classpath.
Then, in your controller, an annotated method to test it out:
@RequestMapping(value="/test", method= RequestMethod.GET) public ModelMap test() { int[][] integers = new int[4][2]; String[] strings = {"alabama", "alaska", "arkansas"}; for (int i = 0; i < integers.length; i++) { int num = i + 1; integers[i][0] = num; integers[i][1] = num * num; } ModelMap map = new ModelMap("xyz", 123); map.addAttribute("intValues", integers); map.addAttribute("stringValues", strings); return map; } |
The URL will look something like “http://localhost:8084/YourApp/test.json”. Try it out. The JSON string returned will be:
{ "intValues" : [ [ 1, 1 ], [ 2, 4 ], [ 3, 9 ], [ 4, 16 ] ], "stringValues" : [ "alabama", "alaska", "arkansas" ], "xyz" : 123 }
The way you request this JSON-encoded data with jQuery is by using the .getJSON method, like so:
$.getJSON("/YourApp/test.json", function(data) { // do something with the data alert(data.xyz); }); |
Configuring Spring MVC to serve data in JSON format is as easy as that.