关于SpringMVC的@RequestParam注解的详细探讨!


我们做WEB开发的,每天与我们形影不离的就是前后台交互.说白了,WEB开发无非就是搜集获取前端view数据,然后通过Controller交给后台处理,最后把数据模型返回给前端view进行渲染.这,就是MVC.

RequestParam是做什么的?

如果你不熟悉@RequestParam注解,那我想你一定熟悉request.getParameter().没错,@RequestParam注解也是用来获取前端数据的,这种方法简单快捷,为我们日常开发提供了不少便利.
以前对这个注解也是挺模糊的,反正就是能用就行了,今天用的时候让我有点点难受.我决定好好的整理一下这个注解的用法.


首先看下它都有什么属性吧~

RequestParam的属性一览表

属性类型含义
nameString最新版本好像已经没有这个属性了,直接用 “” 引用字符串即可
valueString用来固定请求中携带参数的名称,和name一个作用
requiredboolean用来标示请求中是否必须携带参数,true必须携带,false可不携带
defaultValueString用来设定一个默认值,比如defaultValue =”1”,如果需要携带参数但是没有携带,那就采用这个默认值

RequestParam的用法及属性的作用

下面我们一步一步的来演示,彻底搞明白这个注解的用法,下面所有函数我们都假设后台正常接收到传的参数了,我们用手工修改URL请求地址参数的方式来验证RequestParam的用法

1.无注解、无任何参数的请求方法
//首先我们不接收任何参数,直接访问这个方法,为了验证结果返回一个的"helloword"页面test.jsp
@RequestMapping(value="/test1")
    public String test1(){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test1 (SpringMVC是我自己本地的测试项目),成功返回测试页面.这是最简单最正常的情况.


接下来我们给这个方法加点调味剂

2.无注解、有参数的请求方法
//我们给这个方法起名test2,并传入一个Integer类型的参数,为什么传包装类后面我会解释,这点很重要!细节!
@RequestMapping(value="/test2")
    public String test2(Integer id){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test2?123,成功返回测试页面.说明后台接收到我们的参数了,OK
浏览器再次键入:localhost:8080/SpringMVC/test2,同样成功返回测试页面,说明不加@RequestParam注解的方法,不管有没有参数都可以访问到.当然了,不加注解也就无法获取前台的数据,在这只是拿出来跟后面做个对比,便于理解.


是不感觉有点意思了?我们下面再给这个方法放点调味剂!

3.有注解、有参数、没属性的请求方法
//我们给第三个方法加上@RequestParam注解,但是并不使用属性,看看什么情况
@RequestMapping(value="/test3")
    public String test3(@RequestParam Integer id){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test3
test3()和test2()唯一的区别就是加了@RequestParam注解,不出意外你会看到”HTTP Status 400 - Required Integer parameter ‘id’ is not present”这个错误,因为没有传入id参数.
我们给它传个参数试试,浏览器键入:localhost:8080/SpringMVC/test3?id=123,成功返回测试页面.
这就是RequestParam的作用,获取前台传过来的参数!
那么如果前台没有这个参数值,但是后台又必须要这个值怎么办呢?这时候就用到了我们前面提到的defaultValue属性了,往下看!


4.使用defaultVaule属性传默认参数
//这有个细节需要注意,defaultValue虽然接收的是String类型,但是这个值必须必须必须要跟方法中的参数类型一致
//也就是说如果我在这设置的默认值不是3,而是abc,那么这个方法是访问不到测试页面的,相当于没传参
@RequestMapping(value="/test4")
    public String test4(@RequestParam (defaultValue="3") Integer id){
        return "test";
    }

我们先不用默认值参数来访问页面
浏览器键入:localhost:8080/SpringMVC/test4?123,成功返回测试页.
然后我们再不手动传参访问下试试
浏览器键入:localhost:8080/SpringMVC/test4,你会惊奇的发现,也成功访问到了测试页面.这就是defaultValue的作用,提供一个默认的参数.


5.使用value属性来固定请求携带参数的名称
//首先,name和value属性是一样的作用,都是用来固定请求中参数的名称
@RequestMapping(value="/test5")
    public String test5(@RequestParam (value="ip") Integer id){
        return "test";
    }

到底什么意思呢?一试便知,首先在浏览器键入:localhost:8080/SpringMVC/test5?id=123.
咦咦咦咦咦?你会发现,你传入了参数,请求地址也没错,怎么就报错了呢?这就是value属性的作用,强行改变你请求中参数的名称.默认使用的是方法中定义的参数名称: “id”
我们稍微改吧改吧,浏览器键入:localhost:8080/SpringMVC/test5?ip=123,哟,现在成功返回测试页面了.


有时候你需要获取一些前台的参数,但这些参数并不是非要不可,怎么办呢?

6.required属性
//这就用到了required属性,true or false
@RequestMapping(value="/test6")
    public String test6(@RequestParam (required = false) Integer id){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test6,或者localhost:8080/SpringMVC/test6?id=123你会发现,两者都可以正常访问返回测试页面.这就是这个属性的作用,就算没有这个参数也可以正常访问.


7.一个注解@RequestParam只能接收一个参数
@RequestMapping(value="/test7")
    public String test7(@RequestParam  Integer id,String name){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test7?id=123&name=abc,成功返回测试页.因为name没有@RequestParam注解,所以系统传入一个null.后台接收不到abc的,所以如果想让后台收到abc,需要这样写.

@RequestMapping(value="/test8")
    public String test8(@RequestParam Integer id,@RequestParam String name){
        return "test";
    }

浏览器键入:localhost:8080/SpringMVC/test8?id=123&name=abc,成功返回测试页.

到这里,@RequesParam的作用和它几个重要属性的作用和用法基本就清晰了,相信你也明白了.


8.关于传参的一个小细节

请回到第1段代码,我注释中提到为什么要传Integer包装类,而不是int基本数据类型.我也在这给大家做个示范,一看就明白了!

//我们姑且就传一个int类型的参数,不加@RequestParam注解以便好理解
@RequestMapping(value="/test9")
    public String test9(int id){
        return "test";
    }

浏览器输入:localhost:8080/SpringMVC/test6,你会发现浏览器报错了,而且一堆.可别被这么多错误代码唬住了,其实就是一个参数类型不对应导致的.
因为test9()传入的参数是一个int类型,这是个基本数据类型.但是呢,这个方法又恰恰没有@RequestParam注解,也就是说可以不携带参数就能访问.之所以能访问.是因为系统帮你传入了个null.
那好,现在你请求服务器,SpringMVC一看你没给传参数,它做个好人帮你传个null,一传发现里面是个int型,这就尴尬了.我一个null是属于对象的,怎么能传给基本数据类型呢?所以系统就提示了,嘿哥们,我不能把基本数据类型转换成null.而这,就是我们要传包装类型Integerr的原因,因为它可以转成null.这是一个小细节,不注意的话可能会出问题.


小结

总结一下,@RequestParam是用来获取前台页面的参数的,根据情况不同选择利用其属性完成业务.万变不离其宗,总而言之,用它来获取前台页面的参数就对了!就是有些小细节需要注意@-@!

                                                                  2018-5-4 青年节 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值