spring Boot @RestController注解的理解
@RestController
Spring4之后新加入的注解,原来返回json需要@ResponseBody和@Controller配合。
即@RestController是@ResponseBody和@Controller的组合注解。
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
与下面的代码作用一样
@Controller
@ResponseBody
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
@RequestMapping 配置url映射
@RequestMapping此注解即可以作用在控制器的某个方法上,也可以作用在此控制器类上。
当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。
看两个例子
例子一:@RequestMapping仅作用在处理器方法上
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
以上代码sayHello所响应的url=localhost:8080/hello。
例子二:@RequestMapping仅作用在类级别上
/**
* Created by wuranghao on 2017/4/7.
*/
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
}
以上代码sayHello所响应的url=localhost:8080/hello,效果与例子一一样,没有改变任何功能。
例子三:@RequestMapping作用在类级别和处理器方法上
/**
* Created by wuranghao on 2017/4/7.
*/
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(value="/sayHello",method= RequestMethod.GET)
public String sayHello(){
return "hello";
}
@RequestMapping(value="/sayHi",method= RequestMethod.GET)
public String sayHi(){
return "hi";
}
}
这样,以上代码中的sayHello所响应的url=localhost:8080/hello/sayHello。
sayHi所响应的url=localhost:8080/hello/sayHi。
最近在学spring Boot,就做一个@RestController学习笔记,加深印象,虽然很多人做过,也很详细,但还是想自己做一遍,加深印象,当然,个人理解,肯定有很多不严谨,甚至错误的地方,但求能有所收获就行
View可以不严谨的理解成xxx; 这里有2种形式
1.对于有返回值的函数,return xxx,xxx是个地址,jsp访问页面的地址或者html访问页面的地址
它将由url视图解析器解析,它被作为最终视图的url的一部分,然后和相关配置组合起来,就是最终的视图地址url,然后再按照地址进行后端的视图渲染
2.对于void型的函数,xxx是json字符串,或者html字符流式的字符串,或者。。。。。字符串
PrintWriter out=response.getWriter();
out.writer(xxx);
2.1 .html字符流形式:
StringBuffer sbHtml = new StringBuffer();
sbHtml.append("<!doctype html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
sbHtml.append("<title>支付宝即时到账交易接口</title></head><body>"+ user.getNo() +"</body></html>");
out.write(sbHtml.toString());
将HTML的字符流输出打印到了--发送请求的浏览器端
2.2.json字符串:
Map<String, Object> map = new HashMap<>();
map.put("result", "ok");
map.put("data", scoreList);
printWriter.write(JSON.toJSONString(map));
个人理解:它本质上是html字符流,将json字符串放入了html字符流的<body></body>标签内
其它格式的还有xml。。。。。
Controller相当于dispatcherServlet(实现servlet接口)+Model(填充了数据的模型/模板类)
@Controller执行过程
DispatcherServlet 分发请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View ()进行展示。。。。。。(@RequestMapping("/xxx")使得该controller能被外界进行访问,相当于servlet中的url映射,或者@WebServlet注解),,用@Controller初始化一个controller,用@RequestMapping给出它的访问路径,或者说触发路径 ,触发条件。
@ResponseBody
将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的是,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输出流(InputStream(字节输入流),或者抽象类Reader(字符输入流),抽象类OutputStream(字节输出流)或者Writer(字符输出流))中,他的效果等同于通过response对象输出指定格式的数据,如:
//实体类User
public class User{private String UserName;private String password;get,set方法}
//伪代码举例
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
虽然函数有return值,但加了@ResponseBody,可将其当成void型函数来理解
@RestController注解相当于@Controller + @ResponseBody 合在一起的作用。