詳解利用SpringMVC攔截器控制Controller返回值
背景:需求是在Controller中方法沒有實(shí)現(xiàn)時(shí),返回模擬結(jié)果。主要用于項(xiàng)目初期前臺跟后臺的交互,Web項(xiàng)目就是在前臺發(fā)出請求然后后臺響應(yīng)并返回結(jié)果。本示例利用攔截器和注解實(shí)現(xiàn)跳過執(zhí)行方法直接返回定義結(jié)構(gòu)的功能。
通過定義一個(gè)StringResult注解,在訪問方法的時(shí)候返回StringResult中的內(nèi)容。通過Debug注解來定義方法是否要返回StringResult中的內(nèi)容。
Debug默認(rèn)為TRUE
package com.tiamaes.dep.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Debug {
boolean value() default true;
}
package com.tiamaes.dep.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface StringResult {
String value();
}
定義好注解之后寫攔截器類,攔截器需要實(shí)現(xiàn)HandlerInterceptor
package com.tiamaes.dep.interceptor;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.tiamaes.dep.annotation.Debug;
import com.tiamaes.dep.annotation.StringResult;
public class DebugInterceprot implements HandlerInterceptor {
private boolean debug = true;
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
//首先判斷是否是Debug模式(全局),如果否則使攔截器失效
if(!this.debug) return true;
if(handler instanceof HandlerMethod){
HandlerMethod method = (HandlerMethod)handler;
Debug isDebug = method.getMethodAnnotation(Debug.class);
StringResult stringResult = method.getMethodAnnotation(StringResult.class);
//如果沒有@StringResult注解則跳過攔截
//判斷方法上注解的Debug值,如果否則不攔截
if(stringResult==null||(isDebug !=null && isDebug.value() == false)){
return true;
}else{
//攔截方法,并將stringResult中的內(nèi)容返回給前臺
PrintWriter out = response.getWriter();
out.print(stringResult.value());
}
}
return false;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
public boolean isDebug() {
return debug;
}
public void setDebug(boolean debug) {
this.debug = debug;
}
}
XML配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.tiamaes.dep.interceptor.DebugInterceprot">
<property name="debug" value="true"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
Controller中的寫法
package com.tiamaes.dep.system.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.tiamaes.dep.annotation.Debug;
import com.tiamaes.dep.annotation.StringResult;
@Controller
@RequestMapping("/test")
public class AspectTestController {
@RequestMapping("/1")
@ResponseBody
//@Debug(false)
@StringResult("Interceptor")
public String test1(){
return "The controller request!";
}
}
此方法可用以在控制器中的方法沒有寫好的時(shí)候進(jìn)行前臺功能的測試,思路大概如此,更加強(qiáng)大的功能需要各位大神們開發(fā)。這個(gè)只是我的突發(fā)奇想,并沒有實(shí)際在項(xiàng)目中試過。如果有人在項(xiàng)目中試了請告訴我效果,謝謝。
如果有人用了,建議保留StringResult注解,因?yàn)檫@個(gè)注解可以讓你知道你的方法要返回一個(gè)什么樣的結(jié)果。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
idea打開運(yùn)行配置java?web項(xiàng)目的全過程
這篇文章主要給大家介紹了關(guān)于idea打開運(yùn)行配置java?web項(xiàng)目的相關(guān)資料,有些時(shí)候我們用IDEA跑之前用eclipse中運(yùn)行的項(xiàng)目的時(shí)候,總是不止所措,要不就是只展示html,要不就是不能部署成功,需要的朋友可以參考下2023-08-08
MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解
這篇文章主要介紹了MyBatis使用注解開發(fā)實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
關(guān)于Java中配置ElasticSearch集群環(huán)境賬號密碼的問題
這篇文章主要介紹了Java中配置ElasticSearch集群環(huán)境賬號密碼的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
spring中的注解@@Transactional失效的場景代碼演示
這篇文章主要介紹了spring中的注解@@Transactional失效的場景代碼演示,@Transactional注解是Spring框架提供的用于聲明事務(wù)的注解,作用于類和方法上,需要的朋友可以參考下2024-01-01

