SSM学习之路——springMVC第一天_一些注解

@RequestParam

前面说过,请求参数绑定,请求过来的参数和接收参数方法的形参要是一模一样的,但是前后端可以是两个人写的,前端传的参数是name,但是我后端方法形参写的是username,到时候发现不一致,形参要改,那么该方法里面所有涉及到这个参数都要改,非常不方便。(当然好像如果前端把参数改一改也可以用哦…)
那么这个@requestParam注解就有用了
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

<a href= "anno/testRequestParam?name=haha&pass=123">testRequestParam</a>
@Controller
@RequestMapping("/anno")
public class annoController {
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name = "username",required = false)String name, @RequestParam("pass") String password){
        System.out.println("方法执行了...");
        System.out.println(name);
        System.out.println(password);
        return "success";
    }
}

这段代码,前端的get请求传过来的参数为name和pass,但是后端的形参为name和password

运行结果:
在这里插入图片描述
为什么name是null呢?
来看这张图
可以理解为,请求参数先传递给这个注解,注解接收到了再赋值给形参
在这里插入图片描述
所以,对于name,由于注解里写的是username,对应不上,由于require=false,所以程序不会报错,但是由于没获取到,所以username为null,然后再将username的null传递给name,因此形参name拿到的是username传递给它的null,所以最终方法拿到的name是null。

对于pass而言:请求参数的pass和注解的pass对应上了,传递成功,再将注解的pass传递给形参password,是可以打印的。

@RequestBody

作用:
用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
为 false,get 请求得到是 null。

用法:
在这里插入图片描述
打印出来就是表单提交的post请求的内容,如
username=%E5%98%BB%E5%98%BB&age=12
这里用字符串接收会出现乱码,目前我还不知道怎么解决,不过这个注解通常是拿来接收前台post过来的json对象的,接收字符串并不是它该做的,查阅很多资料都是拿来接收json的乱码案例,解决方法就是在方法上面加上produces = “text/html;charset=UTF-8”,前面的text/html根据情况是application/json或者其他。

@PathVariable

作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。
required:是否必须提供占位符。

在这里插入图片描述
占位符和注解中的value要对应。

@RequestHeader

位置:
形参前面,将获取的值传给形参
作用:
用于获取请求消息头。
属性:
value:提供消息头名称
required:是否必须有此消息头
注:
在实际开发中一般不怎么用。

@CookieValue

位置:
形参前面,将获取的值传给形参
作用:
用于把指定 cookie 名称的值传入控制器方法参数。
属性:
value:指定 cookie 的名称。
required:是否必须有此 cookie。

@ModelAttribute

作用:
该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
用户数据库有3个字段:name,age,address,如果修改用户信息的时候,在表单只修改了name和age,update的时候address由于没有值,会被置为null,所以我们要先将用户原来的数据库的值存好,再执行根据更新的时候进行覆盖,这样原来的数据也会被保存。

有返回值:
在这里插入图片描述

有@ModelAttribute注解的方法会先于其他方法执行,所以在先指定了username和age后,再调用testUpdate方法,在前台只提交了姓名“嘻嘻”的情况下,age并没有被置为null,一个问题:下面方法的user对象,return到了哪里去了呢?答:return回容器里面了。此时将容器里的user对象拿出,作为参数user,在表单提交后,通过请求过来一个username,形参接收并封装到User类里面,这样就将原来的“张三”覆盖掉了,变成了新的“嘻嘻”,由此实现了保留原数据的操作。

无返回值:
通过一个Map,将user对象装到Map容器中,在执行update的时候,再根据@ModelAttribute容器中的key来取得对应的对象,赋值给形参,然后再根据前台传递的参数再封装到这个user对象中,实现覆盖。
在这里插入图片描述

@SessionAttribute

作用:
用于多次执行控制器方法间的参数共享。
属性:
value:用于指定存入的属性名称
type:用于指定存入的数据类型。

如果@SessionAttributes里面,只设置了username而没有password,则password不能被存入到session域,同样通过testGet方法,拿到的password值会是null。
在这里插入图片描述
success.jsp页面通过这一个EL表达式来打印session域里面的键值对
在这里插入图片描述
并且在jsp页面中要设置不能忽略EL表达式
在这里插入图片描述

发布了31 篇原创文章 · 获赞 0 · 访问量 1218

猜你喜欢

转载自blog.csdn.net/SixthMagnitude/article/details/104267350