【问题标题】:Displaying index.html page using @Controller | Spring Boot使用@Controller 显示 index.html 页面 |弹簧靴
【发布时间】:2018-07-12 12:49:19
【问题描述】:

在显示我创建的 index.html 网页时遇到问题。我在前往 localhost:8080 时不断收到的输出是字符串值“index”,而不是网页本身。 /templates 目录的图像和来自 localhost 的结果可以在下面找到(超链接)

@Controller
public class IndexController {

        @RequestMapping("/")
        @ResponseBody
        public String index() {
            return "index";
        }
}

template_directory localhost:8080_result

【问题讨论】:

  • 尝试注释掉响应正文

标签: html spring spring-mvc spring-boot


【解决方案1】:

如果您不使用 thyemleaf 之类的模板引擎,则必须将 ui 文件放入名为 /public/static/resources/src/main/resources 的子文件夹中。你的index.html 放入/src/main/resources/public/index.html

控制器:

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index() {
        return "index.html";
    }
}

【讨论】:

    【解决方案2】:

    从控制器方法 addNewBooking(...) 中删除 @ResponseBody。使用@ResponseBody,您告诉 Spring 将您的方法的结果映射到 HTTP 响应正文,因此您的浏览器将其显示为纯文本(如果您想使用 Spring 开发 RESTful API,则需要这个)。当您使用 Spring MVC 时,您希望返回一个视图,因此您不需要 @ResponseBody

    编辑 1:详细解释我写的内容。

    使用Spring Web,您有两种选择来编写您的应用程序:

    • 使用JSPsThymeleaf templatesFreemaker templates -> Spring MVC 模式编写一个服务器端呈现的应用程序
    • 编写一个 RESTful 后端,例如从 RESTful 后端获取数据的单页应用程序(如 ReactJs 或 Angular)

    对于选择 1,您使用 @Controller 注释您的控制器并提供多个端点,您的 Spring 应用程序将使用您的服务器端渲染器模板进行响应。您的所有控制器都返回一个String,这是您要传输到浏览器的模板的名称。 Spring 将采用 String 名称,如 index 并将返回例如呈现给请求的index.jsp。一个示例可能如下所示:

    @Controller
    public class IndexController {
    
            @RequestMapping("/")
            public String index() {
                return "index";
            }
    }
    

    对于选项 2,您使用 @RestController OR@Controller@ResponseBody 一起注释您的控制器(技术上 @RestController 只是 @Controller 和`@ResponseBody 的组合)。通过这个设置,你告诉 Spring 使用你的控制器方法返回类型并解析它,例如将 Jackson 转换为 JSON,并将其放入 HTTP 正文中。如果您在浏览器中访问这样的端点,您会得到 对象的 JSON 表示。看下面的例子:

    @RestController
    public class IndexController {
    
            @RequestMapping("/persons")
            public List<Person> getPersons() {
                // ... some service calls/database access to get all persons
                return personList;
            }
    } 
    

    Person 类:

    public class Person {
       private String name;
       private int age;
    
       // getter and setter ...
    
    }
    

    如果您现在访问http://localhost:8080/persons,您可以获得以下输出:

    [
      {
        "name": "John Doe",
        "age": 1337
      },
      {
        "name": "Peter Parker",
        "age": 12
      }
    ]
    

    总结一下解释:如果您想提供视图(服务器端呈现的 HTML 页面),您必须使用 @Controller 并且您的控制器方法必须返回模板的名称。如果计划构建 RESTful 应用程序,请使用 @RestController@Controller@ResponseBodytogether 的组合。

    【讨论】:

    • 您能举例说明您的意思吗?
    • @YuriKhechoyan 我更新了我的答案。我希望它可以帮助您了解差异
    【解决方案3】:
       @RequestMapping("/")
       @ResponseBody
        public String index() {
            return "index";
        }
    

    删除@ResponseBody。

    @RequestBody 和@ResponseBody 注解用于将HTTP 请求/响应主体与方法参数或返回类型中的对象绑定。

    @ResponseBody : Spring 会将返回值绑定到传出的 HTTP 响应体。

    例子

         @RequestMapping(value    = "/checkuser",
                         method   = RequestMethod.GET,  
                         produces = MediaType.APPLICATION_JSON_VALUE )
         @ResponseBody
         public Boolean checkValidateUser(@RequestParam Map<String, String>  
              requestParams){
              String userName = requestParams.get("username");
              String password = requestParams.get("password");
         return 
       userBL.checkValidateUser(userName.trim().toUpperCase(),password.trim());
      }
    

    图片在 src/main/resources/static/assets/images/ src/main/resources/templates中的html页面

    @Controller
    public class IndexController {
    
        @RequestMapping("/")
        public String index() {
            return "index.html";
        }
    }
    

    【讨论】:

      【解决方案4】:

      就像其他人提到的那样,您需要做的第一件事是从控制器方法中删除 @ResponseBody 注释。

      其次,将模板目录中的静态内容移至
      src/main/resources/statictemplates 目录用于提供需要在服务器端呈现的内容(例如 Thymeleaf)。

      然后,您可以直接从控制器提供内容。

      @Controller
      public class IndexController {
      
          @RequestMapping("/")
          public String index() {
              return "index.html";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-09
        • 2017-12-22
        • 2018-02-14
        • 2019-05-03
        • 2021-04-20
        • 1970-01-01
        • 2023-01-07
        • 2021-12-09
        • 2021-05-23
        相关资源
        最近更新 更多