文件上传、数据校验(后台)、拦截器
1. 文件上传
-
需要上传的jar包——fileploat
-
网页端
表单必须是post提交,编码必须是multipart/form-data 文件上传文本框必须起名
-
在springMVC中配置文件上传解析器
-
在控制层处理代码
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";
}
}
```
-
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中的拦截器,就需要对拦截器类进行定义和配置。
-
创建一个类,实现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;
}
}
}
```
-
把创建的类配置到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.数据校验(后台校验)
-
导入jar包(validate)
-
在相应的实体类中加入注解
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(); } }
-
控制层接受参数时
@RequestMapping("register")
public String register(@Valid User user,BindingResult br,Model model) {
if(br.hasErrors()) {
List
Map<String,Object> errorMsg = new HashMap<>();
for (FieldError f : fieldList) {
errorMsg.put(f.getField(), f.getDefaultMessage());
}
model.addAttribute("errorMsg",errorMsg);
return "register";
}
return "login";
}
```
-
在网页中拿到错误信息