SpringMVC【參數綁定、數據回顯、文件上傳】

前言

本文主要講解的知識點以下:html

  • 參數綁定
  • 數據回顯
  • 文件上傳

參數綁定

咱們在Controller使用方法參數接收值,就是把web端的值給接收到Controller中處理,這個過程就叫作參數綁定...java

默認支持的參數類型

從上面的用法咱們能夠發現,咱們可使用request對象、Model對象等等,實際上是不是能夠隨便把參數寫上去都行???其實並非的...web

Controller方法默認支持的參數類型有4個,這4個足以支撐咱們的平常開發了spring

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model

參數的綁定過程

通常地,咱們要用到自定義的參數綁定就是上面所講的日期類型轉換以及一些特殊的需求....對於日常的參數綁定,咱們是無需使用轉換器的,SpringMVC就已經幫咱們幹了這個活了...微信

這裏寫圖片描述

自定義綁定參數【老方式、所有Action都可使用】

在上一篇咱們已經簡單介紹了怎麼把字符串轉換成日期類型了【使用的是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>
複製代碼

@RequestParam註解

咱們通常使用的參數綁定都有遵循的規則:方法參數名要與傳遞過來的name屬性名相同。

在默認的狀況下,只有名字相同,SpringMVC纔會幫咱們進行參數綁定...

若是咱們使用@RequestParam註解的話,咱們就可使方法參數名與傳遞過來的name屬性名不一樣...

該註解有三個變量

  • value【指定name屬性的名稱是什麼】
  • required【是否必需要有該參數】
  • defaultvalue設置默認值

例子:咱們的方法參數叫id,而頁面帶過來的name屬性名字叫item_id,必定須要該參數

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

}
複製代碼

Controller方法返回值

Controller方法的返回值其實就幾種類型,咱們來總結一下....

  • void
  • String
  • ModelAndView
  • redirect重定向
  • forward轉發

數據回顯

其實數據回顯咱們如今的話就一點也不陌生了....咱們剛使用EL表達式的時候就已經學會了數據回顯了,作SSH項目的時候也有三圈問題的數據回顯...

在頁面上數據回顯本質上就是獲取reqeust域的值..

而在咱們SpringMVC中,咱們是使用Model來把數據綁定request域對象中的

通常地咱們都是使用model.addAttribute()的方式把數據綁定到request域對象中...其實SpringMVC還支持註解的方式

@ModelAttribute註解

咱們能夠將請求的參數放到Model中,回顯到頁面上

這裏寫圖片描述

上面這種用法和model.addAttribute()的方式是沒啥區別的,也體現不了註解的方便性...

而若是咱們要回顯的數據是公共的話,那麼咱們就可以體會到註解的方便性了,咱們把公共須要顯示的屬性抽取成方法,將返回值返回就好了。

這裏寫圖片描述

那咱們就不用在每個controller方法經過Model將數據傳到頁面。


SpringMVC文件上傳

咱們使用Struts2的時候,以爲Struts2的文件上傳方式比傳統的文件上傳方式好用多了...

blog.csdn.net/hon_3y/arti…

既然咱們正在學習SpringMVC,那麼咱們也看一下SpringMVC到底是怎麼上傳文件的...

配置虛擬目錄

在此次,咱們並非把圖片上傳到咱們的工程目錄中...

那爲啥不將圖片直接上傳到咱們的工程目錄中呢???咱們仔細想一想,按照咱們以前的作法,直接把文件上傳到工程目錄,而咱們的工程目錄是咱們寫代碼的地方 ...每每咱們須要備份咱們的工程目錄。

若是把圖片都上傳到工程目錄中,那麼就很是難以處理圖片了...

所以,咱們須要配置Tomcat的虛擬目錄來解決,把上傳的文件放在虛擬目錄上...

又值得注意的是,Idea使用的Tomcat並不能使用傳統的配置方式,也就是修改server.xml方式來配置虛擬目錄,在Idea下好像不支持這種作法...

有興趣的同窗能夠去測試一下:

blog.csdn.net/hon_3y/arti…

那麼我在網上已經找到了對應的解決辦法,就是若是在idea上配置虛擬目錄

blog.csdn.net/LABLENET/ar…

檢測是否配置成功:

這裏寫圖片描述

快速入門

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

  • commons-fileupload-1.2.2.jar
  • commons-io-2.4.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());
    }
}

複製代碼

這裏寫圖片描述

總結

  • 在SpringMVC中的業務方法默認支持的參數有四種
    • request
    • response
    • session
    • model
  • 咱們的參數綁定(自動封裝參數)是由咱們的轉換器來進行綁定的。如今用的通常都是Converter轉換器
  • 在上一章中咱們使用WebDataBinder方式來實現對日期格式的轉化,當時僅僅是可用於當前Action的。咱們想要讓所有Action均可以使用的話,有兩種方式:
    • 實現PropertyEditorRegistrar(比較老的方式)
    • 實現Converter(新的方式)
  • 參數綁定都有遵循的規則:方法參數名要與傳遞過來的name屬性名相同
    • 咱們可使用@RequestParam註解來具體指定對應的name屬性名稱,這樣也是能夠實現參數綁定的。
    • 還可以配置該參數是不是必須的。
  • Controller方法的返回值有5種:
    • void
    • String
    • ModelAndView
    • redirect重定向
    • forward轉發
  • Model內部就是將數據綁定到request域對象中的。
  • @ModelAttribute註解可以將數據綁定到model中(也就是request中),若是常常須要綁定到model中的數據,抽取成方法來使用這個註解仍是不錯的。
  • idea配置虛擬目其實就是加多一個deployment,而後配置它的應用路徑
  • SpringMVC的文件上傳就是配置一個上傳解析器,使用MultipartFile來接收帶過來的文件。

若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠關注微信公衆號:Java3y

相關文章
相關標籤/搜索