在之前我們通過實例簡單講解過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,進而對數據進行提交。