1. 程式人生 > >SpringMVC參數接收

SpringMVC參數接收

ron 找到 version 需求 convert 是否 current 對象 https

1 綁定簡單類型

要根據id查詢商品數據,需要從請求的參數中把請求的id取出來。Id應該包含在Request對象中。可以從Request對象中取id。

public ModelAndView itemEdit(HttpServletRequest request) { 

  //從Request中取id String strId = request.getParameter("id");

}

如果想獲得Request對象只需要在Controller方法的形參中添加一個參數即可。Springmvc框架會自動把Request對象傳遞給方法。

處理器形參中添加如下類型的參數處理適配器會默認識別並進行賦值 綁定簡單數據類型

當請求的參數名稱和處理器形參名稱一致時會將請求參數與形參進行綁定。從Request取參數的方法可以進一步簡化。

 @RequestMapping("/itemEdit") 
public String itemEdit(Integer id, Model model) {
     Items items = itemService.getItemById(id); //向jsp傳遞數據    
     model.addAttribute("item", items); //設置跳轉的jsp頁面
     return "editItem"; 
}

mvc底層調用request 賦值

參數類型推薦使用包裝數據類型,因為基礎數據類型不可以為null 整形:Integer、int 字符串:String 單精度:Float、float 雙精度:Double、double 布爾型:Boolean、boolean 說明:對於布爾類型的參數,請求的參數值為true或false。

方法形參中的名字跟頁面傳遞過來的名字保持一致

2 使用pojo接收表單數據

如果提交的參數很多,或者提交的表單中的內容很多的時候可以使用pojo接收數據。要求pojo對象中的屬性名和表單中input的name屬性一致。 頁面定義如下;

<input type="text" name="name"/> 
<input type="text" name="price"/>
@RequestMapping("/queryitem") 
public String queryItem(Pojo pojo) {     
     System.out.println(pojo.getName()); 
    System.out.println(pojo.getPrice());
    
return null; }

請求的參數名稱和pojo的屬性名稱一致,會自動將請求參數賦值給pojo的屬性

提交的表單中不要有日期類型的數據,否則會報400錯誤。如果想提交日期類型的數據需要用到後面的自定義參數綁定的內容。

3 綁定包裝pojo

頁面定義:

<input type="text" name="items.name" /> 
<input type="text" name="items.price" />


@RequestMapping("/queryitem") 
public String queryItem(QueryVo queryVo) {     
     System.out.println(queryVo.getItems().getName()); 
    System.out.println(queryVo.getItems().getPrice());
    return null;
 }

4 高級參數綁

綁定數組

Jsp中實現

<c:forEach items="${itemList }" var="item"> 
    <tr> 
        <td>
            <input name="ids" value="${item.id}" type="checkbox"> 
       </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 }/itemEdit.action?id=${item.id}">修改</a>
        </td> 
    </tr>
</c:forEach>                                    

Controller中的接收 Controller方法中可以用String[]接收,或者pojo的String[]屬性接收。兩種方式任選其一即可

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
    System.out.println(queryVo.getItems().getName());
    System.out.println(queryVo.getItems().getPrice());
    System.out.println(ids.toString());
    return null;
}

public calss QueryVo{
    private String[] ids;
    
    public String[] getIds(){
        return ids;
    }
    
    public void setIds(String[] ids) {
        this.ids=ids;
    }
}

將表單的數據綁定到List

需求分析

要想實現商品數據的批量修改,需要在商品列表中可以對商品信息進行修改,並且可以批量提交修改後的商品數據。

接收商品列表的pojo

List中存放對象,並將定義的List放在包裝類中,使用包裝pojo對象接收 public class QueryVo {

private Items items;

private List<Items> itemsList;

public List<Items> getItemsList() {
    return itemsList;
}

public void setItemsList(List<Items> itemsList) {
    this.itemsList = itemsList;
}

public Items getItems() {
    return items;
}

public void setItems(Items items) {
    this.items = items;
}
}

jsp頁面的編寫

    <c:forEach items="${itemList }" var="item" varStatus="i">
         <tr> 
             <td><input type="checkbox" value="${item.id}" name="ids" /></td> 
             <td><input type="text" value="${item.name }" name="itemsList[${i.index}].name" /></td> 
             <td><input type="text" value="${item.price }" name="itemsList[${i.index}].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 }/itemEdit.action?id=${item.id}">修改</a>
            </td>
        </tr>
    </c:forEach>

varStatus屬性常用參數總結下: ${status.index} 輸出行號,從0開始。 ${status.count} 輸出行號,從1開始。 ${status.current} 當前這次叠代的(集合中的)項 ${status.first} 判斷當前項是否為集合中的第一項,返回值為true或false ${status.last} 判斷當前項是否為集合中的最後一項,返回值為true或false begin、end、step分別表示:起始序號,結束序號,跳躍步伐。

Contrller層的編寫
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
    System.out.println(queryVo.getItems().getName());
    System.out.println(queryVo.getItems().getPrice());
    System.out.println(ids.toString());
    return null;
}

註意:接收List類型的數據必須是pojo的屬性,方法的形參為List類型無法正確接收到數據。

5 自定義參數綁定

由於日期數據有很多種格式,所以springmvc沒辦法把字符串轉換成日期類型。所以需要自定義參數綁定。前端控制器接收到請求後,找到註解形式的處理器適配器,對RequestMapping標記的方法進行適配,並對方法中的形參進行參數綁定。在springmvc這可以在處理器適配器上自定義Converter進行參數綁定。如果使用<mvc:annotation-driven/>可

自定義Converter
public class DateConverter implements Converter<String, Date> {

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

配置Converter

在springmvc.xml中告mvc配置了轉換器 <!-- 轉換器配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.springmvc.convert.DateConverter"/> </set> </property> </bean>

然後再在springmvc.xml中配置

<!-- 加載註解驅動 -->
<mvc:annotation-driven conversion-service="conversionService"/>

SpringMVC參數接收