十、SpringMVC註解開發之參數綁定

簡單參數綁定

Spring參數綁定過程

SpringMVC中,從客戶端請求key/value數據,通過參數綁定,將key/value數據綁定到controller方法的形參上。而不是在controller類定義成員變量接收。java

默認支持的類型

直接在controller方法形參上定義下邊類型的對象,就能夠使用這些對象。spring

  • HttpServletRequest:經過request對象獲取請求信息
  • HttpServletResponse:經過response處理響應信息
  • HttpSession:經過session對象獲得session中存放的對象
  • Model/ModelMap:model是一個接口,modelMap是一個接口實現。做用:將model數據填充到request域。

簡單類型

經過@RequestParam對簡單類型的參數進行綁定,不用限制request傳入參數名稱和controller方法的形參名稱一致。若是不使用@RequestParam,要求request傳入參數名稱和controller方法的形參名稱一致,也可綁定成功。數組

經過required屬性指定參數是否必需要傳入,若是設置爲true,沒有傳入參數,報錯誤。session

經過defaultValue能夠設置默認值,若是id參數沒有傳入,將默認值和形參綁定。mvc

@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
public String editItems(Model model,@RequestParam(value="id",required=true,defaultValue =0) Integer items_id) {

pojo綁定

頁面中input的name和controller的pojo形參中的屬性名稱一致,將頁面中數據綁定到pojo。app

注意:這裏只是要求name和形參的屬性名一致,而不是要求和形參的名稱一致,這點不要混淆了,框架會進入形參內部自動匹配pojo類的屬性名。(應該是用反射實現的)框架

頁面定義:jsp

<table width="100%" border=1>
<tr>
	<td>商品名稱</td>
	<td><input type="text" name="name" value="${itemsCustom.name}"/></td>
</tr>
<tr>
	<td>商品價格</td>
	<td><input type="text" name="price" value="${itemsCustom.price}"/></td>
</tr>

controller的pojo形參的定義:ui

public class Items {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

    private String detail;
}

自定義參數綁定實現日期類型綁定

對於controller形參中pojo對象,若是屬性中有日期類型,須要自定義參數綁定。code

將請求日期數據串轉成日期類型,要轉換的日期類型和pojo中日期屬性的類型保持一致。本文示例中,自定義參數綁定將日期串轉成java.util.Date類型。須要向處理器適配器中注入自定義的參數綁定組件。

  • 自定義日期類型綁定
public class CustomDateConverter implements Converter<String,Date>{
    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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //若是參數綁定失敗返回null
        return null;
    }
}
  • 配置方式
<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.iot.learnssm.firstssm.controller.converter.CustomDateConverter"/>
        </list>
    </property>
</bean>

包裝類型參數綁定

實現方法

  • 第一種方法:在形參中添加HttpServletRequest request參數,經過request接收查詢條件參數。
  • 第二種方法:在形參中讓包裝類型的pojo接收查詢條件參數。

分析:

頁面傳參數的特色:複雜,多樣性。條件包括:用戶帳號、商品編號、訂單信息。。。

若是將用戶帳號、商品編號、訂單信息等放在簡單pojo(屬性是簡單類型)中,pojo類屬性比較多,比較亂。建議使用包裝類型的pojo,pojo中屬性是pojo。

頁面參數和controller方法形參定義

  • 頁面參數:

商品名稱:<input name="itemsCustom.name" />

注意:itemsCustom和包裝pojo中的屬性名一致便可。

  • controller方法形參:
public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo)
  • 包裝類ItemsQueryVo中部分屬性:
public class ItemsQueryVo {

    //商品信息
    private Items items;

    //爲了系統 可擴展性,對原始生成的po進行擴展
    private ItemsCustom itemsCustom;
}

可見,ItemsQueryVo中屬性itemsCustom和頁面參數中一致

集合類型參數綁定

數組綁定

將頁面選擇(多選)的商品id,傳到controller方法的形參,方法形參使用數組接收頁面請求的多個商品id。

  • controller方法定義:
// 批量刪除 商品信息
@RequestMapping("/deleteItems")
public String deleteItems(Integer[] items_id)
  • 頁面定義:
<c:forEach items="${itemsList}" var="item">
<tr>
    <td><input type="checkbox" name="items_id" value="${item.id}"/></td>
	<td>${item.name}</td>
	<td>${item.price}</td>
	<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
	<td>${item.detail}</td>	
	<td><a href="${pageContext.request.contextPath}/items/editItems.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>

List綁定

使用List接收頁面提交的批量數據,經過包裝pojo接收,在包裝pojo中定義list<pojo>屬性

public class ItemsQueryVo {

    //商品信息
    private Items items;

    //爲了系統 可擴展性,對原始生成的po進行擴展
    private ItemsCustom itemsCustom;

    //批量商品信息
    private List<ItemsCustom> itemsList;
}
// 批量修改商品提交
// 經過ItemsQueryVo接收批量提交的商品信息,將商品信息存儲到itemsQueryVo中itemsList屬性中。
@RequestMapping("/editItemsAllSubmit")
public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception {
    return "success";
}
  • 頁面定義:
<c:forEach items="${itemsList}" var="item" varStatus="status">
    <tr>
        <td><input name="itemsList[${status.index}].name" value="${item.name}"/></td>
        <td><input name="itemsList[${status.index}].price" value="${item.price}"/></td>
        <td><input name="itemsList[${status.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
        <td><input name="itemsList[${status.index}].detail" value="${item.detail}"/></td>
    </tr>
</c:forEach>

name的格式:

對應包裝pojo中的list類型屬性名[下標(從0開始)].包裝pojo中List類型的屬性中pojo的屬性名

例子:"name="itemsList[${status.index }].price"

能夠和包裝類型的參數綁定概括對比一下,其實就是在包裝類的pojo基礎上多了個下標。只不過包裝類參數綁定時,要和包裝pojo中的pojo類性的屬性名一致,而list參數綁定時,要和包裝pojo中的list類型的屬性名一致。

Map綁定

經過在包裝pojo中定義map類型屬性,action使用包裝對象接收。

  • 包裝類中定義Map對象以下:
Public class QueryVo {
	private Map<String, Object> itemInfo = new HashMap<String, Object>();
}
  • 頁面定義以下:
<tr>
    <td>學生信息:</td>
    <td>
    姓名:<inputtype="text"name="itemInfo['name']"/>
    年齡:<inputtype="text"name="itemInfo['price']"/>
    .. .. ..
    </td>
</tr>
  • Contrller方法定義以下:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
	System.out.println(queryVo.getStudentinfo());
}
相關文章
相關標籤/搜索