SpringMVC03:RestFul和控制器


SpringMVC03:RestFul和控制器

控制器Controller

  • 控制器復雜提供訪問應用程序的行為,通常通過接口定義或注解定義兩種方法實現。

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

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

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

     

實現Controller接口

Controller是一個接口,在org.springframework.web.servlet.mvc包下,接口中只有一個方法;

//實現該接口的類獲得控制器功能
public interface Controller {
  //處理請求且返回一個模型與視圖對象
  ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponsevar2) throws Exception;
}

測試

  1. 新建一個Moudle,springmvc-04-controller 。將剛才的03 拷貝一份, 我們進行操作!

    • 刪掉HelloController

    • mvc的配置文件只留下 視圖解析器!

  2. 編寫一個Controller類,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;
    }
    }
  3. 編寫完畢后,去Spring配置文件中注冊請求的bean;name對應請求路徑,class對應處理請求的類

    <bean name="/t1" class="com.kuang.controller.ControllerTest1"/>
  4. 編寫前端test.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的視圖解析器

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
      <title>Kuangshen</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
  5. 配置Tomcat運行測試,我這里沒有項目發布名配置的就是一個 / ,所以請求不用加項目名,OK!

     

    img

說明:

  • 實現接口Controller定義控制器是較老的辦法

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

     

使用注解@Controller

  • @Controller注解類型用於聲明Spring類的實例是一個控制器(在講IOC時還提到了另外3個注解);

  • Spring可以使用掃描機制來找到應用程序中所有基於注解的控制器類,為了保證Spring能找到你的控制器,需要在配置文件中聲明組件掃描。

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

    //@Controller注解的類會自動添加到Spring上下文中
    @Controller
    public class ControllerTest2{

      //映射訪問路徑
      @RequestMapping("/t2")
      public String index(Model model){
          //Spring MVC會自動實例化一個Model對象用於向視圖中傳值
          model.addAttribute("msg", "ControllerTest2");
          //返回視圖位置
          return "test";
    }

    }
  • 運行tomcat測試

    img

可以發現,我們的兩個請求都可以指向一個視圖,但是頁面結果的結果是不一樣的,從這里可以看出視圖是被復用的,而控制器與視圖之間是弱偶合關系。

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

 

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 刪除,GET或POST

使用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

學習測試

  1. 在新建一個類 RestFulController

    @Controller
    public class RestFulController {
    }
  2. 在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";
         
    }
     
    }
  3. 我們來測試請求查看下

    img

  4. 思考:使用路徑變量的好處?

    • 使路徑變得更加簡潔;

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

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

       

      img

  5. 我們來修改下對應的參數類型,再次測試

    //映射訪問路徑
    @RequestMapping("/commit/{p1}/{p2}")
    public String index(@PathVariable int p1, @PathVariable String p2, Model model){

      String result = p1+p2;
      //Spring MVC會自動實例化一個Model對象用於向視圖中傳值
      model.addAttribute("msg", "結果:"+result);
      //返回視圖位置
      return "test";

    }

    img

使用method屬性指定請求類型

用於約束請求的類型,可以收窄請求范圍。指定請求謂詞的類型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

我們來測試一下:

  • 增加一個方法

    //映射訪問路徑,必須是POST請求
    @RequestMapping(value = "/hello",method = {RequestMethod.POST})
    public String index2(Model model){
      model.addAttribute("msg", "hello!");
      return "test";
    }
  • 我們使用瀏覽器地址欄進行訪問默認是Get請求,會報錯405:

    img

  • 如果將POST修改為GET則正常了;

    //映射訪問路徑,必須是Get請求
    @RequestMapping(value = "/hello",method = {RequestMethod.GET})
    public String index2(Model model){
      model.addAttribute("msg", "hello!");
      return "test";
    }

    img

小結:

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

所有的地址欄請求默認都會是 HTTP GET 類型的。

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

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

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

 

擴展:小黃鴨調試法

場景一:我們都有過向別人(甚至可能向完全不會編程的人)提問及解釋編程問題的經歷,但是很多時候就在我們解釋的過程中自己卻想到了問題的解決方案,然后對方卻一臉茫然。

場景二:你的同行跑來問你一個問題,但是當他自己把問題說完,或說到一半的時候就想出答案走了,留下一臉茫然的你。

其實上面兩種場景現象就是所謂的小黃鴨調試法(Rubber Duck Debuging),又稱橡皮鴨調試法,它是我們軟件工程中最常使用調試方法之一。

img

此概念據說來自《程序員修煉之道》書中的一個故事,傳說程序大師隨身攜帶一只小黃鴨,在調試代碼的時候會在桌上放上這只小黃鴨,然后詳細地向鴨子解釋每行代碼,然后很快就將問題定位修復了。


免責聲明!

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



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