SpringMVC教程3【文件上传下载,静态资源处理及数据校验】

15 篇文章 0 订阅
12 篇文章 0 订阅

一,文件上传

web.xml配置通用

<?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
在这里插入图片描述
在这里插入图片描述

自定义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中,默认情况下,所有的静态资源都会被拦截,对于静态资源,需要手动配置静态资源过滤。

第一种在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后面,进而查找到文件。
这里需要注意:
*表示一层路径 ;
** 表示多层路径映射

四数据校验

数据校验说明

最早的校验,就是服务端校验。早期的网站,用户输入一个邮箱地址,校验邮箱地址需要将地址发送到服务端,服务端进行校验,校验成功后,给前端一个响应。有了JavaScript,校验工作可以放在前端去执行。那么为什么还需要服务端校验呢? 因为前端传来的数据不可信。前端很容易获取都后端的数据接口,如果有人绕过页面,就会出现非法数据,所以服务端也要数据校验,总的来说:
1.前端校验要做,目的是为了提高用户体验
2.后端校验也要做,目的是为了数据安全

普通校验

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
@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测试结果都为空
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值