• 构建第一个Spring Boot2.0应用之Controller(三)


                       

    Controller控制器主要是接收浏览器请求。下面说一说@Controller注解和@RestController的区别: 

    (1)@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面。在方法上加@ResponseBody注解,也可以返回实体对象。

    (2)@RestController类中的所有方法只能返回String、Object、Json等实体对象,不能跳转到模版页面;若要实现跳转到模板页面,需将返回的模板页面名称保持到ModelAndView中返回。

    (3)@RestController相当于@ResponseBody + @Controller。

    相同点:都是用来表示Spring某个类的是否可以接收HTTP请求

    接之前的项目,学习Controller与RestController的区别

    一。controller注解的使用

    1.注释HelloController类的@RestController注解,给类添加@Controller注解,如下

    启动项目,并在浏览器中访问http://localhost:8088/sptest/hello

    出现404错误

    2.在项目resources目录下面创建templates目录,并添加index.html页面

     

    重新启动应用,并按照上述url地址,在浏览器中运行,则出现如下错误

    (3).在pom.xml 中引入模板引擎jar包

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

    重新启动应用,并在浏览器运行上述url。结果如下

     即Controller返回的是字符串,或者是字符串匹配的模板名称。在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面;若返回json等内容到页面,则需要加@ResponseBody注解。

    (3)继续修改HelloController类如下:

    package com.yy.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * Created by Administrator on 2018-05-18.
     */
    //@RestController
    @Controller
    public class HelloController {
        @RequestMapping(value = "/hello1",method= RequestMethod.GET)
        public  String sayHello1()
        {
            String hello="index";
            return hello;
        }
        @ResponseBody
        @RequestMapping(value = "/hello2",method= RequestMethod.GET)
        public  String sayHello()
        {
            String hello="index";
    
            return hello;
        }
    }

      则http://localhost:8088/sptest/hello1,返回index.html,如下:

     

      则http://localhost:8088/sptest/hello2,返回index字符串

     

    二.@RestController注解的使用

           将上例中的类的@Controller注解换为@RestController,其他都不变。

            则这个Controller的所有方法上面都加了@ResponseBody,不论你在每个方法前加、或不加@ResponseBody,都一样。所以这种Controller不会返回页面。

        运行http://localhost:8088/sptest/hello1,http://localhost:8088/sptest/hello2返回的都是index字符串,即

       

    @RestController = @Controller + @ResponseBody,返回字符串。

    三.@RestController 返回页面映射

         若想在使用@RestController注解的类中实现页面跳转,则需要在方法中用ModelAndView进行封装,如下:

    package com.yy.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * Created by Administrator on 2018-05-18.
     */
    @RestController
    //@Controller
    public class HelloController {
        @RequestMapping(value = "/hello1",method= RequestMethod.GET)
        public  String sayHello1()
        {
            String hello="index";
            return hello;
        }
        @ResponseBody
        @RequestMapping(value = "/hello2",method= RequestMethod.GET)
        public  String sayHello2()
        {
            String hello="index";
    
            return hello;
        }
    
        @RequestMapping(value = "/hello3",method= RequestMethod.GET)
        public ModelAndView sayHello3()
        {
            ModelAndView mv = new ModelAndView("index");
    
            return mv;
        }
    }

    http://localhost:8088/sptest/hello3

    四.  配置Url映射集合

       在被@Controller和@RestController注解修饰的类中,若要用不同的url访问同一方法,则可以在@RequestMapping注解的value映射中配置成集合的方式。如下:

    对于@Controller注解 

     @ResponseBody
        @RequestMapping(value = {"/hello2","/index2"},method= RequestMethod.GET)
        public  String sayHello2()
        {
            String hello="index";
    
            return hello;
        }

    对于@RestController注解

    @RequestMapping(value = {"/hello2","/index2"},method= RequestMethod.GET)
        public  String sayHello2()
        {
            String hello="index";
    
            return hello;
        }

    则使用http://localhost:8088/sptest/hello2,和http://localhost:8088/sptest/index2访问,进入syaHello2方法,都会返回index字符串,如下:

         

  • 相关阅读:
    同一域环境下SQLServer DB Failover故障转移配置详解
    WebAPI项目中使用SwaggerUI
    Failed to initialize the Common Language Runtime
    WCF Throttling 限流的三道闸口
    Entity Framework 乐观并发控制
    MVC3不能正确识别JSON中的Enum枚举值
    编写高质量代码改善C#程序的157个建议读书笔记【11-20】
    如果下次做模板,我就使用Nvelocity
    对于react中的this.setState的理解
    对于react中rredux的理解
  • 原文地址:https://www.cnblogs.com/EggKiller/p/9063428.html
Copyright © 2020-2023  润新知