zoukankan      html  css  js  c++  java
  • SpringMVC之请求参数的获取方式

    转载出处:https://www.toutiao.com/i6510822190219264516/

    SpringMVC之请求参数的获取方式

    常见的一个web服务,如何获取请求参数?

    一般最常见的请求为GET和POST,get请求的参数在url上可以获取,post请求参数除了url上还有可能在表单中,文件上传时,获取方式又和一般的参数获取不一样

    本篇则主要集中在不同请求方式下,获取参数的使用姿势

    首先需要搭建一个后端的请求,为了快速演示

    利用spring-boot创建了一个机器简单的工程,依赖版本1.5.4.RELEASE

    I. GET请求参数获取

    get请求参数,一般都是直接挂在请求的url上,所以获取这些参数还是比较简单的

    1. 通过 HttpServletRequest获取参数

    这个可以说是最基本最常见的的方式了,javax.servlet.ServletRequest#getParameter来获取对应的参数,下面各处一个实例

    SpringMVC之请求参数的获取方式

    根据上面暴露的接口,我们测试的case就很简单了

    SpringMVC之请求参数的获取方式

    说明

    • 这是一个最基本的获取参数的方式,get,post请求都适用的,通常在filter,intercepter中也是可以通过HttpServletRequest对象来获取请求参数

    • 除了获取常见的请求参数之外,HttpServletRequest可以获取请求头的完整信息

    • 在一次请求的生命周期内,可以通过下面的方式获取Request对象(当然也可以获取response对象)

      SpringMVC之请求参数的获取方式

    2. 直接方法参数获取

    直接给出case, 这个方法依然是放在上面的DemoController下面的

    SpringMVC之请求参数的获取方式

    请求验证

    SpringMVC之请求参数的获取方式

    注意:

    • 上面这种使用方式,相当于直接将url参数映射到了Controller方法的参数上了

    • 方法参数名必须和url参数名完全一致(区分大小写)

    • 顺序无关

    • 若参数没传,则默认为null

    一个疑问

    上面的demo中Controller的方法参数都是String还好,如果将password改成int,会出现什么情况

    代码稍作修改

    SpringMVC之请求参数的获取方式

    实际测试

    SpringMVC之请求参数的获取方式

    结果说明

    • 如果请求参数与方法参数类型不一致,会抛出转换异常

    • 如果方法参数为非封装基本类型,则url参数必须存在,否则报错

    3. RequestParam注解方式获取请求参数

    通过@RequestParam注解获取参数的方式和上面的一种比较类似,case如下

    SpringMVC之请求参数的获取方式

    测试case

    SpringMVC之请求参数的获取方式

    说明

    • 不指定注解的name或value属性时,等同于第二种使用姿势

    • 注解的name属性或value属性,用实际的参数名来指定

    • controller的参数名与url参数名没有强关联(区别第二种方式)

    • 参数类型需要保证一致(通第二种方式)

    • 如果url参数可选,请设置require属性为false,如下

      @RequestParam(name = "user", required = false) String username

    4. Bean方式获取参数

    对于请求参数比较复杂的情况下,我比较喜欢这种使用姿势,管理起来方便简单

    SpringMVC之请求参数的获取方式

    测试case

    SpringMVC之请求参数的获取方式

    说明

    • 定义一个bean,内部属性和请求参数对应

    • 允许参数不存在的情况,会使用null代替(所以,尽量不要使用非封装基本类型,否则参数不传时,会抛异常)

    • bean的属性,可以根据实际情况指定类型

    5. ModelAttribute注解方式

    @ModelAttribute注解的方法,会优于Controller之前执行,一般更常见于向视图传输数据使用,此处不详细展开,正常来讲,专门的获取参数不太会用这这种方式来玩

    6. Path参数

    Path参数,专指的是请求路径的参数,如

    SpringMVC之请求参数的获取方式

    上面这个url中,password是我们传统意义上的请求参数,其中path参数则是指其中req4,demo这种path路径中的一环;对此,最常见的一个case就是常见的博客中,如开源中国的一个博客链接

    SpringMVC之请求参数的获取方式

    • 566591 : 这个参数主要用来区分用户

    • 1601400 : 这个参数则主要是表示对应的博文

    一般path参数的获取方式如下

    SpringMVC之请求参数的获取方式

    测试case

    SpringMVC之请求参数的获取方式

    注意:

    • path参数的使用,需要确保参数存在且类型匹配

    • path参数和url参数不会相互影响

    II. POST请求参数获取

    POST请求参数,更多的是看提交表单参数是否可以获取到,以及如何获取,主要的手段依然是上面几种方式,下面验证下是否ok

    1. HttpServletRequest方式获取参数

    测试case,可以借助curl来实现post请求

    SpringMVC之请求参数的获取方式

    curl也可以换成js请求测试方式

    SpringMVC之请求参数的获取方式

    说明

    • 对于HttpServletReuqest方式获取参数时,get和post没什么区别

    • 若url参数和表单参数同名了,测试结果显示使用的是url参数(待确认,当然最好不要这么干)

    2. 方法参数获取

    几个测试demo如下

    SpringMVC之请求参数的获取方式

    基本上使用姿势和get没什么区别

    3. RequestParam注解方式

    SpringMVC之请求参数的获取方式

    注意

    • 和前面的两种方式不同的是,当post表单的参数和url参数同名时,会合并成一个字符串

    4. Bean方式

    SpringMVC之请求参数的获取方式

    这种方式不区分get,post,所以完全复杂的交互接口,完全可以考虑用bean的方式来定义请求参数

    5. PathVariable

    这个没法玩...

    III. 多媒体上传参数获取

    上传文件的支持,对于传统的spring-mvc来说,可能需要一些添加一些相关配置,不在本文的范畴内,下面默认已经配置好

    实例支持

    SpringMVC之请求参数的获取方式

    简单来说,主要是利用HttpServletRequest来获取上传的文件

    注意:

    • 如果接口必须要求上传文件,可以直接把参数声明为MultipartHttpServletRequest, 此时调用方如果不传参数,会被异常拦截(可以通过@ControllerAdvice来拦截全局异常)

    • 如果可以不上传文件,则可以用上面的这种猥琐姿势,内部进行判断

    • ((MultipartHttpServletRequest) request).getFile(xxx)来获取指定名的上传文件

    IV. 小结

    1. 五种获取参数的姿势

    方式注意事项
    HttpServletRequest获取参数 最常见通用
    方法参数与请求参数同名 注意参数名统一,注意类型一致,尽量不用非包装基本类型
    @RequestParam注解 同上,可注解内指定http参数名
    Bean方式 定义一个bean,会将同名的http参数赋值进去,推荐
    @PathVariable 注解 请求url参数

    2. 传文件使用姿势

    使用MultipartHttpServletRequest来获取上传的文件,当然也可以获取基本的请求参数

    V. 其他

    声明

    尽信书则不如,已上内容,纯属一家之言,因本人能力一般,见解不全,如有问题,欢迎批评指正

  • 相关阅读:
    cf359D Pair of Numbers
    cf671B Robin Hood
    [暑假集训--数位dp]hdu5787 K-wolf Number
    [暑假集训--数位dp]UESTC250 windy数
    [暑假集训--数位dp]LightOj1205 Palindromic Numbers
    [暑假集训--数位dp]LightOJ1140 How Many Zeroes?
    [暑假集训--数位dp]LightOj1032 Fast Bit Calculations
    [暑假集训--数位dp]hdu5898 odd-even number
    [暑假集训--数位dp]cf55D Beautiful numbers
    [暑假集训--数位dp]hdu3709 Balanced Number
  • 原文地址:https://www.cnblogs.com/klslb/p/8286762.html
Copyright © 2011-2022 走看看