亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringMVC @RequestBody的使用解析

 更新時(shí)間:2021年11月05日 08:48:08   作者:micro_hz  
這篇文章主要介紹了SpringMVC @RequestBody的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringMVC @RequestBody的使用

Spring mvc是一個(gè)非常輕量的mvc框架,注解可以大大減少配置,讓請(qǐng)求的攔截變得比較簡(jiǎn)單。這次記錄下@RequestBody 注解接收參數(shù)尤其是數(shù)組參數(shù)的用法。

關(guān)于容器的配置不再多說(shuō),這里寫(xiě)出spring-servlet.xml的sechme:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:task="http://www.springframework.org/schema/task"
 xsi:schemaLocation="http://www.springframework.org/schema/context    
          http://www.springframework.org/schema/context/spring-context-4.0.xsd    
          http://www.springframework.org/schema/beans    
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
          http://www.springframework.org/schema/mvc
          http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
          <!-- 掃描包注解 -->
 <context:component-scan base-package="xxxx"></context:component-scan>
 <!-- mvc注解功能啟動(dòng) -->
 <mvc:annotation-driven />
</beans>

只要對(duì)應(yīng)包名下面的添加注解即可掃描到對(duì)應(yīng)的控制器,一般采用@Controller

RequestBody接收基本類型

@Controller
public class TestController {
 // url請(qǐng)求攔截
 @RequestMapping("test/test.do")
 @ResponseBody // 返回參數(shù)為JSON
 public void test(@RequestBody String name) {
  System.out.println("getParams : " + name);
 }![這里寫(xiě)圖片描述](https://img-blog.csdn.net/20161114115809292)
}

@RequestBody只要接收POST請(qǐng)求Body里的數(shù)據(jù)。

這里寫(xiě)圖片描述

這樣發(fā)送請(qǐng)求,即可在java控制臺(tái)中打?。?/p>

getParams : {"name":"micro"}

@RequestBody接收基本數(shù)組

然后我們接收基本類型數(shù)組:

	@RequestMapping("test/test.do")
	@ResponseBody
	public void test(@RequestBody List<String> nameList) {
		System.out.println("getParams : " + nameList);
	}

這里寫(xiě)圖片描述

這樣即可獲取到參數(shù),不要body里寫(xiě)成了{(lán)“nameList”:[“name1”,“name2”]}這樣會(huì)拋出異常。

@RequestBody是對(duì)應(yīng)的POST請(qǐng)求的body,body即是獲取的參數(shù),如果想通過(guò)參數(shù)去獲取,則要使用@RequestParams 注解:

	@RequestMapping("test/test.do")
	@ResponseBody
	public void test(@RequestParam("name") String name) {
		System.out.println("getParams : " + name);
	}

這里寫(xiě)圖片描述

注意是GET請(qǐng)求,參數(shù)直接放到URL后面,這樣就可以使用@RequestParams獲取到對(duì)應(yīng)參數(shù)名的參數(shù)值。如果是復(fù)雜的對(duì)象。

@RequestBody的使用。

定義model:

class Person {
	private Long id;
	private String name;
	// setter getter
}

@RequestBody接收復(fù)雜對(duì)象

接收參數(shù)的方式

@RequestMapping("test/test.do")
	@ResponseBody
	public void test(@RequestBody Person person) {
		System.out.println("getParams : " + person.getId() + " ," + person.getName());
	}

即可獲取到參數(shù),body里的參數(shù)會(huì)自動(dòng)匹配到person的屬性并賦值。

注意名字要與對(duì)象的屬性變量名一致。否則獲取不到參數(shù),例如這里就不能在body里寫(xiě)成{“i”:1,“name”:“micro”},這樣獲取到person的id為null。

@RequestBody接收復(fù)雜對(duì)象數(shù)組

如果是復(fù)雜對(duì)象數(shù)組:

	@RequestMapping("test/test.do")
	@ResponseBody
	public void test(@RequestBody List<Person> personList) {
		for (Person p : personList) {
			System.out.println(p.getId() + " ," + p.getName());
		}
	}

請(qǐng)求方式如下,注意body里的格式是[]數(shù)組。

這里寫(xiě)圖片描述

控制臺(tái)打印:

1 ,micro

2 ,micro2

即完成了@RequestBody接收各種類型的參數(shù)。

@RequestBody使用的一些注意事項(xiàng)

眾所周知,springmvc中@RequestBody的注解是一個(gè)很實(shí)用的功能,它能幫我們解析客戶端(移動(dòng)設(shè)備、瀏覽器等)發(fā)送過(guò)來(lái)的json數(shù)據(jù),并封裝到實(shí)體類中。

但我今天要說(shuō)的不是它的原理,而是記錄一些工作中使用@RequestBody注解遇到的一些問(wèn)題,也提醒廣大java開(kāi)發(fā)者避免類似的問(wèn)題。

最近有個(gè)需求,接收客戶的設(shè)備發(fā)送過(guò)來(lái)的json數(shù)據(jù),客戶的設(shè)備里面只能修改ip,然后通過(guò)http協(xié)議的post方式發(fā)送數(shù)據(jù)過(guò)來(lái)。我很自然地想到在登錄頁(yè)那里處理,在toLogin方法中增加@RequestBody Kehu kehu參數(shù),用戶解析并封裝json數(shù)據(jù)。

廢話不多說(shuō),上代碼,如下所示:

@RequestMapping(value = "/toLogin")
	public ModelAndView toLogin(HttpServletRequest request, @RequestBody Kehu kehu) throws Exception {
		// 接收客戶設(shè)備發(fā)送過(guò)來(lái)的json數(shù)據(jù)
		if (kehu != null && !StringUtil.isEmpty(kehu.cmd)) {
			uploadData(kehu);
		}
		ModelAndView mv = new ModelAndView();
		PageData pageData = this.getPageData(request);
		pageData.put("SYSNAME", Tools.readTxtFile(Const.SYSNAME)); // 讀取系統(tǒng)名稱
		mv.setViewName("base/login");
		mv.addObject("pd", pageData);
		return mv;
	}

一切看似很完美,在瀏覽器上測(cè)試一下,輸入localhost(我的項(xiàng)目已經(jīng)設(shè)置為了缺省項(xiàng)目,端口號(hào)也改為了80)

我傻眼了,報(bào)了400錯(cuò)誤。如下圖所示:

The request sent by the client was syntactically incorrect.

翻譯過(guò)來(lái)就是:客戶端發(fā)送的請(qǐng)求在語(yǔ)法上是不正確的。

沒(méi)加@RequestBody Kehu kehu之前是正常的,問(wèn)題肯定出在了這里。我一看RequestBody的源碼:

package org.springframework.web.bind.annotation; 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; 
import org.springframework.http.converter.HttpMessageConverter;
 
/**
 * Annotation indicating a method parameter should be bound to the body of the web request.
 * The body of the request is passed through an {@link HttpMessageConverter} to resolve the
 * method argument depending on the content type of the request. Optionally, automatic
 * validation can be applied by annotating the argument with {@code @Valid}.
 *
 * <p>Supported for annotated handler methods in Servlet environments.
 *
 * @author Arjen Poutsma
 * @since 3.0
 * @see RequestHeader
 * @see ResponseBody
 * @see org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
 * @see org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestBody {
 
	/**
	 * Whether body content is required.
	 * <p>Default is {@code true}, leading to an exception thrown in case
	 * there is no body content. Switch this to {@code false} if you prefer
	 * {@code null} to be passed when the body content is {@code null}.
	 * @since 3.2
	 */
	boolean required() default true;
 
}

required方法默認(rèn)返回值是true。

這樣問(wèn)題就明朗了,我請(qǐng)求localhost的時(shí)候,沒(méi)有傳json過(guò)去,所以就會(huì)報(bào)400錯(cuò)誤,因?yàn)榭蛻舳税l(fā)送的請(qǐng)求在語(yǔ)法上是不正確的。

解決方法:在@RequestBody后面加上(required=false)就可以了。表示kehu對(duì)象可以不傳入。

/**
	 * 訪問(wèn)登錄頁(yè)
	 * @RequestBody(required=false)	表示kehu對(duì)象可以不傳入。
	 * 一定要加上required=false,否則登錄的時(shí)候會(huì)報(bào)400錯(cuò)誤。錯(cuò)誤代碼:
	 * The request sent by the client was syntactically incorrect.
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/toLogin")
	public ModelAndView toLogin(HttpServletRequest request, @RequestBody(required=false) Kehu kehu) throws Exception {
		// 接收硬幣機(jī)發(fā)送過(guò)來(lái)的json數(shù)據(jù)
		if (kehu != null && !StringUtil.isEmpty(kehu.cmd)) {
			uploadData(kehu);
		}
		ModelAndView mv = new ModelAndView();
		PageData pageData = this.getPageData(request);
		pageData.put("SYSNAME", Tools.readTxtFile(Const.SYSNAME)); // 讀取系統(tǒng)名稱
		mv.setViewName("base/login");
		mv.addObject("pd", pageData);
		return mv;
	}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 深入理解Java線程池從設(shè)計(jì)思想到源碼解讀

    深入理解Java線程池從設(shè)計(jì)思想到源碼解讀

    這篇文章主要介紹了深入理解Java線程池從設(shè)計(jì)思想到源碼解讀,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 舉例講解Java編程中this關(guān)鍵字與super關(guān)鍵字的用法

    舉例講解Java編程中this關(guān)鍵字與super關(guān)鍵字的用法

    這篇文章主要介紹了Java編程中this關(guān)鍵字與super關(guān)鍵字的用法示例,super是this的父輩,在繼承過(guò)程中兩個(gè)關(guān)鍵字經(jīng)常被用到,需要的朋友可以參考下
    2016-03-03
  • spring boot打包成war包的頁(yè)面如何存放

    spring boot打包成war包的頁(yè)面如何存放

    這篇文章主要介紹了spring boot打包成war包的頁(yè)面該放到哪里,很多朋友對(duì)這個(gè)問(wèn)題都很疑惑,今天小編給大家分享一篇教程,需要的朋友可以參考下
    2019-11-11
  • 淺談Java中的this作為返回值時(shí)返回的是什么

    淺談Java中的this作為返回值時(shí)返回的是什么

    Java中的this作為返回值時(shí)返回的是什么?下面小編就為大家介紹一下Java中的this作為返回值時(shí)返回。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Struts2動(dòng)態(tài)結(jié)果集代碼示例

    Struts2動(dòng)態(tài)結(jié)果集代碼示例

    這篇文章主要介紹了Struts2動(dòng)態(tài)結(jié)果集的有關(guān)內(nèi)容,涉及具體代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • java List集合接口的介紹和使用全面教程

    java List集合接口的介紹和使用全面教程

    這篇文章主要為大家介紹了java List集合接口的介紹和使用全面教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java 實(shí)戰(zhàn)練手項(xiàng)目之校園超市管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)練手項(xiàng)目之校園超市管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+Bootstrap實(shí)現(xiàn)一個(gè)校園超市管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • SpringBoot打Jar包在命令行運(yùn)行流程詳解

    SpringBoot打Jar包在命令行運(yùn)行流程詳解

    這篇文章主要介紹了SpringBoot打Jar包在命令行運(yùn)行流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • JavaSE的三大接口:Comparator,Comparable和Cloneable詳解

    JavaSE的三大接口:Comparator,Comparable和Cloneable詳解

    這篇文章主要介紹了詳解JavaSE中Comparator,Comparable和Cloneable接口的區(qū)別的相關(guān)資料,希望通過(guò)本文大家能徹底掌握這部分內(nèi)容,需要的朋友可以參考下
    2021-10-10
  • Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式

    Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式

    這篇文章主要介紹了Spring Bean初始化及銷毀多種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11

最新評(píng)論