天天看點

SpringMVC-參數綁定

在之前我們通過執行個體簡單講解過jsp頁面到背景Controller的傳值,其實也就是SpringMVC的出納書綁定,今天我們對SpringMVC的幾種常用參數綁定做一下介紹。

參數綁定在我們的開發中是很常用也很重要的東西,在開發中我們經常需要進行一些參數的傳遞,這就需要用到SpringMVC的參數綁定,參數綁定主要有簡單java類型參數綁定。pojo類型、集合類型參數綁定幾種,我們一一做介紹。

簡單類型參數綁定

SpringMVC支援簡單資料類型的參數綁定,即可将簡單類型作為Controller的參數将資料進行傳遞,如下:

//通過@RequestParam接收request傳遞過來的參數
	@RequestMapping(value="/editDatas",method={RequestMethod.POST,RequestMethod.GET})
	public String editDatas(Model model,@RequestParam(value="num",required=true)Integer num)throws Exception{
		//根據num查詢資料資訊
		DataCustom dataCustom = (DataCustom) dataService.findDataByNum(num);
		
		//通過形參中的model将資料傳送到頁面
		model.addAttribute("dataCustom", dataCustom);
		
		return "/data/editDatas";
	}
           

在上面的代碼中,我們将num作為參數傳遞給了controller,在這裡我們使用@RequestParam進行了指定,如果jsp頁面與參數名稱一緻,則不需要此項指定,直接将參數放入即可,如果參數名稱不一緻,則需要我們使用注解進行指定方可解析。

@RequestParam:

使用@RequestParam常用于處理簡單類型的綁定。

value:參數名字,即入參的請求參數名字,如value="num"表示請求的參數區中的名字為item_id的參數的值将傳入;

required:是否必須,預設是true,表示請求中一定要有相應的參數,否則将報404錯誤;

在上面的代碼中形參名稱為num,這裡使用value="num"限定請求的參數名為num,是以頁面傳遞參數的名必須為num。

注意:如果請求參數中沒有num将報異常:

HTTP Status 500 - Required Integerparameter 'item_id' is not present

這裡通過required="true"限定num參數為必需傳遞,如果不傳遞則報400錯誤,可以使用defaultvalue設定預設值,即使required=true也可以不傳item_id參數值

pojo類型參數綁定

簡單pojo參數綁定

簡單的pojo參數綁定顧名思義,就是簡單的一個pojo對象,并沒有進行相關的包裝,在開發中将pojo對象中的屬性名與傳遞進來的屬性名對應,

如果傳進來的參數名稱和對象中的屬性名稱一緻則将參數值設定在pojo對象中。

例如,我們需要将jsp頁面的資料送出,通過controller進行相關操作。

頁面代碼如下:

<input type="text" name="temp"/>
<input type="text" name="hum"/>
           

如上代碼所示,jsp頁面送出了兩個值,分别為temp與hum,我們在背景将其封裝在pojo對象中(Data),那麼在Controller中我們就可以将pojo當做參數進行資料的接收。

如下:

@RequestMapping("/editDataSubmit")
public String editItemSubmit(Data data)throws Exception{
	System.out.println(data);
}
           

如上代碼所示,将pojo對象當做參數傳遞,當請求的參數名稱和pojo的屬性名稱一緻,會自動将請求參數指派給pojo的屬性。

包裝pojo參數綁定

在開發中,往往一個簡單的pojo對象并不能滿足我們的需求,我們需要對齊進行包裝,封裝衆多的條件以及pojo類。在SpringMVC中,其實簡單的pojo參數綁定與簡單pojo的參數綁定并沒有太大差別。如下為包裝對象:

Public class QueryVo {
  private Data data;
}
           

在包裝對象中,将簡單pojo作為一個變量在包裝對象中進行引用,可對簡單pojo進行相關的同等操作。

在jsp頁面中請求如下:

<input type="text" name="data.temp" />
<input type="text" name="data.hum" />
           

如上代碼所示,在頁面請求中通過pojo得到将值進行傳遞,在Controller中,我們則通過包裝對象來擷取其值:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{}
           

自定義參數綁定

在開發中,有的類型SpringMVC是并不支援的,比如Date類型,我們需要自己進行轉換,在請求時,僅僅隻是一個String,我們需要将其轉換為相應格式的日期類型。

需要開發相應的轉換類,如下:

public class CustomDateConverter implements Converter<String, Date> {

	@Override
	public Date convert(String source) {
		try {
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			return simpleDateFormat.parse(source);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

}
           

接下來需要在springmvc.xml中進行轉換器的配置:

<!-- 自定義參數綁定 -->
	<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 轉換器 -->
		<property name="converters">
			<list>
				<!-- 日期類型轉換 -->
				<bean class="com.sw.ssm.controller.converter.CustomDateConverter"/>
			</list>
		</property>
        </bean>
           

我們還學在擴充卡以及映射器中進行引用:

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
           

如上,我們的自定義參數綁定就完成了。其實在實際開發中,我們需要進行自定義參數轉換的地方并不多,但是對于日期類型的轉換我們還是必須要掌握的。

集合類型參數綁定

在開發中,很多時候我們也會用到集合類型的參數綁定,例如我們需要查詢多個記錄(傳入多個id,通過id查詢),或者我們需要在頁面送出多條資料,是以這時候就需要我們用到集合類型的參數綁定。

字元串數組

在頁面中,通過複選框選擇多條資料,将資料id傳遞到Conyroller進行處理,Jsp頁面如下:

<input type="checkbox" name="id" value="1"/>
<input type="checkbox" name="id" value="2"/>
<input type="checkbox" name="id" value="3"/>
           

頁面通過請求将資料傳送到背景進行處理,傳送到背景以後,其資料格式為1,2,3

在Controller中我們就可以通過字元串數組String[]進行資料的接收,如下:

public String deleteitem(String[] id)throws Exception{
		System.out.println(id);
}
           

List類型

在SpringMVC中,我們可以通過List傳送資料,在Jsp頁面封裝後通過請求傳送至Controller,例如将需要送出的多條資料封裝為一個List。

首先我們需要将List封裝在pojo的List封裝在對象中,如下所示:

Public class QueryVo {
Private List<Data> dataList;//資料清單

  /*get/set方法*/
}
           

頁面編寫如下所示:

<c:forEach items="${dataList }" var="data" varStatus="s">
<tr>
	<td><input type="text" name="dataList[${s.index }].name" value="${data.tempo }"/></td>
	<td><input type="text" name="dataList[${s.index }].price" value="${data.hum }"/></td>
</tr>
</c:forEach>
           

如上所示,頁面通過List将多條資料送出。

在Controller中,通過包裝類即可擷取到List:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
    System.out.println(queryVo.getDataList());
}
           

Map類型

在包裝類中定義Map對象,并添加get/set方法,action(Controller)使用包裝對象接收。

包裝類中定義Map對象如下:

Public class QueryVo {
private Map<String, Object> dataInfo = new HashMap<String, Object>();
  /*get/set方法..*/
}
           

頁面則編寫如下:

<tr>
<td>資料資訊:</td>
<td>
Temp:<inputtype="text"name="dataInfo['temp']"/>
Hum:<inputtype="text"name="dataInfo['hum']"/>
</td>
</tr>
           

如上代碼所示,dataInfo即為定義的Map,而temp、hum則為map的key,進而對資料進行送出。

繼續閱讀