一、高級參數綁定
1,數組類型的參數綁定
需求分析:
要求商品列表頁面中的每個商品前有一個checkbook,選中多個商品後點擊刪除按鈕把商品id傳遞給Controller,根據商品id刪除商品信息。
jsp中實現
<c:forEach items="${itemList}" var="item">
<tr>
<td>${item.name}</td>
<td>${item.price}</td>
<td><fmt:formateDate 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(String[] ids) {
System.out.println(ids.toString());
return null;
}
方法二、
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
}
public class QueryVo{
private String[]ids;
}
2,參數綁定到List
需求,實現商品數據的批量修改,需要在商品列表中可以對商品信息進行修改。
jsp頁面
<c:forEach items="${itemList }" var="item" varStatus="status">
<tr>
<!--
name的屬性名稱要與接收參數的pojo類的屬性名稱要一致
-->
<!--
如果批量刪除,可以用List<pojo>來接收,
頁面上input框的name屬性值=vo中接收的集合屬性名稱+List泛型類的屬性名稱
-->
<td><input type="checkbox" name="ids" value="${item.id }">
<input type="hidden" name="listItem[${status.index}].id" value="${item.id }">
</td>
<td>
<input type="text" name="listItem[${status.index}].name" value="${item.name}">
</td>
<td><input type="text" name="listItem[${status.index}].price" value="${item.price }">
</td>
<td><input type="text" name="listItem[${status.index}].createtime"
value="<fmt:formatDate value="${item.createtime}"
pattern="yyyy-MM-dd HH:mm:ss" />">
</td>
<td><input type="text" name="listItem[${status.index}].detail" value="${item.detail }">
</td>
<td>
<a href="${pageContext.request.contextPath }/items/itemEdit/${item.id}">修改</a>
</td>
</tr>
</c:forEach>
Controller 代碼
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
}
public class QueryVo{
// 批量修改使用
private List<Items> listItem;
}
注意:屬性name必須是包裝pojo的list屬性+下標+元素屬性
二、請求方法限定
1,限定GET方法
@RequestMapping(method = RequestMethod.GET)
2,限定Post方法
@RequestMapping(method = RequestMethod.POST)
3,GET和POST方法都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
三、controller方法返回值
1,返回值ModleAndView
@RequestMapping(value="/itemLists",method=RequestMethod.GET)
public ModelAndView getItemList() throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList", listItems);
modelAndView.setViewName("itemList");
return modelAndView;
}
2,返回void
在方法形參上定義request,response,使用request或response
指定響應結果
(1)使用request轉向頁面
//指定返回頁面(如果controller返回值爲void,
//則不走springMvc組件,所以要寫頁面的完整路徑)
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").
forward(request, response);
(2)使用response重定向頁面(傳遞不了數據)
response.sendRedirect("url")
3,返回字符串
(1)方法返回字符串可以指定視圖名
// 如果springMvc方法返回一個簡單的string字符串,
//那麼springMvc就會認爲這個字符串就是頁面的名稱
//即:/WEB-INF/jsp/item/editItem.jsp
return "/item/editItem";
(2)Redirect重定向
//注意:"redirect:/items/itemEdit/"+items.getId();
//通過url重定向過去,url參數數據可以保持,通過域重定向url數據不保存
return "redirect:/items/itemEdit/"+items.getId();
(3)forward轉發
//結果轉發到editItem.action,request可以帶過去
return "forward:editItem.action";
四、請求json,響應json實現
Springmvc默認用MappingJacksonHttpMessageConverter
對json數據進行轉換,需要加入jackson的包
配置Json轉換器
<mvc:annotation-driven />
五、攔截器(比如用於:用戶登錄)
SpirngMVC 的處理器類似Servlet過濾器用於對處理器
進行預處理和後處理
1,實現HandlerInterceptor接口
public class HandlerIntecepter2 implements HandlerInterceptor{
/**
* 返回boolean 如果返回true放行,返回false則被攔截
* 執行時機,controller方法已經執行,ModleAndView已經返回
* 使用場景,記錄操作日誌,記錄用戶登錄的時間,日期等。
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
}
/**
* 返回boolean 如果返回true放行,返回false則被攔截
* 執行時機,controller方法已經執行,ModleAndView沒有被返回
* 使用場景,可以在此方法中可以設置全局的的數據處理業務
*/
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
}
/**
* 返回boolean 如果返回true放行,返回false則被攔截
* 執行時機,controller方法沒有被執行,ModleAndView沒有被返回
* 使用場景,權限驗證
*/
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
return false;
}
}
2,攔截器配置:
(1)針對某一種攔截器進行配置
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1"/>
<ref bean="handlerInterceptor2"/>
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="com.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="com.intercapter.HandlerInterceptor2"/>
(2), 針對所有mapping配置全局攔截器
<!--配置攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器的執行順序,等於配置文件中配置的順序 -->
<mvc:interceptor>
<!-- 攔截請求路徑,要攔截所有路徑 配置成/**代表所有 -->
<mvc:mapping path="/**" />
<!-- 指定攔截器位置 -->
<bean class="cn.itheima.intecepter.HandlerIntecepter"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- 攔截請求路徑,要攔截所有路徑 配置成/**代表所有 -->
<mvc:mapping path="/**" />
<!-- 指定攔截器位置 -->
<bean class="cn.itheima.intecepter.HandlerIntecepter2"></bean>
</mvc:interceptor>
</mvc:interceptors>
六、代碼