1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面
2.若返回json等内容到页面,则需要加@ResponseBody注解
3.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
/////////////////////////////////////////////////
spring4.1中添加了@RestController注解、集成了@ResponseBody注解。@ResponseBody注解的作用是将Controler返回的对象通过合适的转换器转化成指定的格式之后,写入到Response对象的body区,通常用来返回Json数据或xml数据。需要注意的是,使用了此注解后将不会再走视图处理器。
举例说明:
@Controller
public Class TestController{
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
} }
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于
@Controller
public Class TestController{
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
} }
等同于
@RestController
public Class TestController{
@RequestMapping("/login")
public User login(User user){
return user;
}
}
/////////////////////////////////////////////////
@RestController这个注解相当于@Controller和@ResponseBody的一个组合,当我们使用@RestController注解定义一个类的时候,这个类中方法传递给前端的数据会自动转换为json类型。这里需要注意@RestController只是标识类传递给前端的数据类型为json,而类中的方法如果想接受前端的数据还是需要在对应的方法参数中添加@RequestBody注解。
这里一定要记住的是@RestController=@Controller+@ResponseBody,不包括@RequestBody注解,如果我们想要获取前端传递过来的json数据不管使用@RestController还是@Controller注解都要在类的方法中加上@RequestBody注解。
/////////////////////////////////////////////////
遇到一个坑爹的问题,springboot项目,写的controller之前一直都是@Controller注解,跳转页面没有问题,不过写个方法返回数据时就出现了问题
页面访问/tologin可以进入登录页面,当我用ajax调用testlogin时,理应返回一个json数据,进入ajax的success方法,后台没有错误,但是实际结果直接进入ajax的error方法。
将方法修改添加@ResponseBody,表名该方法返回数据而不是跳转页面,
@Controller表明该类内的所有方法默认返回页面路径,加了@ResponseBody的方法返回数据。
@RestController则是相当于@Controller@ResponseBody两个注解,该类返回的都是数据,不返回页面。
/////////////////////////////////////////////////
restcontroller与controller
假定一个user对象,对象有很多属性(name,sex,age,birth,address,tel)
在我的了解中,这二者的区分为:@restcontroller为@controller和@responsebody的结合
在@controller注解中,返回的是字符串,或者是字符串匹配的模板名称,即直接渲染视图,与html页面配合使用的,
在这种情况下,前后端的配合要求比较高,java后端的代码要结合html的情况进行渲染,使用model对象(或者modelandview)的数据将填充user视图中的相关属性,然后展示到浏览器,这个过程也可以称为渲染;
java示例代码如下:
@Controller
@RequestMapping(method = RequestMethod.GET, value = "/")
public String getuser(Model model) throws IOException {
model.addAttribute("name",bob);
model.addAttribute("sex",boy);
return "user";//user是模板名
}
对应视图user.jsp中的html代码:
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div>
<p>"${name}"</p>
<p>"${sex}"</p>
</div>
</body>
</html>
而在@restcontroller中,返回的应该是一个对象,即return一个user对象,这时,在没有页面的情况下,也能看到返回的是一个user对象对应的json字符串,而前端的作用是利用返回的json进行解析渲染页面,java后端的代码比较自由。
java端代码:
@RestController
@RequestMapping(method = RequestMethod.GET, value = "/")
public User getuser( ) throws IOException {
User bob=new User();
bob.setName("bob");
bob.setSex("boy");
return bob;
}
访问网址得到的是json字符串{“name”:”bob”,”sex”:”boy”},前端页面只需要处理这个字符串即可。
/////////////////////////////////////////////////