SpringMVC框架(三)

数据校验
JSR 303 是java为Bean数据合法性校验提供的标准框架,它已经包含在javaEE6.0中
JSR 303 通过在Bean属性上标注类似于@NotNull @Max 等标准的注解指定校验规则
并通过标准的验证接口对Bean进行验证
SpringMVC框架(三)
SpringMVC框架(三)
数据校验
使用注解方法如下:
SpringMVC框架(三)
SpringMVC框架(三)
<mvc:annotation-driven>会默认装配好一个LocalValidatorFactoryBean,通过在处理方法的入参上标注
@Vaild注解 即可让Spring MVC 在完成数据绑定后执行数据的校验工作
SpringMVC框架(三)
SpringMVC框架(三)
需校验的Bean对象和其绑定结果对象或错误对象时成对出现的,他们之间不允许声明其他的入参
SpringMVC框架(三)
SpringMVC框架(三)
BindingResult继承自Errors,常用方法如下:
FieldError getFieldError(String field)
List<FieldError> getFieldErrors
Object getFieldValue(String field)
int getErrorCount()

在jsp页面上可通过<from:erors path="属性名称">显示错误消息

如;
SpringMVC框架(三)
SpringMVC框架(三)
例: 注意:验证记得加@Valid 否则无法验证
首先导入包
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

实体类
@NotNull
private String name;
@Min(value=150)
private int height;
@Past
private Date birthday;
@Email(message="邮箱填写有误,请重新填写")
private String email;

验证代码
@Controller
@RequestMapping("/valid")
public class ValidController {
@RequestMapping("/v1")
public String v1(@Valid Person person,BindingResult result) {
if(result.hasErrors()) {
return "error";
}
return "hello";
}

}

拦截器配置
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 配置一个拦截器 -->
<mvc:interceptor>
<!-- /代表根路径 -->
<!-- **代表这个路径下的所有文件,但是不包含子文件夹 -->
<mvc:mapping path="/inter/**"/>
<bean 
class="com.jredu.interceptor.FirstInterceptor"/>
</mvc:interceptor>

<!-- <mvc:interceptor>
<mvc:mapping path="/inter/"/>
</mvc:interceptor> -->
</mvc:interceptors>
过滤器和拦截器的区别:
  ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

多个拦截器的执行顺序
SpringMVC框架(三)
SpringMVC框架(三)
上传组件配置:
<!-- 上传组件配置 -->
<bean
id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="utf-8"
p:maxUploadSize="5242880"/>

例:
java代码
package com.jredu.controller;

import java.io.File;
import java.io.IOException;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/upload")
public class UploadController {
@RequestMapping("/l1")
public String upload(MultipartFile file,HttpSession session) throws IllegalStateException, IOException{
//验证文件是否为空
if(!file.isEmpty()) {
//文件命名:当前时间毫秒数+原图的名字
String fileName=System.currentTimeMillis()+file.getOriginalFilename();
//服务器的上传路径
String location=session.getServletContext().getRealPath("upload");
//上传文件
file.transferTo(new File(location+fileName));
}
return "success";
}

}

jsp代码
<body>
<form action="upload/l1"
enctype="multipart/form-data"
method="post">
<input type="file" name="file"/>
<input type="submit"/>
</form>
</body>