RestFul 和控制器

HuDu發表於2020-07-04

控制器Controller

  • 控制器複雜提供訪問應用程式的行為,通常通過介面定義或註解定義兩種方法實現。

  • 控制器負責解析使用者的請求並將其轉換為一個模型。

  • 在Spring MVC中一個控制器類可以包含多個方法

  • 在Spring MVC中,對於Controller的配置方式有很多種

1、實現 Controller 介面

Controller是一個介面,在org.springframework.web.servlet.mvc包下,介面中只有一個方法

//實現該介面的類獲得控制器功能
public interface Controller {
   //處理請求且返回一個模型與檢視物件
   ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
  • 建立一個 ControllerTest1 類。
//定義控制器
//注意點:不要導錯包,實現Controller介面,重寫方法;
public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一個模型檢視物件
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","Test1Controller");
       mv.setViewName("test");
       return mv;
  }
}
  • 編寫完畢後,去Spring配置檔案中註冊請求的bean;name對應請求路徑,class對應處理請求的類
<bean name="/t1" class="com.hudu.controller.ControllerTest1"/>
  • 編寫前端test.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的檢視解析器

  • 配置Tomcat執行測試

4iXmbuyrzS.png!large

  • 說明:
  • 實現介面Controller定義控制器是較老的辦法
  • 缺點是:一個控制器中只有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩;

2、使用註解 @Controller

  • @Controller註解型別用於宣告Spring類的例項是一個控制器(在講IOC時還提到了另外3個註解);

  • Spring可以使用掃描機制來找到應用程式中所有基於註解的控制器類,為了保證Spring能找到你的控制器,需要在配置檔案中宣告元件掃描。

  • 1、配置xml檔案

<!-- 自動掃描指定的包,下面所有註解類交給IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
  • 2、增加一個ControllerTest2類,使用註解實現

    //@Controller註解的類會自動新增到Spring上下文中
    @Controller
    public class ControllerTest2{
    
     //對映訪問路徑
     @RequestMapping("/t2")
     public String index(Model model){
         //Spring MVC會自動例項化一個Model物件用於向檢視中傳值
         model.addAttribute("msg", "ControllerTest2");
         //返回檢視位置
         return "test";
    }
    }

註解方式是平時使用的最多的方式!

RequestMapping

@RequestMapping

  • @RequestMapping註解用於對映url到控制器類或一個特定的處理程式方法。可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

  • 為了測試結論更加準確,我們可以加上一個專案名測試 myweb

  • 只註解在方法上面

@Controller
    public class TestController {
    @RequestMapping("/h1")
    public String test() {
        return "test";
    }
}

訪問路徑:http://localhost:8080/專案名/h1

  • 同時註解類與方法
@Controller
@RequestMapping("/admin")
    public class TestController {
    @RequestMapping("/h1")
    public String test() {
        return "test";
    }
}

訪問路徑:http://localhost:8080/專案名/admin /h1 , 需要先指定類的路徑再指定方法的路徑

RestFul 風格

概念

Restful就是一個資源定位及資源操作的風格。不是標準也不是協議,只是一種風格。基於這個風格設計的軟體可以更簡潔,更有層次,更易於實現快取等機制。

功能

資源:網際網路所有的事物都可以被抽象為資源

資源操作:使用POST、DELETE、PUT、GET,使用不同方法對資源進行操作。

分別對應 新增、 刪除、修改、查詢。

傳統方式操作資源 :通過不同的引數來實現不同的效果!方法單一,post 和 get

http://127.0.0.1/item/queryItem.action?id=1查詢,GET

http://127.0.0.1/item/saveItem.action 新增,POST

http://127.0.0.1/item/updateItem.action 更新,POST

http://127.0.0.1/item/deleteItem.action?id=1 刪除,GETPOST

使用RESTful操作資源 :可以通過不同的請求方式來實現不同的效果!如下:請求地址一樣,但是功能可以不同!

http://127.0.0.1/item/1 查詢,GET

http://127.0.0.1/item 新增,POST

http://127.0.0.1/item 更新,PUT

http://127.0.0.1/item/1 刪除,DELETE

測試

  • 新建一個類 RestFulController

    @Controller
    public class RestFulController {
    }
  • 在Spring MVC中可以使用 @PathVariable 註解,讓方法引數的值對應繫結到一個URI模板變數上。

@Controller
public class RestFulController {

    //對映訪問路徑
    @RequestMapping("/commit/{p1}/{p2}")    public String index(@PathVariable int p1, @PathVariable int p2, Model model){
        int result = p1+p2;
        //Spring MVC會自動例項化一個Model物件用於向檢視中傳值
        model.addAttribute("msg", "結果:"+result);
        //返回檢視位置
        return "test";
    }
}
  • 測試

RestFul 和控制器

思考:使用路徑變數的好處?

  • 使路徑變得更加簡潔;

  • 獲得引數更加方便,框架會自動進行型別轉換。

  • 通過路徑變數的型別可以約束訪問引數,如果型別不一樣,則訪問不到對應的請求方法,如這裡訪問是的路徑是/commit/1/a,則路徑與方法不匹配,而不會是引數轉換失敗。

使用method屬性指定請求型別

  • 增加一個方法
    //對映訪問路徑,必須是POST請求
    //@RequestMapping(value = "/hello",method = {RequestMethod.POST})
    //將POST修改為GET則正常了
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    public String index2(Model model){
    model.addAttribute("msg", "hello!");
    return "test";
    }
  • 我們使用瀏覽器位址列進行訪問預設是Get請求,會報錯405:
    用於約束請求的型別,可以收窄請求範圍。指定請求謂詞的型別如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

小結:

Spring MVC 的 @RequestMapping 註解能夠處理 HTTP 請求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

所有的位址列請求預設都會是 HTTP GET 型別的。

方法級別的註解變體有如下幾個:組合註解

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

@GetMapping 是一個組合註解,平時使用的會比較多!

它所扮演的是 @RequestMapping(method = RequestMethod.GET) 的一個快捷方式。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章