Spring框架:Controller和RestController區別


了解如何利用SpringMVC的注釋創建RESTful Web服務。

Spring的基於注釋的MVC框架簡化了創建RESTful Web服務的過程。傳統的Spring MVC控制器和RESTful Web服務控制器之間的關鍵區別在於: 創建HTTP響應主體的方式。

雖然傳統的MVC控制器依賴於View技術,但RESTful Web服務控制器只返回對象,對象數據作為JSON / XML直接寫入HTTP響應。

以下步驟描述了典型的Spring MVC REST工作流:

  1. 客戶端以URI形式向Web服務發送請求。
  2. 該請求被DispatcherServlet攔截,該服務器查找Handler Mappings及其類型。
    • 應用程序上下文文件中定義的Handler Mappings部分告訴DispatcherServlet使用哪種策略根據傳入請求查找控制器。
    • Spring MVC支持三種不同類型的映射請求URI到控制器:注釋,名稱約定和顯式映射。
  • 請求由Controller處理,響應返回到DispatcherServlet,然后DispatcherServlet將調度到視圖。 

    使用@Controller時需要用@ResponseBody注釋

    Spring 3.x 或使用@Controller情況下,在方法上使用@ResponseBody注釋時,Spring會轉換返回值並自動將其寫入HTTP響應。Controller類中的每個方法都必須使用@ResponseBody進行注釋。

    Spring有一個在后台注冊的HttpMessageConverters列表。HTTPMessageConverter的職責是將請求主體轉換為特定類並再次返回響應主體,具體取決於預定義的mime類型。每次發出請求命中@ResponseBody時,Spring都會遍歷所有已注冊的HTTPMessageConverters,尋找符合給定mime類型和類的第一個,然后將其用於實際轉換。

    @Controller
    @RequestMapping("employees")
    public class EmployeeController {
        Employee employee = new Employee();
        @RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
        public @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) {
           employee.setName(name);
           employee.setEmail("employee1@genuitec.com");
        return employee; 
        }
    
        @RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
        public @ResponseBody Employee getEmployeeInXML(@PathVariable String name) {
           employee.setName(name);
         employee.setEmail("employee1@genuitec.com");
           return employee; 
        }
    }
    

     

    注意@ResponseBody添加到返回值中的每個@RequestMapping方法,Spring將做兩件事:

    1. 將<context:component-scan> 和  <mvc:annotation-driven /> 標記添加  到Spring配置文件中。
      • <context:component-scan> 激活注釋並掃描包以在應用程序上下文中查找和注冊bean。 
      • <mvc:annotation-driven/> 如果Jackson / JAXB庫在類路徑上,則添加對讀寫JSON / XML的支持。 
      • 對於JSON格式,包括jackson-databind jar,對於XML,包括項目類路徑的jaxb-api-osgi jar。
  • 可在任何服務器(例如,Tomcat)上部署並運行應用程序。

     http://localhost:8080/SpringRestControllerExample/rest/employees/Bob  並顯示輸出JSON.

    http://localhost:8080/SpringRestControllerExample/rest/employees/Bob.xml 輸出XML

    使用@RestController

    Spring 4.0引入了@RestController,這是一個控制器的專用版本,它是一個方便的注釋,除了自動添加@Controller和@ResponseBody注釋之外沒有其他新魔法。

    通過使用@RestController批注對控制器類進行注釋,您不再需要將@ResponseBody添加到所有請求映射方法中。@ResponseBody注釋默認處於活動狀態。

    要在我們的示例中使用@RestController,我們需要做的就是將@Controller修改為@RestController並從每個方法中刪除@ResponseBody。結果類應如下所示:

    @RestController
    public class EmployeeController {
    
        Employee employee = new Employee();
    
        @GetMapping("/employees/{name}")
        public Employee getEmployeeInJSON(@PathVariable("name") String name) {
           employee.setName(name);
           employee.setEmail("employee1@genuitec.com");
           return employee;
        }
     
    }
    

     

    我們不再需要將@ResponseBody添加到請求映射方法中。進行更改后,再次在服務器上運行應用程序會產生與以前相同的輸出。

    使用@RestController非常簡單,這是從Spring v4.0開始創建MVC RESTful Web服務或基於SpringBoot 2的首選方法。

本文轉載自:https://www.jdon.com/50892


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM