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,進而對數據進行提交。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章