一、@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 合在一起的作用。
发表评论 取消回复