springmvc(三) 參數綁定、

      前面兩章就介紹了什麼是springmvc,springmvc的框架原理,而且會簡單的使用springmvc以及ssm的整合,從這一章節來看,就開始講解springmvc的各類功能實現,慢慢消化java

                          --WZYweb

1、參數綁定spring

      1.一、什麼是參數綁定?數組

        客戶在瀏覽器端會提交一些參數到服務器端,好比用戶的登陸等,就會傳username 和 password過來,springmvc則經過參數綁定組件將請求參數的內容進行數據轉換,而後將轉換後的值覆給controller方法的形參,這就是參數綁定的過程,其實,springmvc就是使用controller方法形參來接收請求的參數瀏覽器

      1.二、springmvc默認支持的參數類型服務器

        能夠在Controller方法的形參中直接使用如下類型mvc

          HttpServletRequest、HttpServletResponse、HttpSession:這三個很熟悉,不作解釋app

          Model/ModelMap:將model數據填充到request域,好比以前的ModelAndView對象添加list,其實就是將list添加到request做用域,只是ModelAndView對象不只可以添加model數據,還可以添加視圖。而Model對象的功能就只有將model數據填充到request做用域框架

          

        如圖所示,就是這樣,在形參中使用這幾個對象,那麼在方法中就能直接用這幾個對象了。有了request對象,就可以使用咱們之前學過的老方法獲取請求參數等一些信息了。jsp

      1.三、綁定簡單類型的參數

        上面講解的只是默認支持的參數類型,有request等一些對象,必然是很好很方便的一件事,好比獲取請求參數就能夠獲得解決了,可是springmvc提供更強大一些的功能。

        綁定簡單類型的參數規則

          1.3.1、若是請求參數的key和Controller類中方法的形參名稱一致,那麼就直接綁定;

            請求url:http://localhost:8080/ssm_test/editItems.do?id=2   模擬客戶端發送了一個id=2的請求參數過來,這裏使用的是get方式,若是post方式也是同樣的道理

            Controller方法:

                

            分析:形參中的名稱與請求參數的名稱相同,固能夠直接綁定。

          1.3.2、若是請求參數的key和Controller類中方法的形參名稱不一致,那麼就須要使用@RequestParam註解來進行參數綁定

            請求url:http://localhost:8080/ssm_test/editItems.do?itemsId=2   模擬客戶端發送了一個id=2的請求參數過來

            Controller方法:

                

            分析:使用@RequestParam("itemsId")註解將名爲itemsId的請求參數的值賦值給形參中名爲id的參數。注意,在對應的形參前面加該註解。

 

      1.四、綁定pojo

        使用springmvc綁定pojo的參數時,要求jsp中input框的name值要和Controller方法形參的pojo對象中的屬性名稱一致,以下圖

          jsp頁面

              

          controller方法

                

          Items類

              

      1.五、參數綁定時日期類型轉換問題

        在咱們從jsp頁面傳過來的參數的類型都是object的,而咱們本身編寫的是有具體類型的,好比id是須要int型,name是須要string型,而springmvc就會幫咱們將這些簡單的類型自動進行類型轉換,可是當遇到Date類型的時候,就轉換不了,須要咱們本身寫一個類型轉換器,而後給適配器配上,從而jsp傳過來的參數可以轉換成咱們須要的日期類型,若是不自定義類型轉換器的話,會報錯             即把請求中的日期字符串轉成java的日期類型,該日期類型與pojo中日期屬性的類型保持一致            

        1.5.一、自定義Converter

              

package com.wuhao.ssm.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.core.convert.converter.Converter;


public class DateConverter implements Converter<String,Date> {

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


}
DateConverter.java

  

        1.5.二、在springmvc.xml中配置該轉換器

          第一種方式(推薦):兩步搞定

            修改mvc:annotation-driven的配置

            配置自定義轉換器綁定

              

    <!-- 配置處理器映射器和處理器適配器 -->
<mvc:annotation-driven conversion-service="conversionService" />

<!-- 自定義參數綁定 -->
<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <!-- 日期類型轉換器 -->
                <bean class="com.wuhao.ssm.util.DateConverter" />
            </list>
        </property>
    </bean>
springmvc.xml中配置日期轉換器

 

          第二種方式:

              

    <!--註解適配器,也就是不使用spring標籤對註解進行管理 -->
<bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer" ref="customBinder" />
</bean>

<!-- 自定義webBinder -->
<bean id="customBinder"
    class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
    <property name="conversionService" ref="conversionService" />
</bean>
<!-- conversionService -->
<bean id="conversionService"
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <!-- 轉換器 -->
    <property name="converters">
        <list>
            <bean class="com.wuhao.ssm.util.DateConverter" />
        </list>
    </property>
</bean>
View Code

 

      1.六、包裝pojo參數綁定

        與1.4的pojo參數綁定的區別在於,這裏將pojo放入一個包裝類中,以下圖,將Items類放入了ItemsQueryVO類中,ItemsQueryVO就是一個包裝pojo

          ItemsQueryVO

            

          jsp

                  

          controller:直接使用包裝pojo接收

            

            

      1.七、集合參數的綁定

        1.7.一、簡單類型的集合參數綁定,可使用數組或者List來接收

        好比jsp頁面有一些多選框,複選框,這樣提交過來,就須要使用集合參數的綁定了。

        jsp

          

        controller

          使用數組來接收

            形參中的數組類型要和jsp中值的類型一致,形參中的參數名稱要和jsp中name一致。也就是itemsid

              

          使用list來接收

            形參中list的泛型跟jsp中的值的類型一致,形參中參數名稱要和jsp中name一致。(咱們想象中是這樣)

                  

            結果,會報錯,嘿嘿,由於不能在形參中直接定義List類型的參數,若是想要使用list來接收,須要把List類型的參數定義在包裝POJO中,Controller的方法形參使用該包裝POJO,下面講解。因此若是使用接收簡單類型的集合參數,使用數組最爲方便。

 

        1.7.二、pojo類型的集合參數綁定,可使用數組或者list來接收

          注意:pojo類型的集合參數綁定時,接收它的數組或者List,都不能直接定義在Controller方法形參上,須要把它定義到一個包裝pojo中,如何把這個包裝pojo放到形參

          使用list。

          包裝pojo類 ItemsQueryVo, 將須要裝items集合的對象放入包裝類中。

              

          jsp

              

          這裏注意:標記的是name屬性,不要與value屬性搞混淆了,在ItemsQueryVo中有名爲itemsList的list,因此在jsp中的name就須要一層層匹配下去才能正確將其屬性值裝載到正確的位置,list的格式爲:itemsList[下標].name。 就拿這個分析,itemsList就能夠找打ItemsQueryVo中的itemsList, itemsList[1],就能夠定位到itemsList中的第一個items,itemsList[1].name就能夠定位到itemsList中的第一個items的name屬性,這樣一來就看得懂了。

          

          controller

                

 

        1.7.三、總結上面兩種

          總結一下集合參數的綁定

            對於簡單類型的集合參數綁定,則使用數組做爲形參來接收請求的集合參數

            對於pojo類型的集合參數綁定,則使用數組或者list二者均可以,通常經常使用list。

              注意:這種pojo類型的集合參數綁定,必須將list或者數組做爲一個包裝類中的屬性,而後使用該包裝類對象做爲形參來接收請求參數。       

 

        1.7.四、map集合類型綁定

          這個用的很少,通常只是用list,這個也稍微瞭解一下,等須要的時候會用便可,貼出關鍵代碼就行

          一樣,須要使用包裝pojo類。

          ItemsQueryVo

            

          jsp:格式爲下面這樣。就可以匹配到

            

          controller

            

    

2、總結

      看了這麼多中參數綁定的例子,我以爲用一句話來歸納最爲準確,萬變不離其宗。有耐心看一下就天然就會用了,真的很簡單。只是知識比較多比較細,須要理解的也很少。

相關文章
相關標籤/搜索