zoukankan      html  css  js  c++  java
  • SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别

    @Controller 处理http请求

    @Controller
    //@ResponseBody
    public class HelloController {
    
        @RequestMapping(value="/hello",method= RequestMethod.GET)
        public String sayHello(){
            return "hello";
        }
    }

    如果直接使用@Controller这个注解,当运行该SpringBoot项目后,在浏览器中输入:local:8080/hello,会得到如下错误提示:

    出现这种情况的原因在于:没有使用模版。即@Controller 用来响应页面,@Controller必须配合模版来使用。spring-boot 支持多种模版引擎包括:
    1,FreeMarker
    2,Groovy
    3,Thymeleaf (Spring 官网使用这个)
    4,Velocity
    5,JSP (貌似Spring Boot官方不推荐,STS创建的项目会在src/main/resources 下有个templates 目录,这里就是让我们放模版文件的,然后并没有生成诸如 SpringMVC 中的webapp目录)

    本文以Thymeleaf为例介绍使用模版,具体步骤如下:

    第一步:在pom.xml文件中添加如下模块依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>

    第二步:修改控制器代码,具体为:

    
    /**
     * Created by wuranghao on 2017/4/7.
     */
    @Controller
    public class HelloController {
    
        @RequestMapping(value="/hello",method= RequestMethod.GET)
        public String sayHello(){
            return "hello";
        }
    }
    

    第三步:在resources目录的templates目录下添加一个hello.html文件,具体工程目录结构如下:

    其中,hello.html文件中的内容为:

     <h1>wojiushimogui</h1>

    这样,再次运行此项目之后,在浏览器中输入:localhost:8080/hello

    就可以看到hello.html中所呈现的内容了。

    因此,我们就直接使用@RestController注解来处理http请求来,这样简单的多。

    @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。

    从这两个方法所响应的url可以回过头来看这两句话:当控制器在类级别上添加@RequestMapping注解时,这个注解会应用到控制器的所有处理器方法上。处理器方法上的@RequestMapping注解会对类级别上的@RequestMapping的声明进行补充。

    最后说一点的是@RequestMapping中的method参数有很多中选择,一般使用get/post.

    小结

    本篇博文就介绍了下@Controller/@RestController/@RequestMappping几种常用注解,下篇博文将介绍几种如何处理url中的参数的注解@PathVaribale/@RequestParam/@GetMapping。

    其中,各注解的作用为:

    @PathVaribale 获取url中的数据

    @RequestParam 获取请求参数的值

    @GetMapping 组合注解

  • 相关阅读:
    (转)C#中String跟string的“区别”
    C#中的this关键字
    (转)VS2015基础 指定一个或多个项目执行
    C# 中如何输出双引号(转义字符的使用)
    (转) C#中使用throw和throw ex抛出异常的区别
    springboot
    Zookeeper
    Maven
    springboot
    springboot
  • 原文地址:https://www.cnblogs.com/qianzf/p/8384759.html
Copyright © 2011-2022 走看看