SpringMVC學習(六)——SpringMVC高級參數綁定與@RequestMapping注解


高級參數綁定

綁定數組

現有這樣一個需求:在商品列表頁面選中多個商品,然后刪除之。下面是我對該需求的分析:此功能要求商品列表頁面中的每個商品前有一個checkbook(復選框),選中多個商品后點擊刪除按鈕把商品id傳遞給Controller,根據商品id批量刪除商品信息。
首先將itemList.jsp頁面改造為:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body> 
<form action="${pageContext.request.contextPath }/queryitem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td>商品id:<input type="text" name="items.id" /></td>
<td>商品名稱:<input type="text" name="items.name" /></td>
<td><input type="submit" value="查詢"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
    <td>選擇</td>
    <td>商品名稱</td>
    <td>商品價格</td>
    <td>生產日期</td>
    <td>商品描述</td>
    <td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
    <td><input type="checkbox" name="ids" 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 }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>

</table>
</form>
</body>

</html>

生成html代碼如下:

頁面選中多個checkbox向Controller類的方法中傳遞。
接着要修改ItemController類的queryItem方法,接收itemList.jsp頁面傳遞過來的多個商品id。Controller類方法中可以用String[]接收,或者pojo的String[]屬性接收。兩種方式任選其一即可。

方式一:使用String[]接收。
如果使用String[]接收,那么ItemController類的queryItem方法應改造為:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
    // 打印綁定結果
    System.out.println(queryVo.getItems().getId());
    System.out.println(queryVo.getItems().getName());
    return "success";
}

方式二:使用pojo的String[]屬性接收。
首先在QueryVo類中添加如下屬性:

private String[] ids;

並添加其相對應的get/set方法。如此一來,QueryVo類就改造為:

public class QueryVo {
    private Items items;
    private String[] ids;

    public String[] getIds() {
        return ids;
    }

    public void setIds(String[] ids) {
        this.ids = ids;
    }

    public Items getItems() {
        return items;
    }

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

ItemController類的queryItem方法不變,假設依然為:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
    // 打印綁定結果
    System.out.println(queryVo.getItems().getId());
    System.out.println(queryVo.getItems().getName());
    return "success";
}

將表單的數據綁定到List

現有這樣一個需求:實現商品數據信息的批量修改。下面是我對該需求的分析:要想實現商品數據信息的批量修改,需要在商品列表中可以對商品信息進行修改,並且可以批量提交修改后的商品數據。
首先將QueryVo類改造為:

public class QueryVo {
    private Items items;
    private String[] ids;
    private List<Items> itemList;

    public List<Items> getItemList() {
        return itemList;
    }

    public void setItemList(List<Items> itemList) {
        this.itemList = itemList;
    }

    public String[] getIds() {
        return ids;
    }

    public void setIds(String[] ids) {
        this.ids = ids;
    }

    public Items getItems() {
        return items;
    }

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

List中存放對象,並將定義的List放在包裝類中,使用包裝pojo對象接收。
然后將itemList.jsp頁面改造為:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查詢商品列表</title>
</head>
<body> 
<form action="${pageContext.request.contextPath }/queryitem.action" method="post">
查詢條件:
<table width="100%" border=1>
<tr>
<td>商品id:<input type="text" name="items.id" /></td>
<td>商品名稱:<input type="text" name="items.name" /></td>
<td><input type="submit" value="查詢"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
    <td>選擇</td>
    <td>商品名稱</td>
    <td>商品價格</td>
    <td>生產日期</td>
    <td>商品描述</td>
    <td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
    <td><input type="checkbox" name="ids" value="${item.id }" /></td>
    <td>
        <input type="hidden" name="itemList[${s.index}].id" value="${item.id }" />
        <input type="text" name="itemList[${s.index}].name" value="${item.name }" />
    </td>
    <td><input type="text" name="itemList[${s.index}].price" value="${item.price }" /></td>
    <td><input type="text" name="itemList[${s.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td>
    <td><input type="text" name="itemList[${s.index}].detail" value="${item.detail }" /></td>

    <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>

</table>
</form>
</body>

</html>

注意:以上input輸入項的name屬性必須是包裝pojo的list屬性+下標+元素屬性。
大家可能忘了<c:forEach>標簽中的varStatus屬性了,在此我對它做一個總結,希望能喚醒讀者的記憶。
varStatus屬性常用參數總結如下:

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

最后並不需要修改ItemController類的queryItem方法,假設依然為:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
    // 打印綁定結果
    System.out.println(queryVo.getItems().getId());
    System.out.println(queryVo.getItems().getName());
    return "success";
}

@RequestMapping注解的使用

之前,我們就已經使用過@RequestMapping注解了,但還有一些細節我還沒講到,所以在此將詳細講講@RequestMapping注解的使用。

@RequestMapping

通過@RequestMapping注解可以定義不同的處理器映射規則。

URL路徑映射

之前我們也經常編寫URL路徑映射,大致可以寫為

@RequestMapping("/item")

或者

@RequestMapping(value="/item")

value的值是數組,所以可以將多個url映射到同一個方法上。

窄化請求映射

在class上添加@RequestMapping(url)指定通用請求前綴, 限制此類下的所有方法請求url必須以請求前綴開頭,通過此方法對url進行分類管理。如下:@RequestMapping放在類名上邊,設置請求前綴。

@Controller
@RequestMapping("/item")
public class ItemController {

    ...

}

然后在方法名上邊設置請求映射url,即@RequestMapping注解應放在方法名上邊,如下:

@RequestMapping("/itemList")
public ModelAndView getItemsList() {
    // 查詢商品列表
    List<Items> itemList = itemService.getItemList();
    // 把查詢結果傳遞給頁面
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("itemList", itemList); // addObject方法相當於放到request域上
    // 設置邏輯視圖
    modelAndView.setViewName("itemList"); 
    // 返回結果
    return modelAndView;
}

最后在瀏覽器中輸入地址進行訪問時,訪問地址應為:http://localhost:8080/springmvc-web2/item/itemList.action

請求方法限定

限定GET方法:@RequestMapping(method = RequestMethod.GET)。
如果通過post方式訪問則報錯:
這里寫圖片描述

限定POST方法:@RequestMapping(method = RequestMethod.POST)。
如果通過get方式訪問則報錯:

這里寫圖片描述

GET和POST都可以:@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

ps:注意,這兒可能有中文亂碼問題,大家須謹慎對待。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM