使用SpringMVC时,前段使用Ajax方法是,遇到的问题是:POST方法时,后端无法获取参数值,通过@RequestBody转换成对象确可以,在网上也转悠了好多地方,不得其解,今天看到一个知识点,解决了这个“问题”。这里,打引号的意思是,这个问题并不是什么问题,而是参数使用的问题。具体一点是ajax请求的contentType的类型指定问题。
(1)如果后端采用@RequestParam或Request对象获取参数的方法,请不要指定contentType,或指定为:缺省值:application/x-www-form-urlencoded, 有网友表示AngularJS需要指定该值。
(2)如果后端采用@RequestBody来接受Javascript对象,那么请指定contentType为application/json.
SpringMVC获取从Javascript转Java对象的方法:
假设SpringMVC的配置文件配置了JSON的转换器,那么使用POST的Ajax调用是可以把一个JSON字符串转换成一个JAVA对象的。
后台的方法如下:
@RequestMapping(value = "setting/user/create", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> showCreateForm(@RequestBody User model) {
passwordHelper.encryptPassword(model);
int ret = userService.addUser(model);
Map<String, String> map = new HashMap<String, String>(1);
map.put("ret", String.valueOf(ret));
return map;
}
这段代码通过RequestMapping注解映射setting/user/create的URL,只处理POST请求,同时,响应数据体为一个对象,同时使用相应的Converter进行转换,笔者配置文件定义了JSON转换器,可以满足客服端的请求。
期望放回:{ret:Integer}的JSON对象。
前端JavaScript的方法如下:
$.ajax({
type: 'POST',
contentType: 'application/json',
url: 'setting/user/create',
data: JSON.stringify(user),
success: adduser.addUserResponse,
error:function(data){alert('error:' + data);}
});
通过ajax异步请求setting/user/create方法,参数类型使用’application/json’格式注意:这里参数类型为contentType,查看文档如下:
contentType
类型:String
默认值: “application/x-www-form-urlencoded”。发送信息至服务器时内容编码类型。
定义了发送到服务器的内容编码,如果是POST一个对象,这个方法是对的,如果是一个或多个普通参数,那么,就成了一个问题,该模式下,后端只能通过@RequestBody,并用对象来接受前端的参数,这也是笔记当时存在的错误。
需要添加的SpringMVC配置如下:
<!--避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /> <!-- JSON转换器 -->
</list>
</property>
</bean>
SpringMVC从前段获取简单对象的方法:
var userid = this.id.substr(this.id.lastIndexOf('-')+1);
$.ajax({
type: 'POST',
url: 'setting/user/delete',
data:{id:userid},
success: function(data){
if (data && parseInt(data.ret)>0){
showPromptMessage('btn-delete-user-'+userid, '删除用户成功.');
$('#table-tr-user-' + data.ret).remove();
}else{
showPromptMessage('btn-delete-user-'+userid, '删除用户数据失败:' + data.message);
}
},
error:function(data){alert('删除用户数据失败, error:' + data);}
});
这段代码没有了contentType参数,这样,{id:userid}这样的POST参数就会与URL编码参数类似:setting/user/delete?id=userid 的GET调用方式。可以通过@RequestParam参数获取id的值。注意:参数名称和提交的对象值需要一致,如果不一致,可以指定@RequestParam的构造函数为参数名称。