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

标签: 利用 springmvc 控制 | 发表时间:2014-09-28 19:54 | 作者:jaune161
出处:http://blog.csdn.net

    背景:需求是在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注解,因为这个注解可以让你知道你的方法要返回一个什么样的结果。

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






作者:jaune161 发表于2014-9-28 11:54:25 原文链接
阅读:20 评论:0 查看评论

相关 [利用 springmvc 控制] 推荐:

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

- - CSDN博客推荐文章
    背景:需求是在Controller中方法没有实现时,返回模拟结果. 主要用于项目初期前台跟后台的交互,Web项目就是在前台发出请求然后后台响应并返回结果. 本示例利用拦截器和注解实现跳过执行方法直接返回定义结构的功能.     通过定义一个StringResult注解,在访问方法的时候返回StringResult中的内容.

注解式控制器详解(SpringMVC强大的数据绑定)

- - 行业应用 - ITeye博客
注解式控制器详解(SpringMVC强大的数据绑定). 到目前为止,请求已经能交给我们的处理器进行处理了,接下来的事情是要进行收集数据啦,接下来我们看看我们能从请求中收集到哪些数据,如图6-11:. 1、@RequestParam绑定单个请求参数值;. 2、@PathVariable绑定URI模板变量值;.

SpringMVC传参

- - 企业架构 - ITeye博客
Spring MVC 的请求参数获取的几种方法. 通过@PathVariabl注解获取路径中传递参数. 用@ModelAttribute注解获取POST请求的FORM表单数据. 直接用HttpServletRequest获取. 用注解@RequestParam绑定请求参数a到变量a. 当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决,.

SpringMVC+ajaxfileupload上传

- - CSDN博客互联网推荐文章
看这篇的文章之前最好看一下上篇文章这样可以更好的理解. 整个项目的基本配置和上面差不多. 不同的是在webRoot文件夹下的js中引入jQuery.js 和ajaxfileupload.js. 如何没有这个两个js文件可以到各自的官网下载. DemoController.java   跳转到upload.jsp.

SpringMVC 注解配置

- - CSDN博客互联网推荐文章
在Spring项目开发中呢,最好是搞明白原理,其次装上Spring为eclipse开发的插件,这样会大大提高开发效率,而且减少了大量信息的记忆负担. SpringIDE插件,可自行到eclipse插件库中进行下载,还有其他Spring相关的plugin可以自行研究下. 当装好这个插件之后呢,可以根据向导创建一个简单的SpringMVC项目,大量的基本信息都可以自动生成,当然了是建立在明白原理的基础上,熟练了之后再去使用插件.

springmvc框架配置

- - CSDN博客编程语言推荐文章
. . .

struts1,struts2,springMVC终极对比

- - CSDN博客Web前端推荐文章
         最近做项目用到了struts2,之前一直是用struts1和springMVC. 感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比.          Struts1官方已经停止更新,现在用的也比较少,这里主要讲一下struts2和struts1比较都有哪些不同和进步.

springmvc文件上传下载

- - ITeye博客
在网上搜索的代码 参考整理了一份. commons-fileupload.jar与commons-io-1.4.jar二个文件. 1、表单属性为: enctype="multipart/form-data". 2、springmvc配置.

SpringMVC 拦截器 筛选

- - ITeye博客
 如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问. 一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件.

SpringMVC 消息转换器HttpMessageConverter

- - 企业架构 - ITeye博客
在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制. 还是回到请求-响应,也就是解析请求体,然后返回响应报文这个最基本的Http请求过程中来.