什麼是請求參數綁定 請求參數格式 預設是key/value格式,比如:http:xxxx?id=1&type=2 請求參數值的數據類型 都是字元串類型的各種值 請求參數值要綁定的目標類型 Controller類中的方法參數,比如簡單類型、POJO類型、集合類型等。 SpringMVC內置的參數解析組 ...
什麼是請求參數綁定
請求參數格式
預設是key/value格式,比如:http:xxxx?id=1&type=2
請求參數值的數據類型
都是字元串類型的各種值
請求參數值要綁定的目標類型
Controller類中的方法參數,比如簡單類型、POJO類型、集合類型等。
SpringMVC內置的參數解析組件
預設內置了24種參數解析組件(ArgumentResolver)
什麼是參數綁定?
就是將請求參數串中的value值獲取到之後,在進行類型轉換,然後將轉換後的值賦值給Controller類中方法的形參,這個過程就是參數綁定
預設支持的參數類型(Servlet API支持)
Controller方法形參中可以隨時添加如下類型的參數,處理適配器會自動識別併進行賦值。
- HttpServletRequest
- 通過request對象獲取請求信息
- HttpServletResponse
- 通過response處理響應信息
- HttpSession
- 通過session對象獲取session中存放的對象
- InputStream、OutputStream
- Reader、Writer
- Model/ModelMap
- ModelMap繼承自LinkedHashMap,Model是一個介面,它們的底層實現都是同一個類(BindingAwareModelMap),作用就是向頁面傳遞數據,相當於Request的作用,如下
綁定簡單數據類型
簡單類型參數綁定方式
簡單類型指的就是8種基本類型數據以及它們的包裝類,還有String類型。
在SpringMVC中,對於java簡單類型的參數,推薦的參數綁定方式有兩種:
- 直接綁定
- 註解綁定
直接綁定
要求
http請求參數的key和controller方法的形參名稱一致
請求URL
http://localhose:8080/xxx/findItem?id=1
請求參數的key為id
Controller方法
Controller的形參為Interger id,它和請求參數的key一致,所以直接綁定成功
@RequestMapping(value = "/findItem") public String findItem(Integer id) { System.out.println("接收到的請求參數是:"+ id); return "success"; }
註解綁定
要求
請求參數key和controller方法的形參名稱不一致時,需要使用@RequestParam註解才能將請求參數綁定成功。
請求URL
http://localhost:8080/xxx/findItem?itemId=1
請求參數的key為itemId
Controller方法
Controller的形參為Integer id,它和請求的參數不一致,需要使用@RequestParam註解才能綁定成功
@RequestMapping(value = "/findItem") // 通過@RequestParam註解綁定簡單類型 public String findItem(@RequestParam("itemId") Integer id) { System.out.println("接收到的請求參數是:"+ id); return "success"; }
RequestParam註解介紹
value:參數名字,即入參的請求參數名字,如value="itemId"表示請求的參數中的名字為itemId的參數的值將傳入
required:是否必須,預設是true,表示請求中一定要有響應的參數,否則將報;
http Status 400 - Required Integer parameter 'xxx' is not present
defaultValue:預設值,表示如果請求中沒有同名參數時的預設值
@RequestMapping(value = "/findItem") // 通過@RequestParam註解綁定簡單類型 // 學習@RequestParam註解中的value、required、defaultValue屬性 public String findItem ( @RequestParam(value = "itemId", required = true, defaultValue = "2") Integer id) { System.out.println("接收到的請求參數是:"+ id); return "success"; }
綁定POJO類型
要求
控制器方法的參數類型是POJO類型。
要求表單中參數名稱和POJO類的屬性名稱保持一致。
請求URL
http://localhost:8080/xxx/updateItem?id=!&name=iphone&price=1000
Controller方法
POJO定義:
Controller方法
@RequestMapping("/updateItem") public String updateItem(Integer id,Items item) { System.out.println("接收到的請求參數是:"+ id); System.out.println("接收到的請求參數是:"+ item); return "success"; }
綁定包裝POJO
包裝POJO類,依然是一個POJO,只是說為了方便溝通,將POJO中包含另一個POJO的這種類,稱之為包裝POJO。
包裝對象
public class ItemQueryVO { //商品信息 private Items item; }
頁面定義(item-list.jsp)
查詢條件: <table width="100%" border=1> <tr> <td>商品名稱:<input type="text" name="items.name" /></td> <td><input type="submit" value="查詢" /></td> </tr> </table>
Controller方法
測試方法:斷點跟蹤,查看vo中的item對象是否有值
使用簡單類型數組接收參數
要求
通過HTTP請求批量傳遞簡單類型數據的情況,Controller方法中可以用String[]或者POJO的String[]屬性接收(二選一),但是不能使用集合接收。
請求URL
http://localhost:8080/xxx/deleteItem?id=1&id=2&id=3
Controller方法
@RequestMapping("/deleteItem") public String deleteitem(Integer[] itemId){ return "success"; }
使用POJO類型集合或數組接收參數
要求
批量傳遞的請求參數,最終要使用List<POJO>來接收,那麼這個List<POJO>必須放在另一個POJO類中。
接收商品列表的POJO
public class ItemQueryVO { // 商品信息 private Item item; // 其他信息 // 商品信息集合 private List<Items> itemsList; }
請求URL
http://localhost:8080/xxx/batchUpdateItem?itemsList[0].id=1&itemsList[0].name=iphone&itemsList[0].price=1000&itemsList[1].id=2&itemsList[1].name=華為&items[1].price=5000
Controller
@RequestMapping("/batchUpdateItem") public String batchUpdateItem(ItemQueryVO vo) { return "success"; }
自定義參數綁定
請求URL
http://localhost:8080/xxx/saveItem?date=2019-12-4
Controller方法
@RequestMapping("/saveItem") public String saveItem(String date){ System.out.println("接收到的請求參數是:"+ date); return "success"; }
但是如何將date參數的類型有String改為Date,則報錯
自定義Converter
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { return simpleDateFormat.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; } }
配置Converter
在springmvc.xml中,進行以下配置
<!-- 載入註解驅動 --> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 轉換器配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.cyb.ssm.controller.converter.DateConverter"/> </set> </property> </bean>