SpringMVC【參數(shù)綁定、數(shù)據(jù)回顯诱贿、文件上傳】

前言

本文主要講解的知識(shí)點(diǎn)如下:

  • 參數(shù)綁定
  • 數(shù)據(jù)回顯
  • 文件上傳

參數(shù)綁定

我們?cè)贑ontroller使用方法參數(shù)接收值胖腾,就是把web端的值給接收到Controller中處理,這個(gè)過(guò)程就叫做參數(shù)綁定...

默認(rèn)支持的參數(shù)類型

從上面的用法我們可以發(fā)現(xiàn),我們可以使用request對(duì)象瘪松、Model對(duì)象等等咸作,其實(shí)是不是可以隨便把參數(shù)寫上去都行?宵睦?记罚?其實(shí)并不是的...

Controller方法默認(rèn)支持的參數(shù)類型有4個(gè),這4個(gè)足以支撐我們的日常開發(fā)了

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model

參數(shù)的綁定過(guò)程

一般地壳嚎,我們要用到自定義的參數(shù)綁定就是上面所講的日期類型轉(zhuǎn)換以及一些特殊的需求....對(duì)于平常的參數(shù)綁定桐智,我們是無(wú)需使用轉(zhuǎn)換器的,SpringMVC就已經(jīng)幫我們干了這個(gè)活了...

這里寫圖片描述

自定義綁定參數(shù)【老方式烟馅、全部Action均可使用】

在上一篇我們已經(jīng)簡(jiǎn)單介紹了怎么把字符串轉(zhuǎn)換成日期類型了【使用的是WebDataBinder方式】...其實(shí)那是一個(gè)比較老的方法说庭,我們可以使用SpringMVC更推薦的方式...

在上次把字符串轉(zhuǎn)換成日期類型,如果使用的是WebDataBinder方式的話郑趁,那么該轉(zhuǎn)換僅僅只能在當(dāng)前Controller使用...如果想要全部的Controller都能夠使用刊驴,那么我們可以使用WebBindingInitializer方式

如果想多個(gè)controller需要共同注冊(cè)相同的屬性編輯器,可以實(shí)現(xiàn)PropertyEditorRegistrar接口寡润,并注入webBindingInitializer中捆憎。

實(shí)現(xiàn)接口


public class CustomPropertyEditor implements PropertyEditorRegistrar {

    @Override
    public void registerCustomEditors(PropertyEditorRegistry binder) {
        binder.registerCustomEditor(Date.class, new CustomDateEditor(
                new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"), true));

    }

}

配置轉(zhuǎn)換器

注入到webBindingInitializer中

    <!-- 注冊(cè)屬性編輯器 -->
    <bean id="customPropertyEditor" class="cn.itcast.ssm.controller.propertyeditor.CustomPropertyEditor"></bean>

    <!-- 自定義webBinder -->
    <bean id="customBinder"
        class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">

        <!-- propertyEditorRegistrars用于屬性編輯器 -->
         <property name="propertyEditorRegistrars">
            <list>
                <ref bean="customPropertyEditor" />
            </list>
        </property>
    </bean>

    <!-- 注解適配器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <!-- 在webBindingInitializer中注入自定義屬性編輯器、自定義轉(zhuǎn)換器 -->
        <property name="webBindingInitializer" ref="customBinder"></property>
    </bean>

自定義參數(shù)轉(zhuǎn)換器【新方式梭纹、推崇方式】

上面的方式是對(duì)象較老的躲惰,現(xiàn)在我們一般都是實(shí)現(xiàn)Converter接口來(lái)實(shí)現(xiàn)自定義參數(shù)轉(zhuǎn)換...我們就來(lái)看看實(shí)現(xiàn)Converter比上面有什么好

配置日期轉(zhuǎn)換器


public class CustomDateConverter implements Converter<String, Date> {

    @Override
    public Date convert(String source) {
        try {
            //進(jìn)行日期轉(zhuǎn)換
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

配置去除字符串轉(zhuǎn)換器


public class StringTrimConverter implements Converter<String, String> {

    @Override
    public String convert(String source) {
        try {
            //去掉字符串兩邊空格,如果去除后為空設(shè)置為null
            if(source!=null){
                source = source.trim();
                if(source.equals("")){
                    return null;
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return source;
    }
}

從上面可以得出变抽,我們想要轉(zhuǎn)換什么內(nèi)容础拨,就直接實(shí)現(xiàn)接口氮块,該接口又是支持泛型的,閱讀起來(lái)就非常方便了...

配置轉(zhuǎn)換器


    <!-- 轉(zhuǎn)換器 -->
    <bean id="conversionService"
          class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
                <bean class="cn.itcast.ssm.controller.converter.StringTrimConverter"/>
            </list>
        </property>
    </bean>

    <!-- 自定義webBinder -->
    <bean id="customBinder"
        class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
        <!-- 使用converter進(jìn)行參數(shù)轉(zhuǎn) -->
        <property name="conversionService" ref="conversionService" />
    </bean>

    <!-- 注解適配器 -->
    <bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <!-- 在webBindingInitializer中注入自定義屬性編輯器诡宗、自定義轉(zhuǎn)換器 -->
        <property name="webBindingInitializer" ref="customBinder"></property>
    </bean>

如果是基于<mvc:annotation-driven>的話雇锡,我們是這樣配置的


<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- 轉(zhuǎn)換器 -->
        <property name="converters">
            <list>
                <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
                <bean class="cn.itcast.ssm.controller.converter.StringTrimConverter"/>
            </list>
        </property>
    </bean>

@RequestParam注解

我們一般使用的參數(shù)綁定都有遵循的規(guī)則:方法參數(shù)名要與傳遞過(guò)來(lái)的name屬性名相同。

在默認(rèn)的情況下僚焦,只有名字相同,SpringMVC才會(huì)幫我們進(jìn)行參數(shù)綁定...

如果我們使用@RequestParam注解的話曙痘,我們就可以使方法參數(shù)名與傳遞過(guò)來(lái)的name屬性名不同...

該注解有三個(gè)變量

  • value【指定name屬性的名稱是什么】
  • required【是否必須要有該參數(shù)】
  • defaultvalue設(shè)置默認(rèn)值

例子:我們的方法參數(shù)叫id芳悲,而頁(yè)面帶過(guò)來(lái)的name屬性名字叫item_id,一定需要該參數(shù)


public String editItem(@RequestParam(value="item_id",required=true) String id) {

}

Controller方法返回值

Controller方法的返回值其實(shí)就幾種類型边坤,我們來(lái)總結(jié)一下....

  • void
  • String
  • ModelAndView
  • redirect重定向
  • forward轉(zhuǎn)發(fā)

數(shù)據(jù)回顯

其實(shí)數(shù)據(jù)回顯我們現(xiàn)在的話就一點(diǎn)也不陌生了....我們剛使用EL表達(dá)式的時(shí)候就已經(jīng)學(xué)會(huì)了數(shù)據(jù)回顯了名扛,做SSH項(xiàng)目的時(shí)候也有三圈問(wèn)題的數(shù)據(jù)回顯...

在頁(yè)面上數(shù)據(jù)回顯本質(zhì)上就是獲取reqeust域的值..

而在我們SpringMVC中,我們是使用Model來(lái)把數(shù)據(jù)綁定request域?qū)ο笾械?/strong>

一般地我們都是使用model.addAttribute()的方式把數(shù)據(jù)綁定到request域?qū)ο笾?..其實(shí)SpringMVC還支持注解的方式

@ModelAttribute注解

我們可以將請(qǐng)求的參數(shù)放到Model中茧痒,回顯到頁(yè)面上

這里寫圖片描述

上面這種用法和model.addAttribute()的方式是沒啥區(qū)別的肮韧,也體現(xiàn)不了注解的方便性...

而如果我們要回顯的數(shù)據(jù)是公共的話,那么我們就能夠體會(huì)到注解的方便性了旺订,我們把公共需要顯示的屬性抽取成方法弄企,將返回值返回就行了。

這里寫圖片描述

那我們就不用在每一個(gè)controller方法通過(guò)Model將數(shù)據(jù)傳到頁(yè)面区拳。


SpringMVC文件上傳

我們使用Struts2的時(shí)候拘领,覺得Struts2的文件上傳方式比傳統(tǒng)的文件上傳方式好用多了...

http://blog.csdn.net/hon_3y/article/details/71091593

既然我們正在學(xué)習(xí)SpringMVC,那么我們也看一下SpringMVC究竟是怎么上傳文件的...

配置虛擬目錄

在這次樱调,我們并不是把圖片上傳到我們的工程目錄中...

那為啥不將圖片直接上傳到我們的工程目錄中呢约素??笆凌?我們仔細(xì)想想圣猎,按照我們之前的做法,直接把文件上傳到工程目錄乞而,而我們的工程目錄是我們寫代碼的地方 ...往往我們需要備份我們的工程目錄送悔。

如果把圖片都上傳到工程目錄中,那么就非常難以處理圖片了...

因此爪模,我們需要配置Tomcat的虛擬目錄來(lái)解決放祟,把上傳的文件放在虛擬目錄上...

又值得注意的是,Idea使用的Tomcat并不能使用傳統(tǒng)的配置方式呻右,也就是修改server.xml方式來(lái)配置虛擬目錄跪妥,在Idea下好像不支持這種做法...

有興趣的同學(xué)可以去測(cè)試一下:

http://blog.csdn.net/hon_3y/article/details/54412484

那么我在網(wǎng)上已經(jīng)找到了對(duì)應(yīng)的解決辦法,就是如果在idea上配置虛擬目錄

http://blog.csdn.net/LABLENET/article/details/51160828

檢測(cè)是否配置成功:

這里寫圖片描述

快速入門

在SpringMVC中文件上傳需要用到的jar包

  • commons-fileupload-1.2.2.jar
  • commons-io-2.4.jar

配置文件上傳解析器


    <!-- 文件上傳 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 設(shè)置上傳文件的最大尺寸為5MB -->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

測(cè)試的JSP


<%--
  Created by IntelliJ IDEA.
  User: ozc
  Date: 2017/8/11
  Time: 9:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>測(cè)試文件上傳</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/upload.action" method="post" enctype="multipart/form-data" >
    <input type="file" name="picture">
    <input type="submit" value="submit">
</form>

</body>
</html>

值得注意的是声滥,在JSP的name屬性寫的是picture眉撵,那么在Controller方法參數(shù)的名稱也是要寫picture的侦香,否則是獲取不到對(duì)應(yīng)的文件的..


@Controller
public class UploadController {
    @RequestMapping("/upload")
    //MultipartFile該對(duì)象就是封裝了圖片文件
    public void upload(MultipartFile picture) throws Exception {
        System.out.println(picture.getOriginalFilename());
    }
}
這里寫圖片描述

總結(jié)

  • 在SpringMVC中的業(yè)務(wù)方法默認(rèn)支持的參數(shù)有四種
    • request
    • response
    • session
    • model
  • 我們的參數(shù)綁定(自動(dòng)封裝參數(shù))是由我們的轉(zhuǎn)換器來(lái)進(jìn)行綁定的。現(xiàn)在用的一般都是Converter轉(zhuǎn)換器
  • 在上一章中我們使用WebDataBinder方式來(lái)實(shí)現(xiàn)對(duì)日期格式的轉(zhuǎn)化纽疟,當(dāng)時(shí)僅僅是可用于當(dāng)前Action的罐韩。我們想要讓全部Action都可以使用的話,有兩種方式:
    • 實(shí)現(xiàn)PropertyEditorRegistrar(比較老的方式)
    • 實(shí)現(xiàn)Converter(新的方式)
  • 參數(shù)綁定都有遵循的規(guī)則:方法參數(shù)名要與傳遞過(guò)來(lái)的name屬性名相同
  • Controller方法的返回值有5種:
    • void
    • String
    • ModelAndView
    • redirect重定向
    • forward轉(zhuǎn)發(fā)
  • Model內(nèi)部就是將數(shù)據(jù)綁定到request域?qū)ο笾械摹?/li>
  • @ModelAttribute注解能夠?qū)?shù)據(jù)綁定到model中(也就是request中)蟆肆,如果經(jīng)常需要綁定到model中的數(shù)據(jù)矾睦,抽取成方法來(lái)使用這個(gè)注解還是不錯(cuò)的。
  • idea配置虛擬目其實(shí)就是加多一個(gè)deployment炎功,然后配置它的應(yīng)用路徑
  • SpringMVC的文件上傳就是配置一個(gè)上傳解析器枚冗,使用MultipartFile來(lái)接收帶過(guò)來(lái)的文件。

如果文章有錯(cuò)的地方歡迎指正蛇损,大家互相交流赁温。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué)淤齐,可以關(guān)注微信公眾號(hào):Java3y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末股囊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子更啄,更是在濱河造成了極大的恐慌毁涉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈死,死亡現(xiàn)場(chǎng)離奇詭異贫堰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)待牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門其屏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人缨该,你說(shuō)我怎么就攤上這事偎行「蛱唬” “怎么了妙真?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵珍德,是天一觀的道長(zhǎng)薄料。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谷市,這世上最難降的妖魔是什么啦桌? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮又跛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己此熬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吉执,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咕宿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天寞蚌,我揣著相機(jī)與錄音壹哺,去河邊找鬼攀甚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛燕雁,可吹牛的內(nèi)容都是我干的刑赶。 我是一名探鬼主播浊洞,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼法希,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了靶瘸?” 一聲冷哼從身側(cè)響起怨咪,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匠楚,失蹤者是張志新(化名)和其女友劉穎益咬,沒想到半個(gè)月后裆甩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冗锁,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冻河,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年茉帅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叨叙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堪澎,死狀恐怖擂错,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情樱蛤,我是刑警寧澤钮呀,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布剑鞍,位于F島的核電站,受9級(jí)特大地震影響爽醋,放射性物質(zhì)發(fā)生泄漏蚁署。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一子房、第九天 我趴在偏房一處隱蔽的房頂上張望形用。 院中可真熱鬧,春花似錦证杭、人聲如沸田度。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镇饺。三九已至,卻和暖如春送讲,著一層夾襖步出監(jiān)牢的瞬間奸笤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工哼鬓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留监右,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓异希,卻偏偏與公主長(zhǎng)得像健盒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子称簿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容