这几天写新项目遇到这个问题,看这位博主总结得不错,懒得写了,直接转!原文:http://blog.csdn.net/yixiaoping/article/details/45281721原文有些小错误,加上个人比较喜欢markdown写东西,重新编排了下。

闲话少说,刚开始用SpringMVC, 页面要使用jquery的ajax请求Controller。 但总是失败,主要表现为以下两个异常为:

异常一:java.lang.ClassNotFoundException: org.springframework.http.converter.json.MappingJacksonHttpMessageConverter

异常二:SpringMVC @ResponseBody 415错误处理

网上分析原因很多,但找了很久都没解决,基本是以下几类:

  1. springmvc添加配置、注解;
  2. pom.xml添加jackson包引用;
  3. Ajax请求时没有设置Content-Type为application/json
  4. 发送的请求内容不要转成JSON对象,直接发送JSON字符串即可

这些其实都没错!!! 
以下是我分析的解决步骤方法:

(1)springMVC配置文件开启注解

 <!-- 开启注解-->
<mvc:annotation-driven />

(2)添加springMVC需要添加如下配置。 (这个要注意spring版本,3.x和4.x配置不同)

  • spring3.x是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter
  • spring4.x是org.springframework.http.converter.json.MappingJackson2HttpMessageConverter

具体可以查看spring-web的jar确认,哪个存在用哪个! 
spring3.x配置:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean> <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-</value>
</list>
</property>
</bean>

spring4.x配置:

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter" />
</list>
</property>
</bean> <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-</value>
</list>
</property>
</bean>

(3)pom.xml添加jackson依赖(这个要注意spring版本,3.x和4.x配置不同)

如果是spring 3.x,pom.xml添加如下配置

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-lgpl</artifactId>
<version>1.8.</version>
</dependency> <dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-lgpl</artifactId>
<version>1.8.</version>
</dependency></span>

spring4.x, pom.xml添加如下配置

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.</version>
</dependency>

这里要说明一下,spring3.x用的是org.codehaus.jackson的1.x版本,在maven资源库,已经不在维护,统一迁移到com.fasterxml.jackson,版本对应为2.x 
(4)ajax请求要求

dataType 为 json 
contentType 为 ‘application/json;charse=UTF-8’ 
data 转JSON字符串

我的代码如下: 
(注意:这里只是针对POST +JSON字符串形式请求,后面我会详细讲解不同形式请求,的处理方法和案例)

var data = {
userAccount: lock_username,
userPasswd:hex_md5(lock_password).toUpperCase()
} $.ajax({
url : ctx + "/unlock.do",
type : "POST",
data : JSON.stringify(data),
dataType: 'json',
contentType:'application/json;charset=UTF-8',
success : function(result) {
console.log(result);
}
});

(5) Controller 接收响应JSON

以上配置OK,Controller中使用JSON方式有多种。这里简单介绍几种。

这个关键在于ajax请求是将数据以什么形式传递到后台,这里我总结了三种形式

    1. POST + JSON字符串形式
    2. POST + JSON对象形式
    3. GET + 参数字符串 
      方式一: POST + JSON字符串形式,如下:
    4. //请求数据,登录账号 +密码
      var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : JSON.stringify(data), //转JSON字符串
      dataType: 'json',
      contentType:'application/json;charset=UTF-8', //contentType很重要
      success : function(result) {
      console.log(result);
      }
      });

      方式二: POST + JSON对象形式,如下:

    5.  //请求数据,登录账号 +密码
      var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : data, //直接用JSON对象
      dataType: 'json',
      success : function(result) {
      console.log(result);
      }
      });

      代码案例:

      5-1: 使用@RequestBody来设置输入 ,@ResponseBody设置输出 (POST + JSON字符串形式)

      JS请求:

       //请求数据,登录账号 +密码
      var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : JSON.stringify(data), //转JSON字符串
      dataType: 'json',
      contentType:'application/json;charset=UTF-8', //contentType很重要
      success : function(result) {
      console.log(result);
      }
      });

      Controller处理:

    6. @RequestMapping(value = "/unlock", method = RequestMethod.POST,consumes = "application/json")
      @ResponseBody
      public Object unlock(@RequestBody User user) {
      JSONObject jsonObject = new JSONObject(); try{
      Assert.notNull(user.getUserAccount(), "解锁账号为空");
      Assert.notNull(user.getUserPasswd(), "解锁密码为空"); User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
      Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!"); Assert.isTrue(StringUtils.equals(user.getUserAccount(),currentLoginUser.getUserAccount()), "解锁账号错误");
      Assert.isTrue(StringUtils.equalsIgnoreCase(user.getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误"); jsonObject.put("message", "解锁成功");
      jsonObject.put("status", "success");
      }catch(Exception ex){
      jsonObject.put("message", ex.getMessage());
      jsonObject.put("status", "error");
      }
      return jsonObject;
      }

      5-2: 使用HttpEntity来实现输入绑定,来ResponseEntit输出绑定(POST + JSON字符串形式)

      JS请求:

    7.  //请求数据,登录账号 +密码
      var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : JSON.stringify(data), //转JSON字符串
      dataType: 'json',
      contentType:'application/json;charset=UTF-8', //contentType很重要
      success : function(result) {
      console.log(result);
      }
      });

      Controller处理:

    8. @RequestMapping(value = "/unlock", method = RequestMethod.POST,consumes = "application/json")
      public ResponseEntity<Object> unlock(HttpEntity<User> user) {
      JSONObject jsonObject = new JSONObject(); try{
      Assert.notNull(user.getBody().getUserAccount(), "解锁账号为空");
      Assert.notNull(user.getBody().getUserPasswd(), "解锁密码为空"); User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
      Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!"); Assert.isTrue(StringUtils.equals(user.getBody().getUserAccount(),currentLoginUser.getUserAccount()), "解锁账号错误");
      Assert.isTrue(StringUtils.equalsIgnoreCase(user.getBody().getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误"); jsonObject.put("message", "解锁成功");
      jsonObject.put("status", "success");
      }catch(Exception ex){
      jsonObject.put("message", ex.getMessage());
      jsonObject.put("status", "error");
      }
      ResponseEntity<Object> responseResult = new ResponseEntity<Object>(jsonObject,HttpStatus.OK);
      return responseResult;
      }

      5-3: 使用request.getParameter获取请求参数,响应JSON(POST + JSON对象形式) 和(GET + 参数字符串),Controller处理一样,区别在于是否加注解method ,

      如果不加适用GET + POST ;

      如果 method= RequestMethod.POST,用于POST 请求;

      如果method=RequestMethod.GET,用于GET请求;

      POST+ JSON对象形式请求:

    9. var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : data,
      dataType: 'json',
      success : function(result) {
      console.log(result);
      }
      });

      GET + 参数字符串请求:

    10. $.ajax({
      url : ctx + "/unlock.do",
      type : "GET",
      dataType: "text",
      data : "userAccount="+lock_username+"&userPasswd=" + hex_md5(lock_password).toUpperCase(),//等价于URL后面拼接参数
      success : function(result) {
      console.log(result);
      }
      });

      Controller处理:

    11. @RequestMapping(value = "/unlock")
      public void unlock(HttpServletRequest request,HttpServletResponse response) throws IOException {
      JSONObject jsonObject = new JSONObject(); String userAccount = (String)request.getParameter("userAccount");
      String userPasswd = (String)request.getParameter("userPasswd");
      try{
      Assert.notNull(userAccount, "解锁账号为空");
      Assert.notNull(userPasswd, "解锁密码为空"); User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
      Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!");
      Assert.isTrue(StringUtils.equals(userAccount,currentLoginUser.getUserAccount()), "解锁账号错误");
      Assert.isTrue(StringUtils.equalsIgnoreCase(userPasswd,currentLoginUser.getUserPasswd()), "解锁密码错误"); jsonObject.put("message", "解锁成功");
      jsonObject.put("status", "success");
      }catch(Exception ex){
      jsonObject.put("message", ex.getMessage());
      jsonObject.put("status", "error");
      } response.getWriter().print(jsonObject.toString());
      }

      5-4: 使用@ModelAttribute将参数封装对象,响应JSON(POST + JSON对象形式) 和(GET + 参数字符串),Controller处理一样,区别在于是否加注解method 。

      如果不加适用GET + POST ;

      如果 method= RequestMethod.POST,用于POST 请求;

      如果method=RequestMethod.GET,用于GET请求; 
      POST+ JSON对象形式请求:

    12. var data = {
      userAccount: lock_username,
      userPasswd:hex_md5(lock_password).toUpperCase()
      } $.ajax({
      url : ctx + "/unlock.do",
      type : "POST",
      data : data,
      dataType: 'json',
      success : function(result) {
      console.log(result);
      }
      });

      GET + 参数字符串请求:

    13. $.ajax({
      url : ctx + "/unlock.do",
      type : "GET",
      dataType: "text",
      data : "userAccount="+lock_username+"&userPasswd=" + hex_md5(lock_password).toUpperCase(),//等价于URL后面拼接参数
      success : function(result) {
      console.log(result);
      }
      });

      Controller处理:(这个案例只支持POST)

    14. @RequestMapping(value = "/unlock",method = RequestMethod.POST)
      public void unlock(@ModelAttribute("user") User user,PrintWriter printWriter) throws IOException {
      JSONObject jsonObject = new JSONObject(); try{
      Assert.notNull(user.getUserAccount(), "解锁账号为空");
      Assert.notNull(user.getUserPasswd(), "解锁密码为空"); User currentLoginUser = (User) MvcUtils.getSessionAttribute(Constants.LOGIN_USER);
      Assert.notNull(currentLoginUser, "登录用户已过期,请重新登录!"); Assert.isTrue(StringUtils.equals(user.getUserAccount(),cur rentLoginUser.getUserAccount()), "解锁账号错误");
      Assert.isTrue(StringUtils.equalsIgnoreCase(user.getUserPasswd(),currentLoginUser.getUserPasswd()), "解锁密码错误"); jsonObject.put("message", "解锁成功");
      jsonObject.put("status", "success");
      }catch(Exception ex){
      jsonObject.put("message", ex.getMessage());
      jsonObject.put("status", "error");
      }
      printWriter.print(jsonObject.toString());
      }

SpringMVC Controller接收前台ajax的GET或POST请求返回各种参数的更多相关文章

  1. controller接收前台数据—中文乱码问题

    项目用的开发环境为tomcat+eclipse+SSM 正如题目,controller接收前台数据-中文乱码问题,在页面编码为UTF-8的前提下,解决方案有二: 一) controller接收数据时, ...

  2. SpringMVC Controller接收参数总结

    本文中Controller的开发环境如下表格所示,Maven对应POM配置如下代码段所示: 系统/工具 版本号OS Windows 7 Home BasicJava 1.7.0_79Eclipse M ...

  3. spring 接收前台ajax传来的参数的几个方法

    知识补充 JSON.stringify(), 将value(Object,Array,String,Number...)序列化为JSON字符串JSON.parse(), 将JSON数据解析为js原生值 ...

  4. SpringMVC源码学习:容器初始化+MVC初始化+请求分发处理+参数解析+返回值解析+视图解析

    目录 一.前言 二.初始化 1. 容器初始化 根容器查找的方法 容器创建的方法 加载配置文件信息 2. MVC的初始化 文件上传解析器 区域信息解析器 handler映射信息解析 3. Handler ...

  5. 【spring】spring boot中使用@EnableTransactionManagement 以后,spring mvc接收前台ajax的post方法传过来的参数,使用@RequestBody接收不到参数

    在启动类上添加了注解: @EnableTransactionManagement, postMan测试接口,以这种方式传递参数: 测试结果: 接收不到参数 问题解决: 原因:是因为 这个项目中的Con ...

  6. springmvc Controller接收前端参数的几种方式总结

    (1) 普通方式-请求参数名和Controller方法的参数一致 @Controller @RequestMapping("/param") public class TestPa ...

  7. SpringMVC Controller 接收页面传递的中文参数出现乱码

    在Controller中接收到的POST参数如果是中文的话,显示为乱码.已知客户端传过来时编码为UTF-8. 问题产生分析: spring MVC中默认的编码格式为“ISO-8859-1”,因此造成乱 ...

  8. SpringMVC controller接收的中文参数乱码

    CharacterEncodingFilter只对POST请求有用,GET请求的需要对你运行的tomcat 目录conf/server.xml文件中<Connector connectionTi ...

  9. springmvc接收前台(可以是ajax)传来的数组list,map,set等集合,复杂对象集合等图文详解

    参考帖子: http://blog.csdn.net/wabiaozia/article/details/50803581 方法参考: { "token":"" ...

随机推荐

  1. MySQL 报错 1093

    [Err] 1093 - You can't specify target table 'user' for update in FROM clause 报错的sql如下: delete from ` ...

  2. JMeter在linux服务器上使用

    环境部署: 1.在Linux服务器先安装jdk:此步骤省略,可参考百度经验:https://jingyan.baidu.com/article/6b18230980c294ba59e15967.htm ...

  3. 《DSP using MATLAB》Problem 7.15

    用Kaiser窗方法设计一个台阶状滤波器. 代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  4. FlexRay通信机制

    通信周期是 FlexRay 的基本通信单元[6~7,19].每个通信周期包括四个时间层,如图 2-9 所示.通信周期由静态段(Static Segment).动态段(Dynamic Segment). ...

  5. 引擎设计跟踪(九.14.3.3) Deferred shading的一些小细节

    1.ambient light 之前的shader里面, 方向光会加上ambient 的计算. 但是如果没有方向光, 就没有ambient. 这是把全局方向光改为点光源之后发现的, 因为透明物体的fo ...

  6. RGB颜色名称与色值对应表

    实色效果 英文名称 R.G.B 16色 实色效果 英文名称 R.G.B 16色   Snow 255 250 250 #FFFAFA   PaleTurquoise1 187 255 255 #BBF ...

  7. PythonStudy——nonlocal关键字

    # 作用:将局部的变量提升为嵌套局部变量# 1.必须有同名嵌套局部变量,就是统一嵌套局部与局部的同名变量# -- 如果局部想改变嵌套局部变量的值(发生地址的变化),可以用nonlocal声明该变量 d ...

  8. A*搜索详解(2)——再战觐天宝匣

    书接上文.在坦克寻径的,tank_way中,A*算法每一步搜索都是选择F值最小的节点,步步为营,使得寻径的结果是最优解.在这个过程中,查找最小F值的算法复杂度是O(n),这对于小地图没什么问题,但是对 ...

  9. spring事务详解(一)初探事务

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...

  10. github的markdown页内锚点以及本地资源链接

    页内锚点参考 https://my.oschina.net/antsky/blog/1475173 [aaa](#2-aaabbb) 字母小写,.去掉,空格换成- 本地资源链接 [aaa](docs/ ...