校验

开发web的过程中校验并返回错误信息,的简单操作一直是我们一直以来追求的。如何用最方便最实用的方法来校验,这里spring给我们提供了极为方便的操作。

返回提示信息

校验完第一个操作应该返回错误或提示信息,所以这里先说如何简单而又方便的返回错误信息。

  • spring提供了异常统一处理的操作。@ControllerAdvice

  • 从这里可以看到 @ControllerAdvice也注释了@Component,只要扫描它,它也会被spring自动注入。

    校验_第1张图片
    image.png

  • @ControllerAdvice 中其他注解暂时不论,主要说明一下@ExceptionHandler这个注释在方法上的注解,下面是这个注解的一个例子

  • 校验_第2张图片
    image.png
  • @ExceptionHandler 注解在方法上,提供一个默认异常来智能拦截。比如声明一个TipException异常类(继承RuntimeException);如果在运行时抛出TipException异常,会被该方法拦截到,并进行下一步的处理(返回提示信息,或错误页面)

校验_第3张图片
image.png

校验问题

既然有了@ControllerAdvice,那我们可以随时随地的抛出错误信息。接下来就是校验问题:直接在业务逻辑中写校验代码,会增加代码的难读性和逻辑的复杂性,简单的方法就是在外部写出校验,需要就调用就好。spring自带有拦截器,可是一个个方法的拦截器都需要配置;aop却是"大题小用";而且,如果需要校验的请求过多,确实有点不简明。借鉴jfinal,启发了我们是不是能在拦截器上花点功夫?

  • 预想是这样,我们只需要在所要校验的方法上,加个注释(比如叫做:@Before),给它加不同的校验类,来实现不同的校验效果。
  • 首先写一个声明,@Before,并声明它是在方法上用。
校验_第4张图片
image.png
  • 里面value值是一个校验类数组。
  • 接下来,声明一个接口BeforeInterceptor,该接口中只有一个方法,以进行校验操作。所有的校验类,必须继承该接口。
 void doOperator(HttpServletRequest request, HttpServletResponse response);
  • 紧接着,创建一个普通的spring内部拦截器,拦截所有请求。
    在preHandle 方法中,进行校验。
@Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) o;
        Method method = handlerMethod.getMethod();
        Before before = method.getAnnotation(Before.class);
        if(before != null){
            Class[] beforeList = before.value();
            for(Class oneClazz : beforeList){
                BeforeInterceptor oneEntity= applicationContext.getBean(oneClazz);
                oneEntity.doOperator(httpServletRequest,httpServletResponse); //调用方法
            }
        }
        return true;
    }
  • 而校验类只需要进行应有的操作,必要时抛出错误信息即可。
校验_第5张图片
image.png
  • 所请求的方法,只需要加@Before声明,并根据需求添加校验类。
校验_第6张图片
image.png
  • PS:根据需求可以扩展在类上加Before注解,校验其下所有请求。

Interceptor和AOP

之前觉得使用interceptor满足需求,可是参数只能为request和response,想要在interceptor阶段获取其对应方法参数的值是不可能的,因为在interceptor阶段还没有对目标方法上的参数进行初始化,仅仅只有request和response参数,所以如果应对稍微复杂点的参数,就显得更繁琐和不易维护。

所以不得不用aop来进行改进,aop可以根据目标方法的注释拦截,并也可以获得参数值,这使得这一思路有了更能扩展的活法。更新中......
-------- 2018-01-19

更新完毕:点击这里查看基于AOP的简单易用校验

你可能感兴趣的:(校验)