Spring MVC RequestMappingHandlerMapping

作者:範宗雲 来源:原创 发布时间:2015-04-06 归档:springmvc

开发环境 : JDK 7 Maven 3 Tomcat 7 Spring 4.1.5 Eclipse Luna
@RequestMapping 用于处理请求与处理方法之间的映射关系。RequestMappingHandlerMapping 负责分发请求, 它自动的查找控制器中所有的 @RequestMapping 注解, 当一个请求到来时, 它决定调用哪个方法来处理这个请求。
			<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
		      <property name="useSuffixPatternMatch" value="true" />
		      <property name="useTrailingSlashMatch" value="true" />
		      <property name="interceptors">
		        <list>
		          <bean class="org.lychie.interceptor.MethodAccessInterceptor" />
		        </list>
		      </property>
		    </bean>
			
useSuffixPatternMatch 默认为 true, 它允许 url 带后缀, 如 /user/login.html --> /user/login
useTrailingSlashMatch 默认为 true, 它允许 url 带斜杠, 如 /user/login/ --> /user/login
interceptors 配置拦截器, 要求必须实现 HandlerInterceptor 接口。
			public class MethodAccessInterceptor implements HandlerInterceptor {
			
				@Override
				public boolean preHandle(HttpServletRequest request,
						HttpServletResponse response, Object handler) throws Exception {
					System.out.println("---> preHandle");
					return true;
				}
			
				@Override
				public void postHandle(HttpServletRequest request, HttpServletResponse response, 
						Object handler, ModelAndView modelAndView) throws Exception {
					System.out.println("---> postHandle");
				}
			
				@Override
				public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
						Object handler, Exception ex) throws Exception {
					System.out.println("---> afterCompletion");
				}
				
			}
			
			@RequestMapping(value = "/domain", method = GET)
			public String domain() {
				System.out.println("---> handle method");
				return "domain";
			}
			
GET /domain
			---> preHandle
			---> handle method
			---> postHandle
			---> afterCompletion
			
请求被 MethodAccessInterceptor 截获。可以看到, HandlerInterceptor.preHandle 在处理方法执行前执行, HandlerInterceptor.postHandle 在处理方法执行后执行, 当请求处理完成后执行 HandlerInterceptor.afterCompletion。若 HandlerInterceptor.preHandle 返回 false, 则终止后续逻辑的执行。HandlerInterceptor 的这 3 个方法提供了足够的灵活性来做各种各样预处理和后处理操作。

示例代码下载