文件上传、数据校验(后台)、拦截器

1. 文件上传

  1. 需要上传的jar包——fileploat

  2. 网页端
    表单必须是post提交,编码必须是multipart/form-data 文件上传文本框必须起名

姓名: 年龄: 上传文件:
```
  1. 在springMVC中配置文件上传解析器

```
  1. 在控制层处理代码

package com.alibaba.wlq.controller;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.wlq.bean.Student;
@Controller
public class StudentController {
@RequestMapping("stuUpload")
public String addStudent(MultipartFile photo,Student stu,HttpServletRequest request,Model model) {
//获取文件上传的真实保存路径
String path = request.getServletContext().getRealPath("/photo");
File file = new File(path);
if(!file.exists()) {
file.mkdirs();
}
String filename = System.currentTimeMillis()+photo.getOriginalFilename();
stu.setSphoto("photo/"+filename);
File targetFile = new File(path+"/"+filename);
try {
FileUtils.writeByteArrayToFile(targetFile, photo.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
model.addAttribute("stu",stu);
return "index";
}
}
```

  1. Student 实体类

package com.alibaba.wlq.bean;
public class Student {
private String name;
private Integer age;
//注意:Student实体类中图片的属性名称不能和文件上传中名臣属性的值一致,否则会出现400错误
private String sphoto;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSphoto() {
return sphoto;
}
public void setSphoto(String sphoto) {
this.sphoto = sphoto;
}
}
```

2.拦截器

什么是拦截器?

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。

  1. 创建一个类,实现HandlerInterceptor接口并且重写接口中的方法

package com.alibaba.wlq.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class Interceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
Object user = request.getSession().getAttribute("user");
if(user!=null) {
return true;
}else {
response.sendRedirect("toLogin");
return false;
}
}
}
```

  1. 把创建的类配置到SpringMVC的配置文件中

<mvc:interceptors>
	<mvc:interceptor>
        	<!--表示拦截所有user下以及user下子类的请求-->
			<mvc:mapping path="/user/**"/>
        	<!---->
			<mvc:exclude-mapping path="/user/toLogin"/>
			<mvc:exclude-mapping path="/user/login"/>
			<mvc:exclude-mapping path="/user/toRegister"/>
			<mvc:exclude-mapping path="/user/register"/>
			<mvc:exclude-mapping path="/user/index"/>
			<bean class="com.alibaba.wlq.interceptor.Interceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
```

3.数据校验(后台校验)

  1. 导入jar包(validate)

  2. 在相应的实体类中加入注解

    package com.alibaba.wlq.bean;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Pattern;
    
    import org.hibernate.validator.constraints.Length;
    import org.hibernate.validator.constraints.NotEmpty;
    
    public class User {
        @NotEmpty(message="账号不能为空")
        @NotNull(message="账号不能为空")
        private String account;
        @NotEmpty(message="密码不能为空")
        @NotNull(message="密码不能为空")
        @Length(min=6,max=12,message="密码的长度在6~12之间")
        private String password;
        @Pattern(regexp="/^(13[0-9]{9})|(18[0-9]{9})|(14[0-9]{9})|(17[0-9]{9})|(15[0-9]{9})$/",message="手机号码格式不正确")
        private String phone;
        public String getPhone() {
    	    return phone;
        }
        public void setPhone(String phone) {
    	    this.phone = phone;
        }
        public User(String account, String password, String phone) {
    	    super();
    	    this.account = account;
    	    this.password = password;
    	    this.phone = phone;
        }
        public String getAccount() {
    	    return account;
        }
        public void setAccount(String account) {
    	    this.account = account;
        }
        public String getPassword() {
    	    return password;
        }
        public void setPassword(String password) {
    	    this.password = password;
        }
        public User(String account, String password) {
    	    super();
    	    this.account = account;
    	    this.password = password;
        }
        public User() {
    	    super();
        }
    }
    
    
  3. 控制层接受参数时

@RequestMapping("register")
public String register(@Valid User user,BindingResult br,Model model) {
if(br.hasErrors()) {
List fieldList = br.getFieldErrors();
Map<String,Object> errorMsg = new HashMap<>();
for (FieldError f : fieldList) {
errorMsg.put(f.getField(), f.getDefaultMessage());
}
model.addAttribute("errorMsg",errorMsg);
return "register";
}
return "login";
}
```

  1. 在网页中拿到错误信息

<body> <form action="register" method="post"> 账号:<input type="text" name="account"/>${errorMsg.account }<br> 密码:<input type="text" name="password"/>${errorMsg.password }<br> 手机号:<input type="text" name="phone"/>${errorMsg.phone}<br> <input type="submit" value="提交"/> </form> </body> ```
posted @ 2019-09-04 22:41  wuliqqq  阅读(1756)  评论(0编辑  收藏  举报