SpringMVC教程3【文件上傳下載,靜態資源處理及數據校驗】

一,文件上傳

web.xml配置通用css

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SpringMVC-01-hello</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:Spring-MVC.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

引入相關jar包

在這裏插入圖片描述

自定義頁面表單

表單提交方式必須是post方式提交,enctype必須是multipart/form-data 在這裏插入圖片描述 在這裏插入圖片描述html

自定義Controller接受數據

在這裏插入圖片描述

配置springmvc的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
		<!-- 開啓掃描 -->
	<context:component-scan base-package="com.sxt"/>
	
	<!-- 開啓SpringMVC註解的方式 -->
	<mvc:annotation-driven ></mvc:annotation-driven>
	<!-- 注意id必須叫 multipartResolver-->
	<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
	<!-- 設置文件上傳最大尺寸 -->
		<property name="maxUploadSize" value="5242880"></property>
	</bean>
	
</beans>

注意: CommonsMultipartResolver這個Bean的id必須爲multipartResolver, 緣由:CommonsMultipartResolver Bean是在DispatcherServlet中加載的,而DispatcherServlet是經過名字來查找這個Bean的。而其餘的,則是按照類型查找。前端

二,文件下載

1.方式一:基於ResponseEntity實現

/**
	 * 文件下載方式二
	 * @param request
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/dowmload2")
	public  ResponseEntity<byte[]> fun3(HttpServletRequest request) throws Exception{
		File file = new File("D:/Pictures/54195251823a4.jpg");
		FileInputStream is = new FileInputStream(file);
		 byte[] body = new byte[is.available()];
		    is.read(body);
		    HttpHeaders headers = new HttpHeaders();
		    headers.add("Content-Disposition", "attchement;filename=" + file.getName());
		    HttpStatus statusCode = HttpStatus.OK;
		    ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);
		    return entity;
		
		
	}

方式二:通用下載方式

/**
	 * 文件下載方式一
	 * @param request
	 * @param response
	 * @throws IOException
	 */
	@RequestMapping("/dowmload")
	public void fun2(HttpServletRequest request,HttpServletResponse response) throws IOException{
		File file = new File("D:/Pictures/54195251823a4.jpg");
		FileInputStream in = new FileInputStream(file);
		response.setCharacterEncoding("utf-8");
		response.setContentType("multipart/form-data");
		response.setHeader("Content-Disposition", "attachment;fileName="+file.getName());
		ServletOutputStream out = response.getOutputStream();
		int num = 0;
		byte[] b = new byte[1024];
		while ((num = in.read(b)) != -1) {
			out.write(b, 0, num);
		}
		out.flush();
		out.close();
		in.close();
		
	}

自定義頁面(響應就好了)

<h1><a href="dowmload">下載</a></h1><h1><a href="dowmload2">下載2</a></h1>

在這裏插入圖片描述

三靜態資源過濾

在SpringMVC中,默認狀況下,全部的靜態資源都會被攔截,對於靜態資源,須要手動配置靜態資源過濾。java

第一種在web.xml配置

<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>

第二種在配置文件經過標籤設置

<!--  防止資源文件被spring MVC攔截-->
 <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/>
  <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/>
   <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>

例如,瀏覽器發送http://localhost:8080/static/img/01.png請求,該請求符合/static/img/*,此時,*表明01.png,那麼springmvc會將01.png補充到對應的location後面,進而查找到文件。 這裏須要注意: *表示一層路徑 ; ** 表示多層路徑映射git

四數據校驗

數據校驗說明

最先的校驗,就是服務端校驗。早期的網站,用戶輸入一個郵箱地址,校驗郵箱地址須要將地址發送到服務端,服務端進行校驗,校驗成功後,給前端一個響應。有了JavaScript,校驗工做能夠放在前端去執行。那麼爲何還須要服務端校驗呢? 由於前端傳來的數據不可信。前端很容易獲取都後端的數據接口,若是有人繞過頁面,就會出現非法數據,因此服務端也要數據校驗,總的來講: 1.前端校驗要作,目的是爲了提升用戶體驗 2.後端校驗也要作,目的是爲了數據安全web

普通校驗

SpringMVC 自己沒有校驗功能,它使用hibernat的校驗框架,hiber的校驗框架和orm沒有關係正則表達式

建立項目,引入相關jar包

在這裏插入圖片描述

建立properties文件

在這裏插入圖片描述

在springmvc的配置w文件配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	
	<!-- 開啓SpringMVC註解的方式 -->
	<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
		<!-- 開啓掃描 -->
	<context:component-scan base-package="com.sxt"/>
	<!--添加對JSR-303驗證框架的支持  -->
	<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validator">
			<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
			 <!--不設置則默認爲classpath下的 ValidationMessages.properties -->
			<property name="validationMessageSource" ref="validationMessageSource"></property>
	</bean>
	<bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="validationMessageSource">
			<property name="basename" value="classpath:user"/>
			<property name="fileEncodings" value="utf-8"/>
			<property name="cacheSeconds" value="120"/>
	
	
	</bean>
	
	
</beans>

在這裏插入圖片描述

bean對象配置校驗規則

在這裏插入圖片描述

| @Null | 被註解的元素必須爲 null |spring

| @NotNull | 被註解的元素必須不爲 null |後端

| @AssertTrue | 被註解的元素必須爲 true |瀏覽器

|@AssertFalse | 被註解的元素必須爲 false |

| @Min(value) |被註解的元素必須是一個數字,其值必須小於等於指定的最大值 |

| @DecimalMin(value) | 被註解的元素必須是一個數字,其值必須大於等於指定的最小值 |

| @DecimalMax(value) | 被註解的元素必須是一個數字,其值必須小於等於指定的最大值 |

|@Size(max=, min=) | 被註解的元素的大小必須在指定的範圍內 |

| @Digits (integer, fraction) | 被註解的元素必須是一個數字,其值必須在可接受的範圍內 |

|@Past | 被註解的元素必須是一個過去的日期 |

| @Future | 被註解的元素必須是一個未來的日期 |

| @Pattern(regex=,flag=) |被註解的元素必須符合指定的正則表達式 |

|@NotBlank(message =) |驗證字符串非null,且長度必須大於0 |

|@Email | 被註解的元素必須是電子郵箱地址 |

|@Length(min=,max=) | 被註解的字符串的大小必須在指定的範圍內 |

|@NotEmpty | 被註解的字符串的必須非空 |

|@Range(min=,max=,message=) | 被註解的元素必須在合適的範圍內 |

在自定義Controller校驗

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.sxt.bean.Book;

@Controller
public class Conreoller {
	/**
	 * @Validated 表示book接受的數據跟據指定規則進行了校驗
	 * BindingResult 封裝驗證結果,必須緊跟在驗證變量後,成對出現,多個信息驗證,多個BindingResult
	 * @param book
	 * @param br
	 */
	@RequestMapping("/update")
	@ResponseBody
	public void fun1(@Validated Book book,BindingResult br){
		List<ObjectError> errors = br.getAllErrors();
		if(errors != null && errors.size() > 0){
			// 確定有錯誤信息
			for (ObjectError e : errors) {
				System.out.println(e.getDefaultMessage());
			}
		}else{
			// 數據合格
			System.out.println(book);
		}
		
	}
}

定義一個頁面表單

在這裏插入圖片描述

測試

在這裏插入圖片描述 在這裏插入圖片描述

分組校驗

爲何須要分組校驗? 由於一個對象有多個屬性,而不一樣的controller校驗的需求是不同的,因此分組校驗就解決這個問題了

定義分組(兩個接口裏面不須要寫任何代碼)

在這裏插入圖片描述

使用分組

在這裏插入圖片描述

在Controller使用

/**
	 * @Validated 表示book接受的數據跟據指定規則進行了校驗
	 * BindingResult 封裝驗證結果,必須緊跟在驗證變量後,成對出現,多個信息驗證,多個BindingResult
	 * @param book
	 * @param br
	 */
	@RequestMapping("/update1")
	public String fun3(@Validated(value=GroupIntance.class) Book book,BindingResult br,Model m){
		List<ObjectError> errors = br.getAllErrors();
		if(errors != null && errors.size() > 0){
			// 確定有錯誤信息
			for (ObjectError e : errors) {
				System.out.println(e.getDefaultMessage());
			}
			m.addAttribute("errors", errors);
		}else{
			// 數據合格
			System.out.println(book);
		}
		return "/user.jsp";
	}
	/**
	 * @Validated 表示book接受的數據跟據指定規則進行了校驗
	 * BindingResult 封裝驗證結果,必須緊跟在驗證變量後,成對出現,多個信息驗證,多個BindingResult
	 * @param book
	 * @param br
	 */
	@RequestMapping("/add1")
	public String fun4(@Validated(value=GroupIntance2.class) Book book,BindingResult br,Model m){
		List<ObjectError> errors = br.getAllErrors();
		if(errors != null && errors.size() > 0){
			// 確定有錯誤信息
			for (ObjectError e : errors) {
				System.out.println(e.getDefaultMessage());
			}
			m.addAttribute("errors", errors);
		}else{
			// 數據合格
			System.out.println(book);
		}
		return "/user.jsp";
	}

頁面

在這裏插入圖片描述

測試

都爲空測試 在這裏插入圖片描述

將請求由add1改成update1測試結果都爲空 在這裏插入圖片描述

相關文章
相關標籤/搜索