1.底层使用的是Apache fileupload组件进行上传的功能,Springmvc 只是对其进行了封装,简化开发,
pom.xml
<!-- apache fileupload-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.JSP页面处理
- inpu的type设置为file
- form表单的method设置为post
- form表单的enctype设置为multipar/form-data
一:单文件:
JSP
<%--
Created by IntelliJ IDEA.
User: 郝泾钊
Date: 2022-04-07
Time: 16:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/file/upload" method="post" enctype="multipart/form-data">
<input type="file" name="img"/>
<input type="submit" value="提交"/>
</form>
<img src="${src}">
</body>
</html>
Handler
package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.multipartfile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
@Controller
@RequestMapping("/file")
public class fileHandler {
@PostMapping("/upload")
public String upload(@RequestParam("img")multipartfile img, HttpServletRequest request) {
if(img.getSize()>0){
String path =request.getSession().getServletContext().getRealPath("file");
String fileName =img.getoriginalFilename();
File file =new File(path,fileName);
try {
img.transferTo(file);
request.setAttribute("src","/file/"+fileName);
} catch (IOException e) {
e.printstacktrace();
}
}
return "upload";
}
}
配置解析器:
<!-- 配置转换器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
二:多文件:
@PostMapping("/uploads")
public String uploads(@RequestParam("imgs")multipartfile[] imgs, HttpServletRequest request) {
List<String> pathlist = new ArrayList<>();
for (multipartfile img : imgs) {
if (img.getSize() > 0) {
String path = request.getSession().getServletContext().getRealPath("file");
String fileName = img.getoriginalFilename();
File file = new File(path, fileName);
try {
img.transferTo(file);
pathlist.add("/file/" + fileName);
} catch (IOException e) {
e.printstacktrace();
}
}
}
request.setAttribute("list",pathlist);
return "upload";
}
<form action="/file/uploads" method="post" enctype="multipart/form-data">
file1:<input type="file" name="imgs"><br>
file1:<input type="file" name="imgs"><br>
<input type="submit" value="提交">
</form>
<c:forEach items="${list}" var="path">
<img src="${path}" width="300px">
</c:forEach>
文件下载
@GetMapping("/downLoad")
public void downLoad(String fileName, HttpServletRequest request, HttpServletResponse response){
if(fileName!=null){
String path = request.getSession().getServletContext().getRealPath("file");
File file =new File(path,fileName);
OutputStream outputStream=null;
if(file.exists()){
//设置下载文件
response.setContentType("application/force-downlocad");
//设置文件名
response.setHeader("Content-dispoition","attachment;filename"+fileName);
try {
outputStream=response.getoutputStream();
outputStream.write(FileUtils.readFiletoByteArray(file));
} catch (IOException e) {
e.printstacktrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printstacktrace();
}
}
}
}
}
}
Spring Mvc 数据校验的组件
有两种:
-
基于Vaildator接口进行校验
-
使用Annotation JSR-303标准校验
使用Vaildator接口会复杂点,开发者要自己定义规则,而Annotation JSR-303则是要开发者添加对应的校验注解即可。
基于Validator的接口*
1.创建实体类:
package com.southwind.entity;import lombok.Data; @Data public class Student { // private Integer id; // private String name; // private Integer age; private String name; private String password; }
2.自定义数据校验器StudentValidator实现Validator接口,重写接口的抽象方法,加入校验规则。
package com.southwind.validation;import com.southwind.entity.Student; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; public class StudentValidator implements Validator { @Override public boolean supports(Class<?> aClass) { return Student.class.equals(aClass); } @Override public void validate(Object o, Errors errors) { ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空"); ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空"); } }
3.业务方法:
package com.southwind.controller;
import com.southwind.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/validatior")
public class ValidatiorHandler {
//先数据绑定
@GetMapping("/login")
public String login(Model model){
model.addAttribute(new Student());
return "login";
}
@RequestMapping("/login")
public String login(@Validated Student student, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "login";
}else {
return "login";
}
}
}
package com.southwind.validation;
import com.southwind.entity.Student;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class StudentValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return Student.class.equals(aClass);
}
@Override
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空");
ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空");
}
}
Annotation JSR-303
Hibernater Validator,通过注解完成校验
名称 说明
@Null 被标注的元素必须为 null
@NotNull 被标注的元素必须不为 null
@AssertTrue 被标注的元素必须为 true
@AssertFalse 被标注的元素必须为 false
@Min(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMax(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最大值
@DecimalMin(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最小值
@size 被标注的元素的大小必须在指定的范围内
@Digits(integer,fraction) 被标注的元素必须是一个数字,其值必须在可接受的范围内;integer 指定整数精度,fraction 指定小数精度
@Past 被标注的元素必须是一个过去的日期
@Future 被标注的元素必须是一个将来的日期
@Pattern(value) 被标注的元素必须符合指定的正则表达式
配置:
pom.xml
<!-- JSP303-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.6.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.4.1.Final</version>
</dependency>
<mvc:annotation-driven></mvc:annotation-driven>
业务页面:
@GetMapping("/register")
public String register(Model model){
model.addAttribute(new Account());
return "register";
}
@PostMapping("/register")
public String register(@Valid Account account,BindingResult bindingResult ){
if(bindingResult.hasErrors()){
return "register";
}else {
return "success";
}
}
实体类:
package com.southwind.entity;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Data
public class Account {
@NotEmpty(message = "用户名不能为空")
private String userName;
@Size(min = 6,max = 20,message = "长度为5到20位")
private String password;
@Email(regexp = "[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?",message = "请输入正确的表达式")
private String email;
@Pattern(regexp = "\\d{3}-\\d{8}|\\d{4}-\\{7,8}",message = "请输入正确的表达式")
private String phone;
}
页面:
<%--
Created by IntelliJ IDEA.
User: 郝泾钊
Date: 2022-04-07
Time: 19:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1> 用户登录</h1>
<form:form modelattribute="account" action="/validatior/register">
用户名:<form:input path="userName"></form:input><form:errors path="userName"></form:errors><br>
密码:<form:input path="password"></form:input><form:errors path="password"></form:errors><br>
邮箱:<form:input path="email"></form:input><form:errors path="email"></form:errors><br>
电话:<form:input path="phone"></form:input><form:errors path="phone"></form:errors><br>
<input type="submit" value="提交">
</form:form>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。