【问题标题】:How to replace @Controller by @RestController?如何用@RestController 替换@Controller?
【发布时间】:2021-04-12 12:53:57
【问题描述】:

这是我的TeacherController

@Controller
@RequestMapping("/teacherController")
public class TeacherController {
private static final String TEACHER_MODEL = "teacher";
@Autowired
TeacherService teacherService;


@RequestMapping("check")
public ModelAndView index() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("teachers", teacherService.getAll());
    modelAndView.setViewName("/teacherViews/teachersPage");
    return modelAndView;
}

这里是我打印表格的页面:

<table  class="table table-dark" border="1" width="100%" cellpadding="5">
<thead>
<tr>
    <th>Teacher ID</th>
    <th>Teacher Name</th>
    <th>Teacher Position</th>
</tr>
</thead>
<tbody id="teacherBody">
<tr th:each="teacher : ${teachers}">
    <td th:text="${teacher.teacherId}" />
    <td th:text="${teacher.teacherName}" />
    <td th:text="${teacher.position}" />
</tr>
</tbody>

我上面写的所有内容都需要使用 RestController 和 AJAX 重写。 据我了解,我希望该表数据自动加载加载页面,它可以与js一起使用。

所以,我的问题是我需要使用 AJAX 将我的 Controller 重写为 RestController,但我不明白该怎么做。

提前感谢您的帮助!!!

【问题讨论】:

    标签: java ajax spring spring-restcontroller


    【解决方案1】:

    Spring MVC @Controller 经典控制器可以使用 @Controller 注解进行注解。这只是@Component 类的一个特化,允许通过类路径扫描自动检测实现类。

    @Controller 通常与请求处理方法中使用的@RequestMapping 注解结合使用。

    让我们看一个 Spring MVC 控制器的简单示例:

    @控制器

    @RequestMapping("书籍") 公共类 SimpleBookController {

    @GetMapping("/{id}", produces = "application/json")
    public @ResponseBody Book getBook(@PathVariable int id) {
        return findBookById(id);
    }
    
    private Book findBookById(int id) {
       
    }
    

    }

    请求处理方法用@ResponseBody注解。此注解可以将返回对象自动序列化为 HttpResponse。

    Spring MVC @RestController @RestController 是控制器的专用版本。它包含 @Controller 和 @ResponseBody 注释,因此简化了控制器的实现:

    @RestController

    @RequestMapping("books-rest") 公共类 SimpleBookRestController {

    @GetMapping("/{id}", produces = "application/json")
    public Book getBook(@PathVariable int id) {
        return findBookById(id);
    }
    
    private Book findBookById(int id) {
        
    }
    

    }

    控制器使用@RestController 注释进行注释,因此不需要@ResponseBody。

    控制器类的每个请求处理方法都会自动将返回对象序列化为HttpResponse。

    【讨论】:

      【解决方案2】:

      @Controller 和@Rest 控制器的区别

      @Controller

      @Controller 注解已经成为框架的一部分很长时间了。@Controller 注解指定被注解的类是一个控制器。它是@Controller 的一个特化,通过类路径扫描自动检测。它通常与基于 @RequestMapping 注解的注解处理程序方法合并使用。

      例如,

      @Controller
      @RequestMapping("users")
      public class HomeController {
      
          @GetMapping(produces = "application/json")
          public @ResponseBody User getAllUsers() {
              return findAllUsers();
          }
      }
      

      请求处理方法用@ResponseBody注解。此注解可以将返回对象自动序列化为 HttpResponse。

      @RestController

      @RestController 注解是在 Spring 4.0 中引入的,用于简化 RESTful Web 服务的生成。这是一个结合@Controller和@ResponseBody的便利注解

      例如,

      @RestController
      @RequestMapping("users")
      public class HomeController {
      
          @GetMapping(produces = "application/json")
          public Book getAllUsers() {
              return findAllUsers();
          }
      }
      

      控制器使用@RestController 注释进行注释,因此不需要@ResponseBody。控制器类的每个请求处理方法都会自动将返回对象序列化为 HttpResponse。 Link

      转换后

      RestController

      import java.util.List;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      @RequestMapping("/api/v1")
      public class TeacherController {
      
          @Autowired
          TeacherService teacherService;
      
          @GetMapping("/teacher")
          public List<Teacher> fetchAllTeacher() {
              return teacherService.getAll();
          }
      }
      

      HTML

      <table id="table-content" border='1'>
      <tr>
          <th>Teacher ID</th>
           <th>Teacher Name</th>
          <th>Teacher Position</th>
      </tr>
      

      Javascript(未测试)

      var service = 'http://localhost/api/v1/';
      
      $(document).ready(function(){
      
          jQuery.support.cors = true;
      
          $.ajax(
          {
              type: "GET",
              url: service + '/teacher/',
              data: "{}",
              contentType: "application/json; charset=utf-8",
              dataType: "json",
              cache: false,
              success: function (data) {
                  
              var trHTML = '';
                      
              $.each(data, function (i, item) {
                  
                  trHTML += '<tr><td>' + data.Teacher[i].Name + '</td><td>' + data.Teacher[i].Position + '</td></tr>';
              });
              
              $('#table-content').append(trHTML);
              
              },
              
              error: function (msg) {
                  
                  alert(msg.responseText);
              }
          });
      })
      

      【讨论】:

      • 但是它只在这个地址localhost:8081/api/v1/teacher的空白页面上打印老师我需要老师在我的页面上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多