SpringMVC-04 文件上传与数据校验
springmvc 完成文件上传
1.导入文件上传所依赖的jar包(FileUpload)
2.网页(表单必须是post提交,编码必须是multipart/form-data,文件上传框必须命名)
<!--文件上传是上传的本地服务器下,而数据库存放的是图片路径 -->
<form action="upload" method="post" enctype="multipart/form-data">
上传的文件:<input type="file" name="myfile">
<input type="submit" value="上传">
</from>
**3.在SpringMVC配置文件上传解析器 **
<!-- 设置文件上传解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置文件的大小字节 -->
<property name="maxUploadSize" value="9999999"></property>
</bean>
4.在控制层处理代码
//只上传文件时
@RequestMapping("upload")
public String upload(MultipartFile myfile,HttpServlet request){
//1.获取文件上传真实文件路径
String path = request.getServletContext().getRealPath("/upload");
//2.创建一个文件对象
File file = new File(path);
if(!file.exists()){
file.mkdirs();
}
//3.获取文件名
String name = myfile.getOriginalFilename();//文件拼接毫秒(System.currentTimeMillis()),避免文件名重复
//4.指定的上传文件目录
File targetFile = new File(path+"/"+name);
FileUtils.writeByteArrayToFile(targetFile,myfile.getBytes()) //将myfile转变为字节
}
//上传文件与对象时,图片的属性名不能与bean中的属性名相同,否则会出现400错误(无效参数)
@RequestMapping("upload1")
public String upload1(Student stu,MultipartFile photo,HttpServletRequest request,Model model) {
String path = request.getServletContext().getRealPath("/upload/photo");
File file = new File(path);
if(file.exists()) {
file.mkdirs();
}
String fileName = photo.getOriginalFilename()+System.currentTimeMillis();
stu.setPhotos("upload/photo/"+fileName);
File targetFile = new File(path+"/"+fileName);
try {
FileUtils.writeByteArrayToFile(targetFile, photo.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
model.addAttribute("stu", stu);
return "index";
}
使用拦截器
拦截器:拦截控制层的地址,不能拦截页面(如果有多个拦截器,则拦截器的方法执行顺序为preHandler1,preHandler2...Controller...postHandler2,postHandler1...afterConttroler2,after Conttroler1...)
过滤器:可以拦截所有
-
创建一个类,实现接口 HandlerInterceptor 接口,重写接口中的方法
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class FirstInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { //一般用于关闭资源 } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse respone, Object arg2) throws Exception { Object user = request.getSession().getAttribute("user"); if(user!=null) { return true; }else { respone.sendRedirect("login"); return false; } } } //preHandle:SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor.每个Interceptor的调用会依据它的声明顺 序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去.该方法的返回值是布尔值Boolean类型,当返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor,就会调用当前请求的Controller方法. //postHandle:顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作.postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行. //afterCompletion:该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,主要用于进行资源清理工作
-
在springmvc配置文件中配置类
<!--配置拦截器--> <mvc:intercrptors> <mvc:interceptor> <!--**表示user下所有的子目录以及所有的请求地址--> <mvc:mapping path="/user/**"/> <!--需要拦截的地址--> <mvc:exclude-mapping path="/user/index.do"> <bean class="com.hw.lb.interceptor.类名"></bean> </mvc:interceptor> </mvc:intercrptors>
springmvc完成数据校验【后台数据 hibernate validate】
- 引入数据校验所需的jar(validate)
-
在相应的实体类中添加注解
@NotNull 验证对象是否不为空 @Patterm 验证String对象是否在当前正则表达式的规则 @Email 验证是否是合法的邮箱 @NotEmpty 检查元素是否为Null或Empty @Length(max,min) 验证字符串的长度必须在指定范围内 public class User { @NotNull(message="用户名不能为空") @NotEmpty(message="用户名不能为空") private String name; @NotNull(message="用户名不能为空") @Length(min=6,max=12,message="密码长度在【6~12】字符之间") private String password; @Patterm(regexp="^[1](([3|5|8][\\d])|([4][4,5,6,7,8,9])|([6][2,5,6,7])|([7][^9])|([9][1,8,9]))[\\d]{8}$",message="手机格式不正确") private String phone; //get()&set() }
-
在controller接收参数时
@RequestMapping("register") //@Valid:校验该对象 public String register(@Valid User user,BindingResult br,Model model) { //BindingResult br 将验证的错误信息都封装到BindingResult类中 if(br.hasErrors()) { //判断是否有错误信息 List<FieldError> fieldError = br.getFieldErrors(); Map<String,Object> errorMge = new HashMap<>(); for (FieldError f : fieldError) { //遍历添加错误信息到Map中 errorMge.put(f.getField(), f.getDefaultMessage()); } model.addAttribute("errorMge", errorMge); return "forward:toRegister"; } return "list"; }
-
网页端获取错误信息
<form action="register" method="post"> 用户名:<input type="text" name="name">${errorMge.name }<br> 密码:<input type="text" name="password">${errorMge.password }<br> <input type="submit" value="注册"> </form>