Springmvc之引數繫結
spring引數繫結過程
概念:從客戶端請求key/value資料,經過引數繫結,將key/value資料繫結到controller方法形參上。
springmvc中,接受頁面提交的資料是通過方法形參來接收,而不是在controller類定義成員變數來接收
第一步: 客戶端請求:key/value請求
第二步:處理器介面卡呼叫springmvc 提供引數繫結元件將key/value資料轉成controller方法的形參
引數繫結元件:在springmvc早期版本使用PropertyEditor(只能講字串轉成java物件)
後期使用converter(進行任意型別的轉換)
springmvc提供了許多converter(轉換器)
在特殊情況下需要自定義converter,對日期資料型別需要自定義converter。
第三步:controller方法(形參)
預設支援的型別
直接在controller方法形參上定義下邊型別的物件,就可以使用這些物件。
在引數繫結過程中如果遇到下邊的型別直接進行繫結
1、HttpServletRequest
通過request物件獲取請求資訊
2、HttpServletResponse
通過response處理響應資訊
3、HttpSession
通過session物件得到session中存放的物件
4、Model/ModelMap
model是一個介面 modelMap是一個介面實現
作用:將model資料填充到request域
除了以上還支援簡單型別
簡單型別
通過@RequestParam來對簡單型別的引數進行繫結。
如果不使用@RequestParam,要求request傳入的引數名稱和controller方法的形參名稱一致方可繫結成功。
如果使用@RequestParam,不用限制request傳入的引數名稱和controller方法的形參名稱一致。
@RequestParam(value="id",required = true,defaultValue ="2" )Integer items_id
其中value裡面指定request傳入引數名稱和形參繫結
通過required屬性指定引數是否必須傳入
通過defaultValue可以設定預設值。如果id引數沒有傳入,則將預設值和形參繫結
簡單型別包括
整型(Integer) 字串(String) 單精度/雙精度(float/double) 布林型(boolean)
pojo繫結
1、簡單物件繫結
頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中資料繫結到pojo 。
2、包裝型別繫結
需求:當單獨實體類滿足不了需求 或者 需要傳入不同的pojo其中有相同名字的引數
實現方法:
第一種方法:在形參中,通過HttpServletRequest接收查詢引數
第二種方法:用包裝類接收查詢引數
分析:
頁面 傳參特點:複雜,多樣性。
如果將使用者賬號、商品編號、訂單資訊放在簡單pojo中,pojo類屬性比較多而複雜,
建議使用包裝型別的pojo,pojo屬性是pojo。
controller方法形參:
public ModelAndView queryItems(HttpServletRequest request,QueryVo,vo){}
此種方法要求在頁面中傳參使用以下形式:
<input name="itemCustom.name"/>
包裝型別定義為:
public class QueryVo{
private Item items;
private ItemsCustom itemCustom;
}
自定義引數繫結實現日期型別繫結
對於controller形參中有pojo物件,如果屬性中有日期型別,需要自定義引數繫結。
將請求日期資料串轉成日期型別,要轉換的日期型別和pojo中日期屬性的型別保持一致。
這裡講述自定義引數繫結將日期字串轉成java.util.Date型別
需要向處理器介面卡中注入引數繫結元件
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!--日期型別轉換-->
<bean class="com.evergrande.hdtms.web.converter"></bean>
</list>
</property>
</bean>
定義converter類實現轉換功能
public class converter implements Converter<String, Date> {
@Override
public Date convert(String s) {
//實現將日期串型別轉換成日期型別(格式是yyyy-MM-dd HH:mm:ss)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
//如果引數繫結失敗返回null
return null;
}
}
集合繫結
集合繫結通常包括陣列,List,以及map 一般與包裝型別的實現相似,不過多介紹。