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

Posted 大扑棱蛾子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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注解,因为这个注解可以让你知道你的方法要返回一个什么样的结果。

敏捷是一条很长的路,摸索着前进着!!






以上是关于利用SpringMVC拦截器控制Controller返回值的主要内容,如果未能解决你的问题,请参考以下文章

Springday05 SpringMVC访问静态资源操作请求域控制器方法返回值JSON数据交互RESTful风格文件上传异常处理拦截器

spring拦截器HandlerInterceptorAdapter,能不能控制范围?

[SSM]详解 SpringMVC 中的拦截器异常处理器与执行流程及两种配置方式

SpringMVC-拦截器

切面编程

springmvc常用注解标签详解