spring Boot @RestController注解的理解

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 合在一起的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值