1. 程式人生 > 實用技巧 >mvc解耦方式獲取請求資料

mvc解耦方式獲取請求資料

1.形參屬性名即為請求資料的鍵名

問題:

DispatcherServlet將請求資料獲取後傳遞給單元方法,但是請求資料的獲取需要資料的鍵名,而DispatcherServlet不是我們自己宣告的無法修改其底層程式碼,怎麼將請求資料的鍵名告訴給DispatcherServlet呢?

解決:

在單元方法上宣告形參來接收請求資料時,形參名必須和請求資料的鍵名一致,DispatcherServlet會將呼叫單元方法的形參名作為請求資料的鍵名獲取請求資料,然後傳遞給單元方法。

實現:

2.形參名和請求資料的鍵名不一致

問題:

如果單元方法的形參名和請求資料的鍵名一致,DispatcherServlet底層會自動

將請求資料獲取後傳遞給單元方法使用,我們在單元方法中直接使用即可,美滋滋

但是在實際生產環境中,前臺請求資料的頁面是由張三編寫,而後臺對應的請求處 理的單元方法是李四宣告的。而張三和李四因為溝通不及時,造成張三前臺請求

資料的鍵名和李四後臺單元方法的形參名不一致,怎麼辦?

解決:

①讓張三修改其前臺頁面請求資料的鍵名,改成和李四的單元方法的形參名
一致。這樣雖然可以但是不現實,因為我們請求資料的鍵名,在前臺有

可能被Js或者CSS在使用,一旦修改造成大量程式碼失效。

②讓李四修改其單元方法的形參名,改成和請求資料的鍵名一致。這樣雖然

可以但是不現實,因為在單元方法的方法體中我們已經使用形參來進行邏

輯處理了,形參名修改,造成方法體程式碼也必須修改,工作量比較大。

在請求資料的鍵名和單元方法的鍵名之間宣告一個過渡的變數,來完成

請求資料的獲取

實現:

在單元方法上的形參宣告中使用註解@RequestParam來實現。

3.使用實體類物件獲取請求資料

問題:

在學習了使用SpringMVC後,我們可以在單元方法上宣告形參直接獲取請求資料

只要形參名和請求資料的鍵名一致即可。但是如果我們的請求資料過多,總不能咱

們宣告N個形參來接收請求資料吧?而且按照我們以往的開發經驗,請求資料過多

我們會將請求封裝到實體類物件中進行使用,保證資料的完整性。那麼,在Spring

MVC中一旦請求資料過多,如何在單元方法上獲取請求資料呢?

解決:

我們希望在單元方法中直接獲取一個封裝好請求資料的實體類物件使用,美滋滋。

也就說我們希望DispatcherServlet可以將請求資料封裝到實體類物件中,然後將

實體類物件作為實參傳遞給單元方法使用。在單元方法上宣告對應的實體類的形參

型別,來接收DispatcherServlet傳遞的封裝了請求資料的實體類物件,以及告訴

DispatcherServlet使用哪個實體類來封裝請求資料。而且,要求實體類的屬性名

必須和請求資料的鍵名一致,DispatcherServlet會按照該方式將請求資料賦值給

實體類的屬性。

實現:

/**
*解耦方式使用實體類物件接收請求
* 要求:
* 實體類的屬性和請求資料的鍵名一致,必須提供get/set方法。
* 注意:
* 實體類的屬性型別使用包裝類,避免請求中沒有對應的資料時出現型別轉換異常。
*/
@RequestMapping("argObject")
public String demoArgObject(User user){
//處理請求
System.out.println("MyController.demoArgObject:請求資料使用實體類物件接收:"+user);
//響應結果
return "aa";
}

4.獲取同鍵不同值的請求資料

問題:

目前我們在單元方法上可以使用形參或者實體類來接收請求資料,美滋滋。但是

有某些請求中,請求資料是同鍵不同值的。比如,在頁面中的多項選擇的請求資料,

愛好,fav=1&fav=2&fav3.像這樣的請求資料,如何獲取呢?

解決:

我們自己使用Request物件獲取同鍵不同值的資料,使用 req.ParameterValues(“鍵名”),返回值是String[]陣列。在單元方法上宣告形 參,型別為String[]陣列型別,要求形參名和請求資料的鍵名一致即可。

實現:

/**
 * 解耦合方式獲取同鍵不同值的資料
 *  要求:
 *      使用String型別的陣列來接收,形參名為請求資料的鍵名
 */
@RequestMapping("argKeyNotValue")
public String demoArgKeyNotValue(String uname,Integer age,String[] fav){
    //處理請求資料
    System.out.println("MyController.demoArgKeyNotValue:獲取同鍵不同值的請求資料:"+uname+":"+age+":"+fav[0]);
    //響應結果
    return "aa";
}

  

5.混合使用緊耦和解耦方式獲取請求資料

問題:

目前我們可以在單元方法中使用形參,實體類,request物件方式獲取請求資料,

但是如果請求中的資料,一部分要放入到對應的實體類中,一部分要使用形參直接

獲取怎麼辦?

解決:

我們可以在單元方法上根據自己的需求來宣告形參獲取請求資料, DispatcherServlet會想盡一切辦法給我們宣告的單元方法的形參賦值。那麼如果

沒有賦值,則表明形參宣告有問題。我們的獲取請求資料的方式可以混合使用。

實現:

/**
 * 單元方法請求資料獲取方式混合使用
 */
@RequestMapping("argAll")
public String demoArgAll(User user,String uname,String[] fav,HttpServletRequest request){
    //處理請求
    System.out.println("MyController.demoArgAll:獲取請求資料方式混合使用:"+user
                        +":"+uname+":"+fav[0]+":"+
                        request.getParameter("uname"));
    //響應結果
    return "aa";
}