springMVC接受JSON参数介绍转载
原创在SpringMVC我们可以选择几种接受方式。JSON人们说的方式SpringMVC如何接受JSON在我们谈论它是什么之前。JSON。我不会重复具体的定义,在JavaScript我们通常这样定义它。JSON 对象
-
var jsonObject = {
-
"username":"admin",
-
"password":123
-
}
这种形式我们称之为JSON对象,以及名为JSON字符串,顾名思义,字符串是由‘ ‘或者” “包装成一个整体,我们称之为字符串。我们知道字符串可以直接输出,而对象不能直接输出。所以在JavaScript在里面,我们可以
-
//定义对象 jsonObject
-
var jsonObject = {
-
"username":"admin",
-
"password":123
-
};
-
alert(jsonObject);
此时,显示器[object Object]并且不会输出JSON对象的内容,JavaScript向我们提供了两个工具
-
JSON.parse()
-
用于放置 JSON 字符串已转换 JavaScript 对象。
-
JSON.stringify()
-
用于将 JavaScript 值转换为 JSON 字符串。
所以当我们进入
alert(JSON.stringify(jsonObject));
就会显示 {“username”:”admin”,”password”:123};
好了 对于JSON解释到此结束。 下面我们说SpringMVC
既然JSON有了以上两种生存方式ajax向SpringMVC传递值时应该传递哪一个?
我们首先尝试直接发送JSON对
让我们先想想SpringMVC为我们提供的是@RequestParam对于本说明,其作用和我们的Servlet中的request.getParameter基本相同。我们首先使用此注释来获取
-
@RequestMapping("/jsontest")
-
public void test(@RequestParam(value="username",required=true) String username,
-
@RequestParam(value="password",required=true) String password){
-
System.out.println("username: " + username);
-
System.out.println("password: " + password);
-
}
后台成功输出我们的参数,成功接受!
SpringMVC如此聪明以至于如果我们@RequestParam注意,将两个值直接放入其中会产生什么后果?
-
@RequestMapping("/jsontest")
-
public void test(String username,String password){
-
System.out.println("username: " + username);
-
System.out.println("password: " + password);
-
}
事实上,它同样成功。这里我不再重复这个原则。感兴趣的朋友可以打破这一点,看看。
SpringMVC提供@RequestBody用于处理前台定义发送的数据。Content-Type: 不是application/x-www-form-urlencoded编码内容,如application/json, application/xml等;
细心的朋友可能早就发现了Ajax我们没有定义Content-type的类型,Jquery默认使用application/x-www-form-urlencoded类型所以意思是SpringMVC的@RequestParam注解,Servlet的request.getParameter可接受以这种格式传输JSON对象的。
为什么?GET每个人都必须熟悉该请求,它将参数化。url?username=”admin”&password=123这条路通向服务器,以及request.getParameter这个参数可以被接收,我们也可以在浏览器地址栏中看到。我们Ajax使用的POST并且已发送JSON对象,那么背景是如何获得它的?答案在于Content-Type x-www-form-urlencoded编码方法JSON将数据转换为字符串,(username=”admin”&password=123)然后将此字符串添加到url后面,用?细分,(是和GET方法非常相似),提交方法为POST当浏览器封装数据时HTTP BODY然后发送到服务器。因此,它不会显示在URL向上的(这段话可能有点拐弯抹角,我希望你能仔细理解。)
终于完成了,长长的呼吸。所以说我们使用@RequestBody注释时,前台Content-Type必须更改application/json如果没有变化,前台会报告错误。415(Unsupported Media Type). 后台日志将报告错误。Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported这些错误。Eclipse下Tomcat不会显示错误消息。仅当使用日志时才会显示。您可以看到我上一篇关于如何配置日志的文章。接下来,让我们正确配置它。,上面写着 Content-Type需要更改,同时,我们data同样需要更改的是,此注释方法只接受JSON改为字符串JSON对象
-
$.ajax({
-
url : "jsontest",
-
type : "POST",
-
async : true,
-
contentType : "application/json",
-
data : JSON.stringify(json),
-
dataType : json,
-
success : function(data) {
-
if (data.userstatus === "success") {
-
$("#errorMsg").remove();
-
} else {
-
if ($("#errorMsg").length <= 0) {
-
$("form[name=loginForm]").append(errorMsg);
-
}
-
}
-
}
-
});
后台也发生了变化,json事实上,它可以理解为正确的键值,因此我们使用Map接收,然后对字符串或其他数据类型执行进一步处理。
-
@RequestMapping("/jsontest")
-
public void test(@RequestBody(required=true) Map<String,Object> map ){
-
String username = map.get("username").toString();
-
String password = map.get("password").toString();
-
System.out.println("username: " + username);
-
System.out.println("password: " + password);
-
}
同时,我想起了魔法SpringMVC,所以我决定尝试删除注释,好的,果断地分解了一个空指针错误。。。试着停在那里。
SpringMVC还提供了直接和POJO装订方法,让我们试试。就像前台一样,它不会被张贴。
-
@RequestMapping("/jsontest")
-
public void test(@RequestBody User user ){
-
String username = user.getUsername();
-
String password = user.getPassword();
-
System.out.println("username: " + username);
-
System.out.println("password: " + password);
-
}
OK这一次,可以获得该值。就我个人而言,我不喜欢这种上传少量数据的方法,User里面有很多变量,我只使用了其中两个。没有必要创建一个。User对象,当数据量很小时,我更喜欢使用单独的值。让我们再想想,如果它正在上传JSON在对象的情况下,我们可以绑定POJO答案是肯定的,不要用它@RequestParam注释,否则将报告。Required User parameter ‘user’ is not present错误解释到此结束。让我们总结一下。
注意:
(1)当Ajax以application/x-www-form-urlencoded格式上传和使用JSON对象,背景需要使用@RequestParam 或者Servlet获取。
(2) 当Ajax以application/json格式上传和使用JSON字符串,背景需要使用@RquestBody获取。
转载: http://blog.csdn.net/lostsh/article/details/68923874
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除