本文主要講解的知識點以下:html
咱們在Controller使用方法參數接收值,就是把web端的值給接收到Controller中處理,這個過程就叫作參數綁定...java
從上面的用法咱們能夠發現,咱們可使用request對象、Model對象等等,實際上是不是能夠隨便把參數寫上去都行???其實並非的...web
Controller方法默認支持的參數類型有4個,這4個足以支撐咱們的平常開發了spring
通常地,咱們要用到自定義的參數綁定就是上面所講的日期類型轉換以及一些特殊的需求....對於日常的參數綁定,咱們是無需使用轉換器的,SpringMVC就已經幫咱們幹了這個活了...微信
在上一篇咱們已經簡單介紹了怎麼把字符串轉換成日期類型了【使用的是WebDataBinder方式】...其實那是一個比較老的方法,咱們可使用SpringMVC更推薦的方式...session
在上次把字符串轉換成日期類型,若是使用的是WebDataBinder方式的話,那麼該轉換僅僅只能在當前Controller使用...若是想要所有的Controller都可以使用,那麼咱們可使用WebBindingInitializer方式mvc
若是想多個controller須要共同註冊相同的屬性編輯器,能夠實現PropertyEditorRegistrar接口,並注入webBindingInitializer中。app
實現接口編輯器
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)); } }
注入到webBindingInitializer中ide
<!-- 註冊屬性編輯器 --> <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中注入自定義屬性編輯器、自定義轉換器 --> <property name="webBindingInitializer" ref="customBinder"></property> </bean>
上面的方式是對象較老的,如今咱們通常都是實現Converter接口來實現自定義參數轉換...咱們就來看看實現Converter比上面有什麼好
配置日期轉換器
public class CustomDateConverter implements Converter<String, Date> { @Override public Date convert(String source) { try { //進行日期轉換 return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source); } catch (Exception e) { e.printStackTrace(); } return null; } }
配置去除字符串轉換器
public class StringTrimConverter implements Converter<String, String> { @Override public String convert(String source) { try { //去掉字符串兩邊空格,若是去除後爲空設置爲null if(source!=null){ source = source.trim(); if(source.equals("")){ return null; } } } catch (Exception e) { e.printStackTrace(); } return source; } }
從上面能夠得出,咱們想要轉換什麼內容,就直接實現接口,該接口又是支持泛型的,閱讀起來就很是方便了...
<!-- 轉換器 --> <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進行參數轉 --> <property name="conversionService" ref="conversionService" /> </bean> <!-- 註解適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <!-- 在webBindingInitializer中注入自定義屬性編輯器、自定義轉換器 --> <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"> <!-- 轉換器 --> <property name="converters"> <list> <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/> <bean class="cn.itcast.ssm.controller.converter.StringTrimConverter"/> </list> </property> </bean>
咱們通常使用的參數綁定都有遵循的規則:方法參數名要與傳遞過來的name屬性名相同。
在默認的狀況下,只有名字相同,SpringMVC纔會幫咱們進行參數綁定...
若是咱們使用@RequestParam註解
的話,咱們就可使方法參數名與傳遞過來的name屬性名不一樣...
該註解有三個變量
例子:咱們的方法參數叫id,而頁面帶過來的name屬性名字叫item_id,必定須要該參數
public String editItem(@RequestParam(value="item_id",required=true) String id) { }
Controller方法的返回值其實就幾種類型,咱們來總結一下....
其實數據回顯咱們如今的話就一點也不陌生了....咱們剛使用EL表達式的時候就已經學會了數據回顯了,作SSH項目的時候也有三圈問題的數據回顯...
在頁面上數據回顯本質上就是獲取reqeust域的值..
而在咱們SpringMVC中,咱們是使用Model來把數據綁定request域對象中的
通常地咱們都是使用model.addAttribute()的方式把數據綁定到request域對象中...其實SpringMVC還支持註解的方式
@ModelAttribute
註解咱們能夠將請求的參數放到Model中,回顯到頁面上
上面這種用法和model.addAttribute()的方式是沒啥區別的,也體現不了註解的方便性...
而若是咱們要回顯的數據是公共的話,那麼咱們就可以體會到註解的方便性了,咱們把公共須要顯示的屬性抽取成方法,將返回值返回就好了。
那咱們就不用在每個controller方法經過Model將數據傳到頁面。
咱們使用Struts2的時候,以爲Struts2的文件上傳方式比傳統的文件上傳方式好用多了...
既然咱們正在學習SpringMVC,那麼咱們也看一下SpringMVC到底是怎麼上傳文件的...
在此次,咱們並非把圖片上傳到咱們的工程目錄中...
那爲啥不將圖片直接上傳到咱們的工程目錄中呢???咱們仔細想一想,按照咱們以前的作法,直接把文件上傳到工程目錄,而咱們的工程目錄是咱們寫代碼的地方 ...每每咱們須要備份咱們的工程目錄。
若是把圖片都上傳到工程目錄中,那麼就很是難以處理圖片了...
所以,咱們須要配置Tomcat的虛擬目錄來解決,把上傳的文件放在虛擬目錄上...
又值得注意的是,Idea使用的Tomcat並不能使用傳統的配置方式,也就是修改server.xml方式來配置虛擬目錄,在Idea下好像不支持這種作法...
有興趣的同窗能夠去測試一下:
那麼我在網上已經找到了對應的解決辦法,就是若是在idea上配置虛擬目錄
檢測是否配置成功:
在SpringMVC中文件上傳須要用到的jar包
配置文件上傳解析器
<!-- 文件上傳 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設置上傳文件的最大尺寸爲5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
測試的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>測試文件上傳</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方法參數的名稱也是要寫picture的,不然是獲取不到對應的文件的..
@Controller public class UploadController { @RequestMapping("/upload") //MultipartFile該對象就是封裝了圖片文件 public void upload(MultipartFile picture) throws Exception { System.out.println(picture.getOriginalFilename()); } }
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y