9数据格式化
在springmvc.xml中配置:
实体类Student
public class Student {
@NumberFormat(pattern="###,#")
private int id;
private String name;
private int age;
@DateTimeFormat(pattern="yyyy-MM-dd")//格式化:前台传递来的数据,将前台传递来到数据 固定为yyyy-MM-dd
private Date birthday ;// 2018-12-13
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private Address address ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
jsp页面:
servlet页面:
@RequestMapping(value="testDateTimeFormat")//如果Student格式化出错,会将错误信息 传入result中
public String testDateTimeFormat(Student student , BindingResult result) {
System.out.println(student.getId()+","+student.getName()+","+student.getBirthday());
if(result.getErrorCount() >0) {
for(FieldError error: result.getFieldErrors() ) {
System.out.println(error.getDefaultMessage());
}
}
return "success";
}
在页面中输入:
如果输入不满足的日期格式:
页面则会接受失败,报404错误
如果报错,则可以通过加入参数BindingResult result来接收错误
控制台打印:
通过参数BindingResult result来接收错误之后,前台页码则会正常显示,不会报404错误。类似于捕获异常try catch的情形。
数字格式化:
前台页面接收:
后台代码的规范,在实体类中规范
@NumberFormat(pattern="###,#")
private int id;
FormattingConversionServiceFactoryBean:既可以实现格式化、又可以实现类型转换
将错误信息通过参数BindingResult result来接收,然后通过Map利用requesScope域将错误传递到页面显示错误信息。否则在参数BindingResult result接收之后,前台页面不会报错误信息。(明明是错误的页面也不会报错误信息,因为被参数所接受处理)
在servlet中将错误信息放入map的requestScope域之中。
在jsp页面遍历显示错误消息:
BindingResult result一定要放到出现错误的实体类之后,否则报错。这个是springmvc框架的约定。
数据校验:
-
JSR303
-
Hibernate Validator(是JSR303的扩充)
a 需要的jar包:
b 加入springmvc的注解驱动:
//会在springmvc容器启动中,自动加载LocalValidatorFactoryBean
c 要想在springmvc中使用三方的校验,还需要实现这个接口:
ValidatorFactory
LocalValidatorFactoryBean是ValidatorFactory的一个实现类。
如果报这个错误,则可能是缺少jar包或者是导入的jar包不正确。
在校验的对象前加这个注解@Valid
注解@Past验证(前台输入的时间必须是当前时间之前的时间)
老师当时讲课的时间:
在前台页面输入当前时间以前的时间:
当输入错误时间的时候,在控制台会显示
@Email注解 验证是不是邮箱格式
11SpringMVC通过Ajax处理json数据
前台jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
在servlet中:需要加上注解ResponseBody
@ResponseBody//告诉SpringMVC,此时的返回 不是一个 View页面,而是一个 ajax调用的返回值(Json数组)
@RequestMapping(value="testJson")
public List testJson() {
//Controller-Service-dao
//StudentService studentService = new StudentServiceImp();
// List students = studentService.qeuryAllStudent();
//模拟调用service的查询操作
Student stu1 = new Student(1,"zs",23);
Student stu2 = new Student(2,"ls",24);
Student stu3 = new Student(3,"ww",25);
List students = new ArrayList<>();
students.add(stu1) ;
students.add(stu2) ;
students.add(stu3) ;
//模拟调用三层
return students;
//返回一个集合,前台ajax接受这个集合
}
实体类student
json需要的jar包(包的版本需要保持一致)
报这个错,也是jar包不对
在火狐浏览器中
12SpringMVC实现文件上传、拦截器
SpringMVC实现文件上传
和Servlet方式文件上传的本质一样,都是通过commons-fileupload.jar和commons-io.jar来完成的
SpringMVC可以简化文件上传的代码,但是必须满足条件:实现MultipartResolver接口 ;而该接口的实现类SpringMVC也已经提供了CommonsMultipartResolver
实现步骤
-
a导入需要的jar包
commons-fileupload.jar和commons-io.jar
-
b.配置CommonsMultipartResolver将其加入SpringIOC容器
springIOC容器在初始化时候,会自动寻找一个id为MultipartResolver的bean,并将其加入到IOC容器之中。
在jsp页面中:
在servlet中
//文件上传处理方法
@RequestMapping(value="testUpload") //abc.png
public String testUpload(@RequestParam("desc") String desc , @RequestParam("file") MultipartFile file ) throws IOException {
System.out.println("文件描述信息:"+desc);
//jsp中上传的文件:file
InputStream input = file.getInputStream() ;//IO
String fileName = file.getOriginalFilename() ;
//文件上传时候的文件名
OutputStream out = new FileOutputStream("d:\\"+fileName) ;
byte[] bs = new byte[1024];
int len = -1;
while(( len = input.read(bs)) !=-1 ) {
out.write(bs, 0, len);
}
out.close();
input.close();
//将file上传到服务器中的 某一个硬盘文件中
System.out.println("上传成功!");
return "success";
}
拦截器
拦截器的原理和过滤器相同。
SpringMVC:要想实现拦截器,必须实现一个接口HandlerInterceptor
拦截器的图示
-
a.编写拦截器implements HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("拦截请求"); //
return true;//true:拦截操作之后,放行 ;false:拦截之后不放行,请求终止;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("拦截响应");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("视图(jsp)被渲染完毕");
}
}
ctrl+shift+r :在eclipse中查找自己编写的代码.java .jsp .html
ctrl+shift+t :在eclipse中查找导入的jar包中的代码
-
b.配置:将自己写的拦截器 配置到springmvcIOC容器中(spring)
//拦截根目录下的任何子目录
页面请求点击
请求servlet:
控制台打印:
在拦截器中阻止这次请求
13@ExceptionHandler和@ResponseStatus异常处理
异常处理(@ExceptionHandler该注解标识的方法可以捕获哪些异常,相当于try catch中的catch,对异常进行捕获处理)
在SpringMVC中,处理异常的类实现了HandlerExceptionResolver接口,该接口的每个实现类 都是异常的一种处理方式。@ExceptionHandler标识的方法的参数 必须在异常类型(Throwable或其子类) ,不能包含其他类型的参数。
在servlet中:
异常的处理:
在控制台打印:
异常处理路径:最短优先原则
如果有方法抛出一个ArithmeticException异常,而该类中 有2个对应的异常处理法,那么最详细的能处理这个异常的方法会执行:
@ExceptionHandler({Exception.class })
public ModelAndView handlerArithmeticException2(Exception e) {}
@ExceptionHandler({ArithmeticException.class })
public ModelAndView handlerArithmeticException1(Exception e) {}
如果发生异常的方法和处理异常的方法不在同一个类之中,那么异常则不可以被捕获。
单独写一个仅仅是处理异常的类(该类加@ControllerAdvice注解,专业处理异常),它可以处理任何类中出现的异常
自定义异常的显示状态ResponseStatusExceptionResolver:自定义异常显示页面 (本类重要作用也是提供注解)@ResponseStatus
枚举类型的错误状态码
创建一个异常类,该类的错误码是注解@ResponseStatus中的value,错误信息是reason
触发的页面
前台报错页面
如果发生异常跳转到指定的页面
error
error
.异常处理的实现类:
DefaultHandlerExceptionResolver:SPringMVC在一些常见异常的基础上(300 500 405),新增了一些异常,例如:
* @see org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler
* @see #handleNoSuchRequestHandlingMethod
* @see #handleHttpRequestMethodNotSupported :如果springmvc的处理方法限制为post方式,如果实际请求为get,则会触发此异常显示的页面
* @see #handleHttpMediaTypeNotSupported
* @see #handleMissingServletRequestParameter
* @see #handleServletRequestBindingException
* @see #handleTypeMismatch
* @see #handleHttpMessageNotReadable
* @see #handleHttpMessageNotWritable
* @see #handleMethodArgumentNotValidException
* @see #handleMissingServletRequestParameter
* @see #handleMissingServletRequestPartException
* @see #handleBindException