详解利用SpringMVC拦截器控制Controller返回值
背景:需求是在Controller中方法没有实现时,返回模拟结果。主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果。本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能。
通过定义一个StringResult注解,在访问方法的时候返回StringResult中的内容。通过Debug注解来定义方法是否要返回StringResult中的内容。
Debug默认为TRUE
packagecom.tiamaes.dep.annotation;
importjava.lang.annotation.Documented;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceDebug{
booleanvalue()defaulttrue;
}
packagecom.tiamaes.dep.annotation;
importjava.lang.annotation.Documented;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.lang.annotation.Target;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceStringResult{
Stringvalue();
}
定义好注解之后写拦截器类,拦截器需要实现HandlerInterceptor
packagecom.tiamaes.dep.interceptor;
importjava.io.PrintWriter;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.springframework.web.method.HandlerMethod;
importorg.springframework.web.servlet.HandlerInterceptor;
importorg.springframework.web.servlet.ModelAndView;
importcom.tiamaes.dep.annotation.Debug;
importcom.tiamaes.dep.annotation.StringResult;
publicclassDebugInterceprotimplementsHandlerInterceptor{
privatebooleandebug=true;
publicbooleanpreHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler)throwsException{
//首先判断是否是Debug模式(全局),如果否则使拦截器失效
if(!this.debug)returntrue;
if(handlerinstanceofHandlerMethod){
HandlerMethodmethod=(HandlerMethod)handler;
DebugisDebug=method.getMethodAnnotation(Debug.class);
StringResultstringResult=method.getMethodAnnotation(StringResult.class);
//如果没有@StringResult注解则跳过拦截
//判断方法上注解的Debug值,如果否则不拦截
if(stringResult==null||(isDebug!=null&&isDebug.value()==false)){
returntrue;
}else{
//拦截方法,并将stringResult中的内容返回给前台
PrintWriterout=response.getWriter();
out.print(stringResult.value());
}
}
returnfalse;
}
publicvoidpostHandle(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,
ModelAndViewmodelAndView)throwsException{
//TODOAuto-generatedmethodstub
}
publicvoidafterCompletion(HttpServletRequestrequest,
HttpServletResponseresponse,Objecthandler,Exceptionex)
throwsException{
//TODOAuto-generatedmethodstub
}
publicbooleanisDebug(){
returndebug;
}
publicvoidsetDebug(booleandebug){
this.debug=debug;
}
}
XML配置
<mvc:interceptors> <mvc:interceptor> <mvc:mappingpath="/**"/> <beanclass="com.tiamaes.dep.interceptor.DebugInterceprot"> <propertyname="debug"value="true"/> </bean> </mvc:interceptor> </mvc:interceptors>
Controller中的写法
packagecom.tiamaes.dep.system.controller;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.ResponseBody;
importcom.tiamaes.dep.annotation.Debug;
importcom.tiamaes.dep.annotation.StringResult;
@Controller
@RequestMapping("/test")
publicclassAspectTestController{
@RequestMapping("/1")
@ResponseBody
//@Debug(false)
@StringResult("Interceptor")
publicStringtest1(){
return"Thecontrollerrequest!";
}
}
此方法可用以在控制器中的方法没有写好的时候进行前台功能的测试,思路大概如此,更加强大的功能需要各位大神们开发。这个只是我的突发奇想,并没有实际在项目中试过。如果有人在项目中试了请告诉我效果,谢谢。
如果有人用了,建议保留StringResult注解,因为这个注解可以让你知道你的方法要返回一个什么样的结果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。