(一个项目的知识回顾)
1. Get请求时:前端请求数据以key/value的形式,SpringMVC采用基本数据类型(String、Integer等等)接收数据。
1.1. 用restful风格@PathVariable:
传输数据放在url路径中,controller中的方法参数需要用@PathVariable注解,注解后加(“别名”)可对变量起别名,参数名称或别名必须和路径中的( /{参数}/ )名称一致,否则无法传输。@PathVariable是用来获得请求url中的动态参数。
比如:
@GetMapping("/merchants/{id}")
public MerchantDTO queryMerchantById(@PathVariable("id") Long id)
@GetMapping(value = "/my/pay‐channel‐params/apps/{appId}/platform‐ channels/{platformChannel}/pay‐channels/{payChannel}")
public PayChannelParamDTO queryPayChannelParam(@PathVariable("appId")String appId,@PathVariable("platformChannel")String platformChannel,@PathVariable("payChannel") String payChannel)
1.2.用@RequestParam 注解:
(1)可传输Map类型key-value格式:(@RequestParam Map map),在url中的?后面添加参数即可使用。(key=value形式,用&可拼接多个)
(2)可传输string字符串格式:(@RequestParam String waterEleId,@RequestParam String enterpriseName),在url中的?后面添加参数即可使用。(key=value形式,用&可拼接多个)
(3)GET请求中不可用自定义实体类传输:(@RequestParam Object object),不能用。
1.3.使用HttpServletRequest
此方法是获取整个URL的信息,然后手动获取、分离参数,和类型转化。这个里面带的内容很多,不仅Param还有Header,Cookies等。
2.Post请求时:前端请求Form表单数据(application/x-www-form-urlencoded)和Json数据(Content-Type=application/json)、多部件类型数据(multipart/form-data),SpringMVC采用基本类型及自定义对象接收,对于Json数据SpringMVC使用@RequestBody注解解析请求的json数据。比如:
@PostMapping("/merchants/register")
public MerchantRegisterVO registerMerchant(@RequestBody MerchantRegisterVO merchantRegisterVO)
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile multipartFile) throws IOException
@PostMapping("/createAliPayOrder")
public void createAlipayOrderForStore(OrderConfirmVO orderConfirmVO, HttpServletRequest request, HttpServletResponse response) throws BusinessException, IOException
2.1.使用@Requestbody
(1)(@RequestBody Map map)、(@RequestBody Object object)在application/json时候可用,
在form-data、x-www-form-urlencoded时候不可用。
(2)使用@RequestBody可以接收json字符串, Map,JSONObject,或者对应的JavaBean。
2.2.使用@RequestParam
(1)这种方式只在Content-Type=application/x-www-form-urlencoded情况下才能使用,sevlet将Body中的key-value转成Param。
(2)如果Content-Type=mutipart/form-data,Body中加入参数和URL后面拼接参数一起做Post请求,都可以被加载到Param中,如果是同名的,只取用form-data中的。
如果Content-Type=application/x-www-form-urlencoded和URL拼接的一起,如果是String类型,则两个值会被拼接,其他类型取的是URL拼接的参数。
2.3.通用HttpServletRequest
和Get方式一样,这是个通用方式。也可以和URL拼接的一起搭配,但是没有RequestParam的String类型值被拼接问题,优先级 form-data高于URL拼接、高于x-www-form-urlencoded。
使用@RestController注解Controller时,Controller中的方法无法返回jsp页面、或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。@RestController部分源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
使用@Controller 注解,@Controller可配合视图解析器解析return 的jsp、html页面,并且跳转到相应解析页面。若返回json、XML或自定义mediaType等内容到页面,需要在对应的方法上加@ResponseBody注解。
参考链接:
@RequestBody和@RequestParam的请求方式get和post关系_qfikh的博客-CSDN博客_@requestparam post
POST、GET、@RequestBody和@RequestParam区别_Hello World-CSDN博客_@requestparam
@RequestParam @RequestBody @PathVariable 等参数绑定注解详解_行者无疆-CSDN博客
@RequestParam,@PathParam,@PathVariable等注解区别_一年e度的夏天的专栏-CSDN博客_@pathvariable
@Controller和@RestController的区别? - shuaiflying - 博客园