1. 程式人生 > >利用SpringMVC攔截器控制Controller返回值

利用SpringMVC攔截器控制Controller返回值

    背景:需求是在Controller中方法沒有實現時,返回模擬結果。主要用於專案初期前臺跟後臺的互動,Web專案就是在前臺發出請求然後後臺響應並返回結果。本示例利用攔截器和註解實現跳過執行方法直接返回定義結構的功能。

    通過定義一個StringResult註解,在訪問方法的時候返回StringResult中的內容。通過Debug註解來定義方法是否要返回StringResult中的內容。

Debug預設為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();
}
定義好註解之後寫攔截器類,攔截器需要實現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中的內容返回給前臺
				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!";
	}
}
此方法可用以在控制器中的方法沒有寫好的時候進行前臺功能的測試,思路大概如此,更加強大的功能需要各位大神們開發。這個只是我的突發奇想,並沒有實際在專案中試過。如果有人在專案中試了請告訴我效果,謝謝。

如果有人用了,建議保留StringResult註解,因為這個註解可以讓你知道你的方法要返回一個什麼樣的結果。

敏捷是一條很長的路,摸索著前進著!!