springMVC接受JSON参数介绍转载

原创
小哥 2年前 (2022-12-30) 阅读数 51 #大杂烩

在SpringMVC我们可以选择几种接受方式。JSON人们说的方式SpringMVC如何接受JSON在我们谈论它是什么之前。JSON。我不会重复具体的定义,在JavaScript我们通常这样定义它。JSON 对象

  1. var jsonObject = {

  2. "username":"admin",

  3. "password":123

  4. }

这种形式我们称之为JSON对象,以及名为JSON字符串,顾名思义,字符串是由‘ ‘或者” “包装成一个整体,我们称之为字符串。我们知道字符串可以直接输出,而对象不能直接输出。所以在JavaScript在里面,我们可以

  1. //定义对象 jsonObject

  2. var jsonObject = {

  3. "username":"admin",

  4. "password":123

  5. };

  6. alert(jsonObject);

此时,显示器[object Object]并且不会输出JSON对象的内容,JavaScript向我们提供了两个工具

  1. JSON.parse()

  2. 用于放置 JSON 字符串已转换 JavaScript 对象。

  3. JSON.stringify()

  4. 用于将 JavaScript 值转换为 JSON 字符串。

所以当我们进入

alert(JSON.stringify(jsonObject));

就会显示 {“username”:”admin”,”password”:123};

好了 对于JSON解释到此结束。 下面我们说SpringMVC

既然JSON有了以上两种生存方式ajax向SpringMVC传递值时应该传递哪一个?
我们首先尝试直接发送JSON对

让我们先想想SpringMVC为我们提供的是@RequestParam对于本说明,其作用和我们的Servlet中的request.getParameter基本相同。我们首先使用此注释来获取

  1. @RequestMapping("/jsontest")

  2. public void test(@RequestParam(value="username",required=true) String username,

  3. @RequestParam(value="password",required=true) String password){

  4. System.out.println("username: " + username);

  5. System.out.println("password: " + password);

  6. }

后台成功输出我们的参数,成功接受!
SpringMVC如此聪明以至于如果我们@RequestParam注意,将两个值直接放入其中会产生什么后果?

  1. @RequestMapping("/jsontest")

  2. public void test(String username,String password){

  3. System.out.println("username: " + username);

  4. System.out.println("password: " + password);

  5. }

事实上,它同样成功。这里我不再重复这个原则。感兴趣的朋友可以打破这一点,看看。

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对象

  1. $.ajax({

  2. url : "jsontest",

  3. type : "POST",

  4. async : true,

  5. contentType : "application/json",

  6. data : JSON.stringify(json),

  7. dataType : json,

  8. success : function(data) {

  9. if (data.userstatus === "success") {

  10. $("#errorMsg").remove();

  11. } else {

  12. if ($("#errorMsg").length <= 0) {

  13. $("form[name=loginForm]").append(errorMsg);

  14. }

  15. }

  16. }

  17. });

后台也发生了变化,json事实上,它可以理解为正确的键值,因此我们使用Map接收,然后对字符串或其他数据类型执行进一步处理。

  1. @RequestMapping("/jsontest")

  2. public void test(@RequestBody(required=true) Map<String,Object> map ){

  3. String username = map.get("username").toString();

  4. String password = map.get("password").toString();

  5. System.out.println("username: " + username);

  6. System.out.println("password: " + password);

  7. }

同时,我想起了魔法SpringMVC,所以我决定尝试删除注释,好的,果断地分解了一个空指针错误。。。试着停在那里。
SpringMVC还提供了直接和POJO装订方法,让我们试试。就像前台一样,它不会被张贴。

  1. @RequestMapping("/jsontest")

  2. public void test(@RequestBody User user ){

  3. String username = user.getUsername();

  4. String password = user.getPassword();

  5. System.out.println("username: " + username);

  6. System.out.println("password: " + password);

  7. }

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

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门