SpringMVC學習(二)高級參數綁定,攔截器,controller方法返回值

一、高級參數綁定

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>


六、代碼

下載地址:http://download.csdn.net/detail/tianyejun6/9799611

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章