1. 程式人生 > >Springmvc之引數繫結

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 一般與包裝型別的實現相似,不過多介紹。