springMVC+freemarker+jquery.ajax,ajax请求Controller能进入后台,但是接收不到响应数据,快被这个整死了;
搜啊搜啊搜,发现再用spring返回模板的响应方法就不正确了,fm会解析return的字符串去找对应名称的模板。
正确解决方法:
=============================================================================================
Spring Mvc中没有特别针对于Ajax请求的处理Controller.但是AbstractController和
SimpleFormController也是可以针对Ajax的请求给与相应的.但显得有一点点的不自然.
- @Override
- protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
- Object cmd, BindException ex) {
- String userId=request.getParamater("userId");
- Map userInfoMap=userDao.getUserBaseInfo(userId);
- JSONObject object = new JSONObject();
- object.put("userInfoMap",userInfoMap);
- response.setContentType("text/Xml;charset=gbk");
- PrintWriter out = null;
- try {
- out = response.getWriter();
- out.println(object.toString());
- }
- catch (IOException ex1) {
- ex1.printStackTrace();
- }finally{
- out.close();
- }
- return null;
- }
说明一下我向客户端页面response的是一个JSon对象,选择JSon这种数据格式的两个原因是:
- 体积小可降低流量.
- Js端解码十分方便,Js对JSon格式数据有原生的支持.
使用Spring Mvc原有的SimpleFormController,从上边的例子上看是可以实现的,但是每次都要写"将JSonObject写入流,关流的代码.很累,很麻烦."
所以,扩展了两个新的Controller,以简化对Ajax请求的处理.
JSONObjectAbstractController 用于简单的从request.getParamater参数的情况.
JSONObjectAbstractController 的原代码:
- package com.javaest.ext.spring.mvc.controller;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.json.JSONObject;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.AbstractController;
- public abstract class JSONObjectAbstractController extends AbstractController {
- @Override
- protected ModelAndView handleRequestInternal(HttpServletRequest request,
- HttpServletResponse response)
- throws Exception {
- JSONObject jsonObject = handleAjaxRequestInternal(request, response);
- response.setContentType("text/Xml;charset=gbk");
- PrintWriter out = null;
- try {
- out = response.getWriter();
- out.println(jsonObject.toString());
- }
- catch (IOException ex1) {
- ex1.printStackTrace();
- }
- finally {
- out.close();
- }
- return null;
- }
- protected abstract JSONObject handleAjaxRequestInternal(HttpServletRequest
- httpServletRequest,HttpServletResponse httpServletResponse) throws Exception;
- }
JSONObjectSimpleFormController 用于自动将请求参数绑定到Command对象的情况.
JSONObjectSimpleFormController 的代码:
- package com.javaest.ext.spring.mvc.controller;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import net.sf.json.JSONObject;
- import org.springframework.validation.BindException;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.SimpleFormController;
- public abstract class JSONObjectSimpleFormController extends SimpleFormController {
- @Override
- protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
- Object cmd, BindException ex) {
- JSONObject object = onAjaxSubmit(request, response, cmd, ex);
- response.setContentType("text/Xml;charset=gbk");
- PrintWriter out = null;
- try {
- out = response.getWriter();
- out.println(object.toString());
- }
- catch (IOException ex1) {
- ex1.printStackTrace();
- }
- finally {
- out.close();
- }
- return null;
- }
- public abstract JSONObject onAjaxSubmit(HttpServletRequest request, HttpServletResponse response,
- Object cmd, BindException ex);
- }
注:JSONObject 是json-lib-2.3-jdk15.jar中的,请自己下载导入