Controller中常用注解的细节

439 阅读3分钟

一、@Controller

声明该类为SpringMVC中的Controller,控制器Controller 负责处理分发处理器DispatcherServlet 发来的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,再返回给对应的View 进行展示。


分发处理器DispatcherServlet会在整个项目目录中扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。




二、@RequestMapping

@RequestMapping的作用是建立请求URL和处理方法之间的对应关系,可以作用在方法和类上。用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径。


@RequestMapping的属性

  • value:指定请求路径的URL
  • method:指定该方法的请求方式,可以有post和get

@GetMapping 是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。



三、@RequestBody与@RequestParam

在POST请求且前端请求头的Content-Type字段值为 application/json 时,后端就会将前端传来的json格式的数据转换为自己定义好的javabean对象,需要注意的是传入数据的属性名称要和后端javabean中定义的一致。


如果前端没有特意设置这个字段,数据就会以默认的 Content-Type:application/x-www-form-urlencoded 格式发送到后端。后端就只能以@RequestParam接收。


注解@RequestParam接收的参数除了这种默认的格式之外,还能接收form表单提交的form-data以及url里?后面的参数。

@RequestParam有三个配置参数:

  • required:表示该参数是否必须有,默认为 true。也就是进行表单验证
  • defaultValue:可设置请求参数的默认值。
  • value:对应url的参数名,相当于key值,名字必须一致,后面的value类型要一致,名字任意。


关于@RequestBody与@RequestParam使用的选择 :

在GET请求中,不能使用@RequestBody,只能用@RequestParam。因为没有HttpEntity,HandlerAdapter 配置的HttpMessageConverters无处去解析。


在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,需要同时满足两个条件:1.前端必须规定 contentType:"application/json";2.传入数据的属性名称要和后端javabean中定义的一致。


另外,无论是POST请求还是GET请求, form-data以及url里?后面的参数都不能用@RequestBody接收,只能用@RequestParam




 四、@ResponseBody

@ResponseBody注解通常使用在Controller方法上(写在方法名上面),通过HandlerAdapter 配置的HttpMessageConverter接口,将方法返回的对象转换为指定格式的数据,如:json、xml等,然后写入到Response的响应体中返回给客户端,配置的视图解析器InternalResourceViewResolver不再起作用,返回的内容就是Return 里的内容,return的内容直接输出在页面上。


@ResponseBody注解也可以直接用于类上,就写在@Controller下面,表示该类中的所有Controller方法均使用该注解。


另外需要注意的是,如果将对象转换成json返回,需要设置编码,否则中文传到页面上会变成问号。

response.setCharacterEncoding("utf-8");

如果直接返回中文字符串,页面可能出现乱码。需要在后端的注解中手动修改编码格式

@RequestMapping(produces=“text/html;charset=utf-8”)

POST和GET请求都可以使用@ResponseBody



五、@RestController

通过上面我们知道,当@Controller写在类上且@ResponseBody写在类中某个方法上时,该方法返回的对象会被转化为json直接输出在页面上。而如果@RestController写在类上,就相当于该类的所有方法都无法返回到jsp页面,而是直接return一个json文件。

@RestController注解就相当于 @Controller + @ResponseBody 合在一起的作用。




blog.csdn.net/weixin_3800…