转自 http://www.blogjava.net/atealxt/archive/2009/09/20/spring_mvc_annotation_interceptor_gae.html
Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子。那么基于注解风格如何使用拦截器呢?
基于注解基本上有2个可使用的定义类,分别是DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
1、DefaultAnnotationHandlerMapping
DefaultAnnotationHandlerMapping本身支持自定义拦截器,只需按如下进行配置:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="packageName.XXXInterceptor" />
</list>
</property>
</bean>
Interceptor的定义为:
public class XXXInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
String className = handler.getClass().getName();// packageName.ClassName
if (Error) {
return false;
}
return true;
}
}
2、AnnotationMethodHandlerAdapter
目前,笔者没找到如何给AnnotationMethodHandlerAdapter配置自定义Interceptor的方法,但是有个customArgumentResolver可以利用一下,来充当Interceptor。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="customArgumentResolver">
<bean class="packageName.XXXResolver"/>
</property>
</bean>
Resolver的定义为:
public class XXXResolver implements WebArgumentResolver {
@Override
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
String className = methodParameter.getMethod().getDeclaringClass().getName();// packageName.ClassName
// 如何取得Response和Request
HttpServletResponse resp = (HttpServletResponse) webRequest.getNativeResponse();
HttpServletRequest req = (HttpServletRequest) webRequest.getNativeRequest();
if (Error) {
if (!resp.isCommitted()) resp.sendError(ERROR_STATUS);
}
return UNRESOLVED;
}
}
仔细的人会看出,第二种方法其实根本不是拦截。其实第二种只是在映射Controller,调用方法的时候,给每一个方法的参数增加了一个切点。
上例在出错的时候往HttpServletResponse写错误状态,来通知web容器进行错误重定向,达到了拦截器的作用。
这么做有一个缺点,就是每个参数都有自己的切点,比如方法有3个参数就会调3次resolveArgument。为了避免出错,需要判断一下resp.isCommitted。
customArgumentResolver的初衷不是用来做Interceptor的,但有些环境却不得不使用它,比如部署在GAE上。
GAE是不支持DefaultAnnotationHandlerMapping的,因为此类用到了org.springframework.beans.BeanUtils.findEditorByConvention,这个方法会调用java.lang.ClassLoader.getSystemClassLoader,而这正是GAE所不允许的。
PS:
文中提到软件的版本:
spring - 2.5.X
google app engine - 1.2.5
参考资料
http://www.scottmurphy.info/spring_framework_annotation_based_controller_interceptors
http://groups.google.com/group/google-appengine-java/browse_thread/thread/54aadf8164be7bf0
分享到:
相关推荐
《网上书城 Spring-MVC》项目是基于Spring-MVC框架构建的一个典型电子商务平台,它展示了如何使用Spring-MVC来实现高效、灵活的Web应用程序开发。Spring-MVC是Spring框架的一部分,专门用于处理Web层的业务,提供了...
总的来说,"一个改进版的spring-mvc-showcase"项目展示了如何利用Spring MVC构建一个现代Web应用,并且可能涵盖了许多高级特性,如AOP(面向切面编程)、RESTful API设计、拦截器、数据校验、异常处理等。...
在本教程中,我们将深入探讨如何使用Spring-MVC框架来开发一个简单的项目实例。Spring-MVC是Spring框架的一个模块,专为构建Web应用程序提供模型-视图-控制器(MVC)架构支持。它使得开发者可以将业务逻辑、数据访问...
在这个过程中,Spring MVC提供了丰富的自定义点,如拦截器(Interceptor)可以扩展处理逻辑,数据绑定和验证可以确保输入的有效性,异常处理机制可以优雅地管理错误情况。 在"mdeinum-pro-spring-mvc-code"项目中,...
这个简易版的 Spring MVC 框架可能没有包含所有的特性,如拦截器、国际化、上传下载等,但它足以帮助初学者理解 Spring MVC 的基本工作原理。在实际项目中,开发者可以根据需求逐步添加和配置更多功能,以构建更复杂...
Spring MVC 是 Spring 框架的一个重要组成部分,用于构建基于模型-视图-控制器(Model-View-Controller)架构的Web应用程序。这个官方实例“spring-mvc-showcase”旨在为开发者提供一个清晰的理解和实践Spring MVC...
- `dispatcher-servlet.xml` 是 Spring MVC 的配置文件,其中定义了视图解析器、拦截器、模型-视图对以及其他组件。 4. **编写 Controller**: - 创建一个简单的 `HelloWorldController` 类,该类包含一个处理...
在Spring Boot中,通常通过`WebMvcConfigurer`或`WebMvcConfigurerAdapter`进行自定义配置,如拦截器、视图解析器、消息转换器等。 十、RESTful API 通过`@RestController`注解,可以创建RESTful服务,处理JSON或...
8. **MVC配置文件**:在Spring MVC中,通常会有一个或多个配置文件(如spring-mvc.xml)来定义组件扫描、视图解析器、拦截器等设置。 9. **Spring JDBC/ORM集成**:Spring提供了与JDBC的集成,简化了数据库操作,...
一个典型的Spring MVC应用需要配置DispatcherServlet、视图解析器、拦截器等。XML配置或Java配置都可以,现在更推荐使用Java配置,因为更直观且易于维护。 10. **单元测试与集成测试** Spring MVC提供测试支持,...
2. **配置文件**:Spring MVC的配置通常在`spring-servlet.xml`或`applicationContext.xml`文件中进行,包括视图解析器(如`InternalResourceViewResolver`)、拦截器(如`HandlerInterceptor`)、以及处理器映射器...
在 `spring-mvc-helloworld` 项目中,可能会包含一个 `web.xml` 文件来配置 DispatcherServlet。此外,还需要 Spring MVC 的配置文件(如 `servlet-context.xml`),其中定义了 Controller、视图解析器和其他组件的...
在本讨论中,我们将深入探讨两个核心组件——`spring-web.jar`和`spring-webmvc.jar`,它们在Spring MVC框架中扮演着关键角色。 首先,`spring-web.jar`是Spring框架的Web层组件,它提供了与Web相关的功能。这个库...
在Web开发中,Spring-MVC、MyBatis和MySQL的组合是常见的技术栈,它们为构建高效、可维护的Web应用程序提供了强大的支持。本实例将深入探讨这三者如何协同工作,以实现数据的增删查改(CRUD)操作。 首先,Spring-...
在 Spring MVC 中,可以通过 @ModelAttribute 注解将对象绑定到请求或响应。 3. **Controller**:控制器层,处理来自客户端的请求,调用业务逻辑,然后将结果返回给视图。控制器类通常使用 @Controller 注解标识,...
- **Spring MVC配置**:配置视图解析器、拦截器、以及RequestMapping的扫描路径。 5. **项目运行流程** - 用户发送HTTP请求到DispatcherServlet。 - DispatcherServlet查找并调用对应的Controller方法。 - ...
- **MVC配置**:通常在 `WebConfig.java` 或者 `spring-servlet.xml` 文件中配置,包括拦截器、视图解析器、转换器、格式化器等。 本项目 "spring-mvc-study" 对于初学者来说是一个很好的起点,它提供了一个基础的 ...
在 `src/main/resources` 目录下,`spring-servlet.xml` 文件是 Spring MVC 的核心配置文件,用于配置视图解析器、URL 映射、拦截器等。此外,可能还有 `web.xml` 文件,它是传统的 Servlet 容器的部署描述符,用于...
`spring-webmvc-struts.jar`是Spring框架为了与Struts框架集成而设计的一个模块,它提供了对Struts应用的Spring支持,使得开发者可以在Struts应用中利用Spring的特性,如依赖注入(DI)、面向切面编程(AOP)等。...
在实际开发中,Spring MVC提供了许多高级特性,如数据绑定、模型验证、本地化、主题支持、拦截器等,使得构建复杂的Web应用程序变得更加容易和灵活。通过深入学习和实践,你可以逐步掌握Spring MVC的更多功能,提升...