SpringMVC

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中:

异常的处理:

在控制台打印:

图片.png

异常处理路径:最短优先原则

如果有方法抛出一个ArithmeticException异常,而该类中 有2个对应的异常处理法,那么最详细的能处理这个异常的方法会执行:

@ExceptionHandler({Exception.class  })
public ModelAndView handlerArithmeticException2(Exception e) {}

@ExceptionHandler({ArithmeticException.class  })
public ModelAndView handlerArithmeticException1(Exception e) {}

如果发生异常的方法和处理异常的方法不在同一个类之中,那么异常则不可以被捕获。

单独写一个仅仅是处理异常的类(该类加@ControllerAdvice注解,专业处理异常),它可以处理任何类中出现的异常

自定义异常的显示状态ResponseStatusExceptionResolver:自定义异常显示页面 (本类重要作用也是提供注解)@ResponseStatus

枚举类型的错误状态码

创建一个异常类,该类的错误码是注解@ResponseStatus中的value,错误信息是reason

触发的页面

图片.png

前台报错页面

如果发生异常跳转到指定的页面


    
        
        
            
                    
                        
                        
                            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

你可能感兴趣的:(SpringMVC)